Compare commits

...

2039 Commits

Author SHA1 Message Date
Harsh Shandilya 7d831a6468 release 2024-04-02 01:25:23 +05:30
Harsh Shandilya 64ed93fd7b screemshots 2024-04-02 01:25:23 +05:30
Harsh Shandilya e2135502be fix generate script 2024-04-01 11:23:39 +05:30
Harsh Shandilya 34386f55ee . 2024-03-31 23:50:04 +05:30
Harsh Shandilya 235eeac884 moar social glazing 2024-03-31 23:06:48 +05:30
Harsh Shandilya 5c19f015bb social glazing 2024-03-31 22:39:41 +05:30
Harsh Shandilya 131a0b6b73 wtf 2024-03-31 22:34:31 +05:30
Harsh Shandilya 9a2bb213da finally release this damn post 2024-03-31 22:31:14 +05:30
Harsh Shandilya 5fefa66427 yarn no css 2024-03-31 22:27:43 +05:30
Harsh Shandilya 9fcf30ea03 fix script 2024-03-31 21:56:49 +05:30
Harsh Shandilya 8b8a84e70e quite down devshell 2024-03-31 21:51:45 +05:30
Harsh Shandilya 804542cdd1 try fixing cms 2024-03-31 21:34:45 +05:30
Harsh Shandilya 1104908534 bye bye netlify-cli 2024-03-31 17:54:40 +05:30
Harsh Shandilya 88bb52ffff . 2024-03-31 17:43:01 +05:30
Harsh Shandilya acbe260972 touch up Gradle post again 2024-03-31 17:39:10 +05:30
GitHub Actions 4f27b0c2d5 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/20bc93ca7b2158ebc99b8cef987a2173a81cde35' (2024-03-23)
  → 'github:NixOS/nixpkgs/807c549feabce7eddbf259dbdcec9e0600a0660d' (2024-03-29)
2024-03-31 06:05:23 +00:00
renovate[bot] f64762062a chore(deps): update dependency decap-cms to v3.1.6 [staging] 2024-03-29 13:07:52 +00:00
renovate[bot] 738d1a4ee1 chore(deps): update dependency decap-cms to v3.1.5 [staging] 2024-03-28 13:07:13 +00:00
renovate[bot] 6c41424cb7 chore(deps): update dependency netlify-cli to v17.21.1 [staging] 2024-03-26 15:44:39 +00:00
GitHub Actions 68b53784c6 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/bc68b058dc7e6d4d6befc4ec6c60082b6e844b7d' (2024-03-11)
  → 'github:numtide/devshell/2d45b54ca4a183f2fdcf4b19c895b64fbf620ee8' (2024-03-22)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/9af9c1c87ed3e3ed271934cb896e0cdd33dae212' (2024-03-15)
  → 'github:NixOS/nixpkgs/20bc93ca7b2158ebc99b8cef987a2173a81cde35' (2024-03-23)
2024-03-24 06:05:28 +00:00
renovate[bot] 233245d78e chore(deps): update dependency netlify-cli to v17.20.1 [staging] 2024-03-22 23:18:48 +00:00
renovate[bot] 1c9c4126bb chore(deps): update dependency netlify-cli to v17.20.0 [staging] 2024-03-21 15:59:18 +00:00
renovate[bot] 72a741a4c8 chore(deps): update dependency decap-cms to v3.1.4 [staging] 2024-03-21 10:51:01 +00:00
renovate[bot] f7464e5002 chore(deps): update dependency netlify-cli to v17.19.6 [staging] 2024-03-20 17:08:26 +00:00
renovate[bot] 08ecdb0051 chore(deps): update dependency gohugoio/hugo to v0.124.1 [staging] 2024-03-20 12:20:55 +00:00
renovate[bot] 5a14f52051 chore(deps): update dependency netlify-cli to v17.19.5 [staging] 2024-03-18 12:47:40 +00:00
GitHub Actions 0b104e29c2 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/5ddecd67edbd568ebe0a55905273e56cc82aabe3' (2024-02-26)
  → 'github:numtide/devshell/bc68b058dc7e6d4d6befc4ec6c60082b6e844b7d' (2024-03-11)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/d465f4819400de7c8d874d50b982301f28a84605' (2024-02-28)
  → 'github:numtide/flake-utils/b1d9ab70662946ef0850d488da1c9019f3a9752a' (2024-03-11)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/0e7f98a5f30166cbed344569426850b21e4091d4' (2024-03-09)
  → 'github:NixOS/nixpkgs/9af9c1c87ed3e3ed271934cb896e0cdd33dae212' (2024-03-15)
2024-03-17 06:05:30 +00:00
renovate[bot] 7e3cb07a01 chore(deps): update dependency gohugoio/hugo to v0.124.0 [staging] 2024-03-16 19:53:32 +00:00
renovate[bot] 3906e3e025 chore(deps): update dependency netlify-cli to v17.19.4 [staging] 2024-03-15 16:37:46 +00:00
renovate[bot] 4c15d6f3db chore(deps): update dependency netlify-cli to v17.19.3 [staging] 2024-03-14 20:44:03 +00:00
renovate[bot] 6a8e069da5 chore(deps): update dependency netlify-cli to v17.19.2 [staging] 2024-03-11 15:22:34 +00:00
renovate[bot] b1ec9ad83d chore(deps): update dependency netlify-cli to v17.19.1 [staging] 2024-03-11 11:57:33 +00:00
GitHub Actions 11ed25d79e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/fa9a51752f1b5de583ad5213eb621be071806663' (2024-03-02)
  → 'github:NixOS/nixpkgs/0e7f98a5f30166cbed344569426850b21e4091d4' (2024-03-09)
2024-03-10 06:05:08 +00:00
renovate[bot] 3f07e12c9a chore(deps): update dependency netlify-cli to v17.19.0 [staging] 2024-03-08 15:17:23 +00:00
Harsh Shandilya 8aa879075a fix(nix): adjust flake-compat URL 2024-03-08 16:21:10 +05:30
Harsh Shandilya f4914ebb93 chore: mark RSS layout as vendored 2024-03-08 16:19:08 +05:30
renovate[bot] a8bcf9e53a chore(deps): update dependency decap-cms to v3.1.3 [staging] 2024-03-08 10:38:40 +00:00
Harsh Shandilya a482b91329 . 2024-03-08 12:38:42 +05:30
renovate[bot] b43cc89326 chore(deps): update dependency gohugoio/hugo to v0.123.8 [staging] 2024-03-07 16:36:46 +00:00
renovate[bot] 57f983afb6 chore(deps): update dependency netlify-cli to v17.18.1 [staging] 2024-03-06 10:27:57 +00:00
renovate[bot] b3f918facb chore(deps): update dependency netlify-cli to v17.18.0 [staging] 2024-03-05 17:20:14 +00:00
renovate[bot] 1ded7533e3 chore(deps): update dependency netlify-cli to v17.17.2 [staging] 2024-03-04 15:49:37 +00:00
GitHub Actions e675ce4204 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/83cb93d6d063ad290beee669f4badf9914cc16ec' (2024-01-15)
  → 'github:numtide/devshell/5ddecd67edbd568ebe0a55905273e56cc82aabe3' (2024-02-26)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/1ef2e671c3b0c19053962c07dbda38332dcebf26' (2024-01-15)
  → 'github:numtide/flake-utils/d465f4819400de7c8d874d50b982301f28a84605' (2024-02-28)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/f63ce824cd2f036216eb5f637dfef31e1a03ee89' (2024-02-24)
  → 'github:NixOS/nixpkgs/fa9a51752f1b5de583ad5213eb621be071806663' (2024-03-02)
2024-03-03 06:06:07 +00:00
renovate[bot] c159498326 chore(deps): update dependency gohugoio/hugo to v0.123.7 [staging] 2024-03-01 18:32:41 +00:00
renovate[bot] fde85b5f43 chore(deps): update dependency gohugoio/hugo to v0.123.6 [staging] 2024-02-28 19:22:34 +00:00
renovate[bot] 1e027f9481 chore(deps): update dependency gohugoio/hugo to v0.123.4 [staging] 2024-02-26 18:45:48 +00:00
renovate[bot] 273eab265a chore(deps): update dependency netlify-cli to v17.17.1 [staging] 2024-02-26 14:29:12 +00:00
GitHub Actions 5a17f5a088 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/6e2f00c83911461438301db0dba5281197fe4b3a' (2024-02-17)
  → 'github:NixOS/nixpkgs/f63ce824cd2f036216eb5f637dfef31e1a03ee89' (2024-02-24)
2024-02-25 06:05:08 +00:00
renovate[bot] 96efe7086d chore(deps): update dependency gohugoio/hugo to v0.123.3 [staging] 2024-02-23 18:14:43 +00:00
Harsh Shandilya 3823cfef38 Merge remote-tracking branches 'origin/renovate/netlify-cli-17.x-lockfile' and 'origin/renovate/gohugoio-hugo-0.x'
* origin/renovate/netlify-cli-17.x-lockfile:
  chore(deps): update dependency netlify-cli to v17.17.0 [staging]

* origin/renovate/gohugoio-hugo-0.x:
  chore(deps): update dependency gohugoio/hugo to v0.123.2 [staging]
2024-02-22 22:57:17 +05:30
renovate[bot] a90c19e27d chore(deps): update dependency netlify-cli to v17.17.0 [staging] 2024-02-22 16:40:09 +00:00
renovate[bot] 6bf2517304 chore(deps): update dependency gohugoio/hugo to v0.123.2 [staging] 2024-02-22 16:39:43 +00:00
renovate[bot] 1ab038c103 chore(deps): update dependency decap-cms to v3.1.2 [staging] 2024-02-21 10:22:47 +00:00
renovate[bot] 2a9ef39542 chore(deps): update dependency gohugoio/hugo to v0.123.1 [staging] 2024-02-21 09:41:04 +00:00
renovate[bot] ce981e0cfb chore(deps): update dependency netlify-cli to v17.16.4 [staging] 2024-02-20 19:59:43 +00:00
renovate[bot] 5fd819bae1 chore(deps): update dependency gohugoio/hugo to v0.123.0 [staging] 2024-02-19 18:46:00 +00:00
renovate[bot] e80fa6b395 chore(deps): update dependency netlify-cli to v17.16.3 [staging] 2024-02-19 15:18:59 +00:00
GitHub Actions dc4b0f5f76 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/442d407992384ed9c0e6d352de75b69079904e4e' (2024-02-09)
  → 'github:NixOS/nixpkgs/6e2f00c83911461438301db0dba5281197fe4b3a' (2024-02-17)
2024-02-18 06:06:07 +00:00
renovate[bot] 928de9b6d0 chore(deps): update dependency netlify-cli to v17.16.2 [staging] 2024-02-13 15:12:17 +00:00
GitHub Actions 1315d58332 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/79a13f1437e149dc7be2d1290c74d378dad60814' (2024-02-03)
  → 'github:NixOS/nixpkgs/442d407992384ed9c0e6d352de75b69079904e4e' (2024-02-09)
2024-02-11 06:06:02 +00:00
Harsh Shandilya 528df83f72 prettify RSS feed 2024-02-10 00:28:20 +05:30
renovate[bot] 43088c529b chore(deps): update dependency netlify-cli to v17.16.1 [staging] 2024-02-08 19:20:37 +00:00
Harsh Shandilya b025e58d8b . 2024-02-07 12:44:09 +05:30
Harsh Shandilya 5f7567fa7e continue polish on dep sync post 2024-02-07 11:59:27 +05:30
Harsh Shandilya 3b653f42dc .
This reverts commit 69df431e48.
2024-02-06 12:11:10 +05:30
Harsh Shandilya 8c782e6734 polish dep sync post some more 2024-02-05 23:50:01 +05:30
Harsh Shandilya 5412816626 devshell: add `hyperlink` 2024-02-05 23:35:19 +05:30
Harsh Shandilya 36f796c52b add missing figures to dep sync post 2024-02-05 23:35:11 +05:30
renovate[bot] 7474d2a063 chore(deps): update dependency netlify-cli to v17.16.0 [staging] 2024-02-05 12:19:54 +00:00
renovate[bot] 16c451f372 chore(deps): update dependency prettier to v3.2.5 [staging] 2024-02-04 06:26:12 +00:00
GitHub Actions 9af6d97484 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/4fddc9be4eaf195d631333908f2a454b03628ee5' (2024-01-25)
  → 'github:NixOS/nixpkgs/79a13f1437e149dc7be2d1290c74d378dad60814' (2024-02-03)
2024-02-04 06:05:23 +00:00
Harsh Shandilya 69df431e48 . 2024-02-03 00:48:43 +05:30
Harsh Shandilya 21c75c36d8 fix(renovate): add manager for Decap CMS 2024-02-02 00:45:31 +05:30
renovate[bot] a249f43715 chore(deps): update dependency netlify-cli to v17.15.7 [staging] 2024-02-01 14:28:57 +00:00
renovate[bot] 721e184b07 chore(deps): update dependency netlify-cli to v17.15.6 [staging] 2024-01-31 10:18:06 +00:00
renovate[bot] 3c206dcdfd chore(deps): update dependency netlify-cli to v17.15.5 [staging] 2024-01-30 12:10:32 +00:00
renovate[bot] fbd626c473 chore(deps): update dependency netlify-cli to v17.15.4 [staging] 2024-01-29 17:03:54 +00:00
GitHub Actions 45f0b4e44c flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e5d1c87f5813afde2dda384ac807c57a105721cc' (2024-01-19)
  → 'github:NixOS/nixpkgs/4fddc9be4eaf195d631333908f2a454b03628ee5' (2024-01-25)
2024-01-28 06:05:13 +00:00
renovate[bot] c0a3e0426b chore(deps): update dependency gohugoio/hugo to v0.122.0 [staging] 2024-01-26 17:35:13 +00:00
renovate[bot] 9689db778d chore(deps): update dependency netlify-cli to v17.15.3 [staging] 2024-01-24 19:23:47 +00:00
renovate[bot] 149fb58f0d chore(deps): update dependency netlify-cli to v17.15.2 [staging] 2024-01-22 17:09:13 +00:00
GitHub Actions 00286ffbeb flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/d45f45b634c624d2be705973b2af3b9bec29deff' (2024-01-11)
  → 'github:numtide/devshell/83cb93d6d063ad290beee669f4badf9914cc16ec' (2024-01-15)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/4022d587cbbfd70fe950c1e2083a02621806a725' (2023-12-04)
  → 'github:numtide/flake-utils/1ef2e671c3b0c19053962c07dbda38332dcebf26' (2024-01-15)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/eabe8d3eface69f5bb16c18f8662a702f50c20d5' (2024-01-09)
  → 'github:NixOS/nixpkgs/e5d1c87f5813afde2dda384ac807c57a105721cc' (2024-01-19)
2024-01-21 06:05:41 +00:00
renovate[bot] a70179ae16 chore(deps): update dependency netlify-cli to v17.15.1 [staging] 2024-01-19 10:15:15 +00:00
Harsh Shandilya 5afae9ac87 . 2024-01-19 13:16:33 +05:30
Harsh Shandilya 6d35c46bac chore: fix flake inputs 2024-01-19 13:11:00 +05:30
renovate[bot] 172bea52c2 chore(deps): update dependency netlify-cli to v17.15.0 [staging] 2024-01-18 16:33:13 +00:00
renovate[bot] 088599a1fc chore(deps): update dependency prettier to v3.2.4 [staging] 2024-01-17 10:54:40 +00:00
Harsh Shandilya 5547195fb3 . 2024-01-17 15:30:20 +05:30
renovate[bot] e861f2ff99 chore(deps): update dependency prettier to v3.2.3 [staging] 2024-01-17 05:07:32 +00:00
renovate[bot] cb4a017cf6 chore(deps): update dependency netlify-cli to v17.14.0 [staging] 2024-01-15 17:07:08 +00:00
renovate[bot] ba76f744b6 chore(deps): update dependency prettier to v3.2.2 [staging] 2024-01-14 06:38:17 +00:00
GitHub Actions b330d96b69 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/44ddedcbcfc2d52a76b64fb6122f209881bd3e1e' (2023-12-05)
  → 'github:numtide/devshell/d45f45b634c624d2be705973b2af3b9bec29deff' (2024-01-11)
• Added input 'devshell/flake-utils':
    'github:numtide/flake-utils/4022d587cbbfd70fe950c1e2083a02621806a725' (2023-12-04)
• Added input 'devshell/flake-utils/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
• Removed input 'devshell/systems'
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/63143ac2c9186be6d9da6035fa22620018c85932' (2024-01-02)
  → 'github:NixOS/nixpkgs/eabe8d3eface69f5bb16c18f8662a702f50c20d5' (2024-01-09)
2024-01-14 06:05:42 +00:00
renovate[bot] 7a85c62117 chore(deps): update dependency prettier to v3.2.1 [staging] 2024-01-12 23:29:18 +00:00
renovate[bot] 1fea3b104c chore(deps): update dependency prettier to v3.2.0 [staging] 2024-01-12 16:37:47 +00:00
renovate[bot] c6d4588b6f chore(deps): update dependency netlify-cli to v17.13.2 [staging] 2024-01-12 12:13:16 +00:00
renovate[bot] 43f67ea28a chore(deps): update dependency netlify-cli to v17.13.1 [staging] 2024-01-11 14:35:46 +00:00
renovate[bot] c9ec47e8d5 chore(deps): update dependency netlify-cli to v17.13.0 [staging] 2024-01-09 17:31:11 +00:00
GitHub Actions 1ec031d489 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870' (2023-12-25)
  → 'github:NixOS/nixpkgs/63143ac2c9186be6d9da6035fa22620018c85932' (2024-01-02)
2024-01-07 06:05:32 +00:00
renovate[bot] c8aa00958c chore(deps): update dependency gohugoio/hugo to v0.121.2 [staging] 2024-01-05 14:15:06 +00:00
renovate[bot] 817ab5605f chore(deps): update dependency netlify-cli to v17.11.1 [staging] 2024-01-05 10:47:47 +00:00
renovate[bot] 4390d12d5c chore(deps): update dependency netlify-cli to v17.11.0 [staging] 2024-01-02 16:46:37 +00:00
Harsh Shandilya 7dd9704c66 . 2024-01-02 21:17:16 +05:30
Harsh Shandilya d4ede49731 polish dependency sync post a bit more 2024-01-02 01:38:27 +05:30
GitHub Actions 594acc8a75 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/d6863cbcbbb80e71cecfc03356db1cda38919523' (2023-12-21)
  → 'github:NixOS/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870' (2023-12-25)
2023-12-31 06:05:18 +00:00
renovate[bot] a1da64868f chore(deps): update dependency netlify-cli to v17.10.2 [staging] 2023-12-29 15:04:30 +00:00
GitHub Actions 61ed605e65 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/aa9d4729cbc99dabacb50e3994dcefb3ea0f7447' (2023-12-14)
  → 'github:NixOS/nixpkgs/d6863cbcbbb80e71cecfc03356db1cda38919523' (2023-12-21)
2023-12-24 06:05:40 +00:00
Harsh Shandilya 3c2c994cfc . 2023-12-19 02:26:00 +05:30
GitHub Actions 7a3493715e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/29558c0722ffd40ff625256e16259168b7c03ed1' (2023-12-09)
  → 'github:NixOS/nixpkgs/aa9d4729cbc99dabacb50e3994dcefb3ea0f7447' (2023-12-14)
2023-12-17 06:05:28 +00:00
Harsh Shandilya 957c6347ed chore: finish up dependency sync post :fingers-crossed: 2023-12-14 18:17:05 +05:30
Harsh Shandilya a951283bc7 fix: add missing `doCheck` 2023-12-12 20:00:41 +05:30
Harsh Shandilya af7f96a269 chore: fix code example 2023-12-12 19:57:04 +05:30
Harsh Shandilya 2423b3806e chore: refresh about page 2023-12-12 19:51:41 +05:30
Harsh Shandilya f2fdced800 chore: add page bundles to ignore-revs 2023-12-11 12:18:12 +05:30
Harsh Shandilya 680ff2851c chore: try out page bundles 2023-12-11 12:17:32 +05:30
Harsh Shandilya 2b4e7756c3 Flesh out links in gradle sync post 2023-12-11 12:14:49 +05:30
Harsh Shandilya f2468c0c97 config: link my Gitea for funsies 2023-12-11 12:04:50 +05:30
Harsh Shandilya e78a15c0ec config: explicitly set what sites get share buttons 2023-12-11 11:57:18 +05:30
Harsh Shandilya 67c6f1354e config: correct edit url 2023-12-11 11:52:02 +05:30
Harsh Shandilya ebd0d55674 chore: bump PaperMod 2023-12-11 11:23:15 +05:30
renovate[bot] 4d003d9828 chore(deps): update dependency prettier to v3.1.1 [staging] 2023-12-10 09:31:51 +00:00
GitHub Actions 07dd539dab flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/7ad1c417c87e98e56dcef7ecd0e0a2f2e5669d51' (2023-11-24)
  → 'github:numtide/devshell/44ddedcbcfc2d52a76b64fb6122f209881bd3e1e' (2023-12-05)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/ff7b65b44d01cf9ba6a71320833626af21126384' (2023-09-12)
  → 'github:numtide/flake-utils/4022d587cbbfd70fe950c1e2083a02621806a725' (2023-12-04)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/f5c27c6136db4d76c30e533c20517df6864c46ee' (2023-11-30)
  → 'github:NixOS/nixpkgs/29558c0722ffd40ff625256e16259168b7c03ed1' (2023-12-09)
2023-12-10 06:05:23 +00:00
Harsh Shandilya 567c56045a Update Blog “improving-dependency-sync-speeds-for-your-gradle-project” 2023-12-09 14:46:15 +00:00
renovate[bot] 1e5924e580 chore(deps): update dependency netlify-cli to v17.10.1 [staging] 2023-12-08 15:39:53 +00:00
renovate[bot] d87363eb22 chore(deps): update dependency gohugoio/hugo to v0.121.1 [staging] 2023-12-08 12:43:25 +00:00
Harsh Shandilya 4c3e7bd057 Update Blog “using-containers-in-nixos” 2023-12-08 11:27:44 +00:00
renovate[bot] c8cd5fa864 chore(deps): update dependency netlify-cli to v17.10.0 [staging] 2023-12-06 21:45:34 +00:00
renovate[bot] e67df85c00 chore(deps): update actions/setup-go action to v5 [staging] 2023-12-06 16:08:11 +00:00
renovate[bot] 925557e9fe chore(deps): update dependency gohugoio/hugo to v0.121.0 [staging] 2023-12-05 18:25:10 +00:00
Harsh Shandilya d2ee7a6362 Create Blog “using-containers-in-nixos” 2023-12-05 05:45:52 +00:00
renovate[bot] d95d4e9747 chore(deps): update dependency netlify-cli to v17.9.0 [staging] 2023-12-04 11:06:02 +00:00
GitHub Actions f525d7a7e3 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/0bd59c54ef06bc34eca01e37d689f5e46b3fe2f1' (2023-11-24)
  → 'github:NixOS/nixpkgs/f5c27c6136db4d76c30e533c20517df6864c46ee' (2023-11-30)
2023-12-03 06:05:53 +00:00
renovate[bot] 6befd3cedf chore(deps): update dependency netlify-cli to v17.8.1 [staging] 2023-11-28 23:23:26 +00:00
GitHub Actions 4e0f6be0ea flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/1aed986e3c81a4f6698e85a7452cbfcc4b31a36e' (2023-10-27)
  → 'github:numtide/devshell/7ad1c417c87e98e56dcef7ecd0e0a2f2e5669d51' (2023-11-24)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/7414e9ee0b3e9903c24d3379f577a417f0aae5f1' (2023-11-16)
  → 'github:NixOS/nixpkgs/0bd59c54ef06bc34eca01e37d689f5e46b3fe2f1' (2023-11-24)
2023-11-26 06:05:23 +00:00
renovate[bot] 8065bda4ab chore(deps): update dependency netlify-cli to v17.7.0 [staging] 2023-11-23 18:19:20 +00:00
renovate[bot] cf8266c50e chore(deps): update dependency netlify-cli to v17.6.0 [staging] 2023-11-21 15:10:05 +00:00
renovate[bot] 33b0a9cec4 chore(deps): update dependency netlify-cli to v17.5.3 [staging] 2023-11-20 20:15:05 +00:00
renovate[bot] 00d5b51f36 chore(deps): update dependency netlify-cli to v17.5.2 [staging] 2023-11-20 13:56:50 +00:00
Harsh Shandilya 7301d72676 netlify: require Node 18 for builds 2023-11-20 10:41:46 +05:30
Harsh Shandilya 76308d3a3f bump PaperMod 2023-11-20 10:35:20 +05:30
GitHub Actions 776501bee8 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/1f37660f64a850233baab512c9b9bd83fb72be57' (2023-11-09)
  → 'github:NixOS/nixpkgs/7414e9ee0b3e9903c24d3379f577a417f0aae5f1' (2023-11-16)
2023-11-19 06:05:17 +00:00
renovate[bot] ae61894ff8 chore(deps): update dependency netlify-cli to v17.5.1 [staging] 2023-11-17 14:00:24 +00:00
renovate[bot] caaec88b01 chore(deps): update dependency netlify-cli to v17.4.0 [staging] 2023-11-16 16:55:20 +00:00
renovate[bot] 3addfc70b5 chore(deps): update dependency netlify-cli to v17.3.2 [staging] 2023-11-15 14:17:55 +00:00
renovate[bot] 5691f900d4 chore(deps): update dependency netlify-cli to v17.3.1 [staging] 2023-11-14 17:33:12 +00:00
renovate[bot] 17b054ced6 chore(deps): update dependency prettier to v3.1.0 [staging] 2023-11-13 04:57:34 +00:00
GitHub Actions 108df2eac6 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e583a3b08f2b59488deb2ace2528df37c931509f' (2023-11-04)
  → 'github:NixOS/nixpkgs/1f37660f64a850233baab512c9b9bd83fb72be57' (2023-11-09)
2023-11-12 06:05:28 +00:00
renovate[bot] e14d11c94d chore(deps): update dependency netlify-cli to v17.2.2 [staging] 2023-11-10 12:26:42 +00:00
renovate[bot] dc4d95ba29 chore(deps): update dependency netlify-cli to v17.2.1 [staging] 2023-11-09 11:05:18 +00:00
renovate[bot] b0906fcc93 chore(deps): update dependency netlify-cli to v17.2.0 [staging] 2023-11-08 19:35:38 +00:00
renovate[bot] 9ed9dc7aeb chore(deps): update dependency gohugoio/hugo to v0.120.4 [staging] 2023-11-08 14:00:15 +00:00
renovate[bot] d6d3832de5 chore(deps): update dependency netlify-cli to v17.1.0 [staging] 2023-11-07 15:02:22 +00:00
GitHub Actions 7d0bac32b0 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/808c0d8c53c7ae50f82aca8e7df263225cf235bf' (2023-10-26)
  → 'github:NixOS/nixpkgs/e583a3b08f2b59488deb2ace2528df37c931509f' (2023-11-04)
2023-11-05 06:05:24 +00:00
renovate[bot] c57f9c0299 chore(deps): update dependency netlify-cli to v17.0.1 [staging] 2023-11-02 17:32:52 +00:00
renovate[bot] 165e909ded chore(deps): update dependency gohugoio/hugo to v0.120.3 [staging] 2023-11-01 18:30:31 +00:00
renovate[bot] edcb3ae66c chore(deps): update dependency netlify-cli to v17 [staging] 2023-11-01 14:02:24 +00:00
renovate[bot] 3dba35c107 chore(deps): update dependency gohugoio/hugo to v0.120.2 [staging] 2023-10-31 18:48:04 +00:00
renovate[bot] 9988c38ca4 chore(deps): update dependency gohugoio/hugo to v0.120.1 [staging] 2023-10-30 19:11:42 +00:00
GitHub Actions 045c079606 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/cd4e2fda3150dd2f689caeac07b7f47df5197c31' (2023-09-29)
  → 'github:numtide/devshell/1aed986e3c81a4f6698e85a7452cbfcc4b31a36e' (2023-10-27)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/51d906d2341c9e866e48c2efcaac0f2d70bfd43e' (2023-10-21)
  → 'github:NixOS/nixpkgs/808c0d8c53c7ae50f82aca8e7df263225cf235bf' (2023-10-26)
2023-10-29 06:05:37 +00:00
renovate[bot] 0bbc158e0e chore(deps): update dependency netlify-cli to v16.9.3 [staging] 2023-10-27 22:14:53 +00:00
Harsh Shandilya 7ed6298d71 netlify: allow build command to be set on dashboard 2023-10-25 12:48:46 +05:30
Harsh Shandilya d2303ac2e7 Update Blog “using-retrofit-to-disguise-scraping-as-a-rest-api” 2023-10-24 18:38:21 +00:00
renovate[bot] d246fc7745 chore(deps): update dependency netlify-cli to v16.9.2 [staging] 2023-10-24 16:42:46 +00:00
Harsh Shandilya 2244358ac0 admin: update to decap-cms 3.1.0-beta.0 2023-10-24 16:36:07 +05:30
GitHub Actions e075d09318 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/01441e14af5e29c9d27ace398e6dd0b293e25a54' (2023-10-11)
  → 'github:NixOS/nixpkgs/51d906d2341c9e866e48c2efcaac0f2d70bfd43e' (2023-10-21)
2023-10-22 06:05:22 +00:00
renovate[bot] 35012ae204 chore(deps): update dependency netlify-cli to v16.9.1 [staging] 2023-10-20 22:07:52 +00:00
renovate[bot] a76f3f1378 chore(deps): update dependency netlify-cli to v16.9.0 [staging] 2023-10-19 20:29:20 +00:00
renovate[bot] 71e3ae0e7e chore(deps): update actions/checkout digest to b4ffde6 [staging] 2023-10-19 10:22:41 +00:00
renovate[bot] fd810d406c chore(deps): update dependency netlify-cli to v16.8.0 [staging] 2023-10-17 12:16:08 +00:00
GitHub Actions 1d7eb04e4b flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/945559664c1dc5836173ee12896ba421d9b37181' (2023-10-07)
  → 'github:NixOS/nixpkgs/01441e14af5e29c9d27ace398e6dd0b293e25a54' (2023-10-11)
2023-10-15 06:05:24 +00:00
renovate[bot] e19e8ad534 chore(deps): update dependency netlify-cli to v16.7.0 [staging] 2023-10-12 19:29:49 +00:00
renovate[bot] 1e4e6ebf9c chore(deps): update dependency netlify-cli to v16.6.2 [staging] 2023-10-12 13:53:04 +00:00
renovate[bot] 488196e9a3 chore(deps): update dependency netlify-cli to v16.6.1 [staging] 2023-10-10 19:50:21 +00:00
GitHub Actions aeb925a6d5 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/bd9b686c0168041aea600222be0805a0de6e6ab8' (2023-09-29)
  → 'github:NixOS/nixpkgs/945559664c1dc5836173ee12896ba421d9b37181' (2023-10-07)
2023-10-08 06:05:16 +00:00
Harsh Shandilya 9a4b8e6cc9 Fix Netlify overriding robots.txt 2023-10-06 21:29:58 +05:30
renovate[bot] a11b4670f6 chore(deps): update dependency netlify-cli to v16.5.1 [staging] 2023-10-03 10:36:01 +00:00
renovate[bot] 093199135e chore(deps): update dependency netlify-cli to v16.5.0 [staging] 2023-10-02 15:48:46 +00:00
GitHub Actions f40ddd7873 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/05d40d17bf3459606316e3e9ec683b784ff28f16' (2023-09-20)
  → 'github:numtide/devshell/cd4e2fda3150dd2f689caeac07b7f47df5197c31' (2023-09-29)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e12483116b3b51a185a33a272bf351e357ba9a99' (2023-09-21)
  → 'github:NixOS/nixpkgs/bd9b686c0168041aea600222be0805a0de6e6ab8' (2023-09-29)
2023-10-01 06:05:17 +00:00
Harsh Shandilya 9ed727bb6c Block AI scrapers 2023-09-30 01:12:26 +05:30
renovate[bot] 1623189556 chore(deps): update dependency gohugoio/hugo to v0.119.0 [staging] 2023-09-24 16:14:27 +00:00
GitHub Actions f9e37a7190 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/f26c2e05cd766be3750dd3d6e276650a1eab4c61' (2023-09-16)
  → 'github:numtide/devshell/05d40d17bf3459606316e3e9ec683b784ff28f16' (2023-09-20)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/46688f8eb5cd6f1298d873d4d2b9cf245e09e88e' (2023-09-15)
  → 'github:NixOS/nixpkgs/e12483116b3b51a185a33a272bf351e357ba9a99' (2023-09-21)
2023-09-24 06:05:25 +00:00
renovate[bot] c1bde14bc7 chore(deps): update actions/checkout digest to 8ade135 [staging] 2023-09-22 18:29:01 +00:00
renovate[bot] ee26dffcb6 chore(deps): update dependency netlify-cli to v16.4.2 [staging] 2023-09-21 14:11:11 +00:00
renovate[bot] 88649d0446 chore(deps): update dependency netlify-cli to v16.4.1 [staging] 2023-09-20 12:44:37 +00:00
renovate[bot] bab50df2da chore(deps): update dependency netlify-cli to v16.4.0 [staging] 2023-09-19 11:52:49 +00:00
renovate[bot] 0e67c30dd6 chore(deps): update dependency netlify-cli to v16.3.6 [staging] 2023-09-18 19:51:35 +00:00
renovate[bot] f88c2b2066 chore(deps): update dependency netlify-cli to v16.3.5 [staging] 2023-09-18 13:23:11 +00:00
GitHub Actions f5eb7dae63 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/65114ea495a8d3cc1352368bf170d67ef005aa5a' (2023-09-04)
  → 'github:numtide/devshell/f26c2e05cd766be3750dd3d6e276650a1eab4c61' (2023-09-16)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/f9e7cf818399d17d347f847525c5a5a8032e4e44' (2023-08-23)
  → 'github:numtide/flake-utils/ff7b65b44d01cf9ba6a71320833626af21126384' (2023-09-12)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/9108a20782535741433c304f6a4376cb8b364b89' (2023-09-09)
  → 'github:NixOS/nixpkgs/46688f8eb5cd6f1298d873d4d2b9cf245e09e88e' (2023-09-15)
2023-09-17 06:05:21 +00:00
renovate[bot] 40aec4baf5 chore(deps): update dependency netlify-cli to v16.3.3 [staging] 2023-09-15 16:18:39 +00:00
renovate[bot] b5936fbae2 chore(deps): update dependency netlify-cli to v16.3.2 [staging] 2023-09-13 16:53:54 +00:00
Harsh Shandilya e5d52c4054 Create Blog “improving-dependency-sync-speeds-for-your-gradle-project” 2023-09-13 07:27:08 +00:00
Harsh Shandilya 454e11249e Update Blog “using-retrofit-to-disguise-scraping-as-a-rest-api” 2023-09-13 07:23:21 +00:00
GitHub Actions e74fd88f89 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/2aa26972b951bc05c3632d4e5ae683cb6771a7c6' (2023-08-23)
  → 'github:numtide/devshell/65114ea495a8d3cc1352368bf170d67ef005aa5a' (2023-09-04)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/e7f35e03abd06a2faef6684d0de813370e13bda8' (2023-09-02)
  → 'github:NixOS/nixpkgs/9108a20782535741433c304f6a4376cb8b364b89' (2023-09-09)
2023-09-10 06:05:10 +00:00
renovate[bot] a8722f5919 chore(deps): update dependency netlify-cli to v16.3.1 [staging] 2023-09-06 12:38:09 +00:00
renovate[bot] 218250fa4a chore(deps): update actions/checkout action to v4 [staging] 2023-09-04 14:03:26 +00:00
GitHub Actions 91bd9bdf6e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/c66ccfa00c643751da2fd9290e096ceaa30493fc' (2023-08-26)
  → 'github:NixOS/nixpkgs/e7f35e03abd06a2faef6684d0de813370e13bda8' (2023-09-02)
2023-09-03 06:05:04 +00:00
Harsh Shandilya 2f334e33b5 Create Blog “using-retrofit-to-disguise-scraping-as-a-rest-api” 2023-09-02 21:39:51 +00:00
renovate[bot] 1ed57c68d5 chore(deps): update dependency gohugoio/hugo to v0.118.2 [staging] 2023-08-31 12:08:00 +00:00
renovate[bot] 2de50b2b43 chore(deps): update dependency prettier to v3.0.3 [staging] 2023-08-29 12:53:59 +00:00
renovate[bot] 606f318419 chore(deps): update dependency netlify-cli to v16.2.0 [staging] 2023-08-29 08:12:42 +00:00
GitHub Actions 8c54b2c0fb flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205' (2023-07-03)
  → 'github:numtide/devshell/2aa26972b951bc05c3632d4e5ae683cb6771a7c6' (2023-08-23)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/919d646de7be200f3bf08cb76ae1f09402b6f9b4' (2023-07-11)
  → 'github:numtide/flake-utils/f9e7cf818399d17d347f847525c5a5a8032e4e44' (2023-08-23)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/3476a10478587dec90acb14ec6bde0966c545cc0' (2023-08-20)
  → 'github:NixOS/nixpkgs/c66ccfa00c643751da2fd9290e096ceaa30493fc' (2023-08-26)
2023-08-27 06:05:12 +00:00
renovate[bot] ef8bffd318 chore(deps): update actions/checkout digest to f43a0e5 [staging] 2023-08-24 16:51:57 +00:00
Harsh Shandilya 09d20d713e admin: migrate to Decap CMS
Decap is backwards compatible with Netlify CMS as it is a continuation of the project.
2023-08-23 21:32:02 +05:30
GitHub Actions b0ccc66ba5 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/f0451844bbdf545f696f029d1448de4906c7f753' (2023-08-12)
  → 'github:NixOS/nixpkgs/3476a10478587dec90acb14ec6bde0966c545cc0' (2023-08-20)
2023-08-20 06:05:08 +00:00
renovate[bot] 029164c6af chore(deps): update dependency netlify-cli to v16.1.0 [staging] 2023-08-17 13:21:58 +00:00
renovate[bot] 0f84ed6f85 chore(deps): update dependency prettier to v3.0.2 [staging] 2023-08-15 16:00:58 +00:00
renovate[bot] bb10df2e08 chore(deps): update dependency netlify-cli to v16.0.3 [staging] 2023-08-14 15:59:04 +00:00
GitHub Actions 2349b19133 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/0d2fb29f5071a12d7983319c2c2576be6a130582' (2023-08-05)
  → 'github:NixOS/nixpkgs/f0451844bbdf545f696f029d1448de4906c7f753' (2023-08-12)
2023-08-13 06:05:08 +00:00
renovate[bot] b2d2be66f7 chore(deps): update dependency netlify-cli to v16.0.2 [staging] 2023-08-11 16:15:12 +00:00
renovate[bot] 7e4ee50e8c chore(deps): update dependency netlify-cli to v16.0.1 [staging] 2023-08-10 18:58:41 +00:00
renovate[bot] e311b069be chore(deps): update dependency netlify-cli to v16 [staging] 2023-08-10 17:09:43 +00:00
renovate[bot] 62a0906950 chore(deps): update actions/setup-go digest to 93397be [staging] 2023-08-08 13:15:48 +00:00
renovate[bot] dbfe3801c6 chore(deps): update dependency netlify-cli to v15.11.0 [staging] 2023-08-07 20:07:21 +00:00
renovate[bot] cc8d4206ec chore(deps): update dependency gohugoio/hugo to v0.117.0 [staging] 2023-08-07 16:25:01 +00:00
GitHub Actions b72b0d895e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/d2b52322f35597c62abf56de91b0236746b2a03d' (2023-07-29)
  → 'github:NixOS/nixpkgs/0d2fb29f5071a12d7983319c2c2576be6a130582' (2023-08-05)
2023-08-06 06:05:23 +00:00
Harsh Shandilya e66a175faf Update PaperMod 2023-08-04 02:15:07 +05:30
renovate[bot] 07c3529712 chore(deps): update dependency prettier to v3.0.1 [staging] 2023-08-03 06:56:45 +00:00
renovate[bot] d081ad74f0 chore(deps): update dependency gohugoio/hugo to v0.116.1 [staging] 2023-08-01 09:34:17 +00:00
renovate[bot] 42b98c72b9 chore(deps): update dependency netlify-cli to v15.10.0 [staging] 2023-07-31 17:06:12 +00:00
renovate[bot] 85ad11f17c chore(deps): update dependency gohugoio/hugo to v0.116.0 [staging] 2023-07-31 12:57:03 +00:00
GitHub Actions f0f516ce9a flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/f465da166263bc0d4b39dfd4ca28b777c92d4b73' (2023-07-22)
  → 'github:NixOS/nixpkgs/d2b52322f35597c62abf56de91b0236746b2a03d' (2023-07-29)
2023-07-30 06:05:05 +00:00
Harsh Shandilya d3b13c78fa Use auto theme 2023-07-24 15:33:18 +05:30
GitHub Actions e2a0fcc995 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/46ed466081b9cad1125b11f11a2af5cc40b942c7' (2023-07-15)
  → 'github:NixOS/nixpkgs/f465da166263bc0d4b39dfd4ca28b777c92d4b73' (2023-07-22)
2023-07-23 06:05:07 +00:00
renovate[bot] 173276745d chore(deps): update dependency gohugoio/hugo to v0.115.4 [staging] 2023-07-20 10:10:07 +00:00
renovate[bot] 689098346a chore(deps): update dependency netlify-cli to v15.9.1 [staging] 2023-07-19 12:08:15 +00:00
GitHub Actions b7d28f9b84 flake.lock: Update
Flake lock file updates:

• Updated input 'flake-utils':
    'github:numtide/flake-utils/dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7' (2023-06-25)
  → 'github:numtide/flake-utils/919d646de7be200f3bf08cb76ae1f09402b6f9b4' (2023-07-11)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/ed6afb10dfdfc97b6bcf0703f1bad8118e9e961b' (2023-07-08)
  → 'github:NixOS/nixpkgs/46ed466081b9cad1125b11f11a2af5cc40b942c7' (2023-07-15)
2023-07-16 06:05:28 +00:00
renovate[bot] ecf5ff2aa7 chore(deps): update dependency gohugoio/hugo to v0.115.3 [staging] 2023-07-13 18:27:35 +00:00
renovate[bot] b4771280f3 chore(deps): update dependency netlify-cli to v15.9.0 [staging] 2023-07-12 15:02:05 +00:00
Harsh Shandilya 8d459dad0b config: direct to `/posts/` feed from homepage 2023-07-11 10:45:44 +05:30
Harsh Shandilya 90773292d7 refactor: update RSS output template 2023-07-10 17:34:19 +05:30
Harsh Shandilya c19eebe361 chore: update PaperMod 2023-07-10 17:20:52 +05:30
GitHub Actions 9f94866af7 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/3864857b2754ab0e16c7c7c626f0e5a1d4e42f38' (2023-06-28)
  → 'github:numtide/devshell/f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205' (2023-07-03)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/8277b539d371bf4308fc5097911aa58bfac1794f' (2023-07-01)
  → 'github:NixOS/nixpkgs/ed6afb10dfdfc97b6bcf0703f1bad8118e9e961b' (2023-07-08)
2023-07-09 06:05:13 +00:00
renovate[bot] 4ddf61a85b chore(deps): update dependency gohugoio/hugo to v0.115.2 [staging] 2023-07-08 19:29:26 +00:00
renovate[bot] 018a557b2a chore(deps): update dependency netlify-cli to v15.8.1 [staging] 2023-07-06 20:35:20 +00:00
Harsh Shandilya bf25fb1130 chore: reformat Nix files with alejandra 2023-07-06 18:06:57 +05:30
renovate[bot] 11392d1035 chore(deps): update dependency prettier to v3 [staging] 2023-07-05 15:30:22 +00:00
renovate[bot] cd2599460c chore(deps): update dependency gohugoio/hugo to v0.115.1 [staging] 2023-07-03 23:08:34 +00:00
GitHub Actions c42b0c975a flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/3c614fbc76fc152f3e1bc4b2263da6d90adf80fb' (2023-06-30)
  → 'github:NixOS/nixpkgs/8277b539d371bf4308fc5097911aa58bfac1794f' (2023-07-01)
2023-07-02 06:05:29 +00:00
Harsh Shandilya 3be64ba51c feat(nix): adopt nix-systems
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/2cf83bb31720fcc29a999aee28d6da101173e66a' (2023-06-19)
  → 'github:numtide/devshell/3864857b2754ab0e16c7c7c626f0e5a1d4e42f38' (2023-06-28)
• Updated input 'devshell/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
  → follows 'systems'
• Updated input 'flake-compat':
    'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17)
  → 'github:nix-community/flake-compat/8bf105319d44f6b9f0d764efa4fdef9f1cc9ba1c' (2023-06-29)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/abfb11bd1aec8ced1c9bb9adfe68018230f4fb3c' (2023-06-19)
  → 'github:numtide/flake-utils/dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7' (2023-06-25)
• Updated input 'flake-utils/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
  → follows 'systems'
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3d8a93602bc54ece7a4e689d9aea1a574e2bbc24' (2023-06-23)
  → 'github:NixOS/nixpkgs/3c614fbc76fc152f3e1bc4b2263da6d90adf80fb' (2023-06-30)
• Added input 'systems':
    'github:msfjarvis/flake-systems/7876462a5f60841e8b2712ad20dc18470f448e8d' (2023-06-25)
2023-07-01 20:30:53 +05:30
Harsh Shandilya e8f413dd2d chore: refresh resume 2023-07-01 20:27:47 +05:30
renovate[bot] 64feb97411 chore(deps): update dependency netlify-cli to v15.8.0 [staging] (#60)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-01 11:17:13 +05:30
renovate[bot] 5b01a61d83 chore(deps): update dependency gohugoio/hugo to v0.115.0 [staging] 2023-06-29 19:43:51 +00:00
renovate[bot] 81baccf247 chore(deps): update dependency netlify-cli to v15.7.0 [staging] 2023-06-27 15:18:04 +00:00
GitHub Actions 5d819106a3 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/fd6223370774dd9c33354e87a007004b5fd36442' (2023-06-13)
  → 'github:numtide/devshell/2cf83bb31720fcc29a999aee28d6da101173e66a' (2023-06-19)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/a1720a10a6cfe8234c0e93907ffe81be440f4cef' (2023-05-31)
  → 'github:numtide/flake-utils/abfb11bd1aec8ced1c9bb9adfe68018230f4fb3c' (2023-06-19)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/2c09e8eb8717e240ef9c5727c1cc9186db9fb309' (2023-06-17)
  → 'github:nixos/nixpkgs/3d8a93602bc54ece7a4e689d9aea1a574e2bbc24' (2023-06-23)
2023-06-25 06:05:12 +00:00
renovate[bot] 7f9c2e3031 chore(deps): update dependency gohugoio/hugo to v0.114.1 [staging] 2023-06-23 14:00:17 +00:00
renovate[bot] 1843638833 chore(deps): lock file maintenance [staging] 2023-06-21 01:38:34 +00:00
renovate[bot] d99238dd36 chore(deps): update dependency gohugoio/hugo to v0.114.0 [staging] 2023-06-19 20:13:40 +00:00
GitHub Actions 04f13b3f8b flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/6b2554d28d46bfa6e24b941e999a145760dad0e1' (2023-06-05)
  → 'github:numtide/devshell/fd6223370774dd9c33354e87a007004b5fd36442' (2023-06-13)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/a30520bf8eabf8a5c37889d661e67a2dbcaa59e6' (2023-06-10)
  → 'github:nixos/nixpkgs/2c09e8eb8717e240ef9c5727c1cc9186db9fb309' (2023-06-17)
2023-06-18 06:05:25 +00:00
renovate[bot] bc4540c0b2 chore(deps): update dependency netlify-cli to v15.6.0 [staging] 2023-06-14 17:32:49 +00:00
renovate[bot] 45ce4f3802 chore(deps): update dependency netlify-cli to v15.5.1 [staging] 2023-06-13 17:20:51 +00:00
Harsh Shandilya 4632f50c2a fix(flakes): add back JS tooling 2023-06-13 16:07:26 +05:30
renovate[bot] 9bf7ca93a7 chore(deps): update dependency netlify-cli to v15.4.2 [staging] 2023-06-12 16:05:32 +00:00
GitHub Actions 04d3491a8a flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/5143ea68647c4cf5227e4ad2100db6671fc4c369' (2023-05-09)
  → 'github:numtide/devshell/6b2554d28d46bfa6e24b941e999a145760dad0e1' (2023-06-05)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/ed7bbf16855a9ec919e5c6372ba3a297ec1df550' (2023-06-03)
  → 'github:nixos/nixpkgs/a30520bf8eabf8a5c37889d661e67a2dbcaa59e6' (2023-06-10)
2023-06-11 06:05:02 +00:00
renovate[bot] fe6d1d96e7 chore(deps): lock file maintenance [staging] (#59)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-11 09:48:30 +05:30
renovate[bot] c9bf6d8c0e chore(deps): update actions/checkout digest to c85c95e [staging] 2023-06-09 17:38:01 +00:00
renovate[bot] dc560b3694 chore(deps): update dependency netlify-cli to v15.4.1 [staging] 2023-06-08 14:30:26 +00:00
renovate[bot] 7939d1fb6b chore(deps): update dependency netlify-cli to v15.4.0 [staging] 2023-06-07 14:05:20 +00:00
renovate[bot] 24e868c66b chore(deps): update dependency gohugoio/hugo to v0.113.0 [staging] 2023-06-05 18:07:05 +00:00
GitHub Actions b0eabca347 flake.lock: Update
Flake lock file updates:

• Updated input 'flake-utils':
    'github:numtide/flake-utils/cfacdce06f30d2b68473a46042957675eebb3401' (2023-04-11)
  → 'github:numtide/flake-utils/a1720a10a6cfe8234c0e93907ffe81be440f4cef' (2023-05-31)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/aeb75dba965e790de427b73315d5addf91a54955' (2023-05-25)
  → 'github:nixos/nixpkgs/ed7bbf16855a9ec919e5c6372ba3a297ec1df550' (2023-06-03)
2023-06-04 06:05:10 +00:00
renovate[bot] 139ec85450 chore(deps): update dependency netlify-cli to v15.3.1 [staging] 2023-06-02 19:59:47 +00:00
renovate[bot] 06624abad3 chore(deps): update dependency gohugoio/hugo to v0.112.7 [staging] 2023-06-02 17:21:19 +00:00
renovate[bot] 97c3e98361 chore(deps): update dependency gohugoio/hugo to v0.112.5 [staging] 2023-05-29 09:53:20 +00:00
renovate[bot] aab69b5ab7 chore(deps): update dependency gohugoio/hugo to v0.112.4 [staging] 2023-05-28 13:49:44 +00:00
GitHub Actions 846d8ce2e7 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/eea79d584eff53bf7a76aeb63f8845da6d386129' (2023-05-20)
  → 'github:nixos/nixpkgs/aeb75dba965e790de427b73315d5addf91a54955' (2023-05-25)
2023-05-28 06:05:23 +00:00
renovate[bot] 22a543f8a1 chore(deps): update dependency netlify-cli to v15.2.0 [staging] 2023-05-26 09:58:49 +00:00
renovate[bot] 50d4d27cb7 chore(deps): update dependency gohugoio/hugo to v0.112.3 [staging] 2023-05-24 16:17:59 +00:00
renovate[bot] 690bb72e5b chore(deps): update dependency gohugoio/hugo to v0.112.1 [staging] 2023-05-23 17:47:49 +00:00
renovate[bot] 1a7f4038bc chore(deps): update dependency gohugoio/hugo to v0.112.0 [staging] 2023-05-23 08:27:59 +00:00
GitHub Actions 7a2c4df9a3 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/ea11a3977f4cba013d8680667616be827c967ac0' (2023-05-13)
  → 'github:nixos/nixpkgs/eea79d584eff53bf7a76aeb63f8845da6d386129' (2023-05-20)
2023-05-21 06:05:10 +00:00
renovate[bot] a63c148921 chore(deps): update dependency netlify-cli to v15.1.1 [staging] 2023-05-17 10:19:27 +00:00
renovate[bot] 98322f13a1 chore(deps): update dependency netlify-cli to v15.1.0 [staging] 2023-05-15 20:58:23 +00:00
renovate[bot] c2a98e7067 chore(deps): update actions/setup-go digest to fac708d [staging] 2023-05-15 17:49:44 +00:00
GitHub Actions 9bc729b65e flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/635a306fc8ede2e34cb3dd0d6d0a5d49362150ed' (2023-05-11)
  → 'github:nixos/nixpkgs/ea11a3977f4cba013d8680667616be827c967ac0' (2023-05-13)
2023-05-14 06:05:06 +00:00
Harsh Shandilya e817014c75 fix(flakes): remove flake-utils from devshell 2023-05-12 12:21:45 +05:30
Harsh Shandilya 167ea8c4b1 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/fb6673fe9fe4409e3f43ca86968261e970918a83' (2023-04-28)
  → 'github:numtide/devshell/5143ea68647c4cf5227e4ad2100db6671fc4c369' (2023-05-09)
• Removed input 'devshell/flake-utils'
• Added input 'devshell/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/16b3b0c53b1ee8936739f8c588544e7fcec3fc60' (2023-05-06)
  → 'github:nixos/nixpkgs/635a306fc8ede2e34cb3dd0d6d0a5d49362150ed' (2023-05-11)
2023-05-12 12:21:01 +05:30
renovate[bot] 5fe261bdea chore(deps): update dependency netlify-cli to v15.0.2 [staging] 2023-05-08 17:02:27 +00:00
GitHub Actions 0ec48a3739 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/54abe781c482f51ff4ff534ebaba77db5bd97442' (2023-04-29)
  → 'github:nixos/nixpkgs/16b3b0c53b1ee8936739f8c588544e7fcec3fc60' (2023-05-06)
2023-05-07 06:05:35 +00:00
renovate[bot] fdbc28514b chore(deps): update dependency netlify-cli to v15 [staging] 2023-05-05 17:00:29 +00:00
renovate[bot] 144af98832 chore(deps): update dependency netlify-cli to v14.4.0 [staging] 2023-05-03 17:44:00 +00:00
GitHub Actions 974f535693 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/3e0e60ab37cd0bf7ab59888f5c32499d851edb47' (2023-03-16)
  → 'github:numtide/devshell/fb6673fe9fe4409e3f43ca86968261e970918a83' (2023-04-28)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/2362848adf8def2866fabbffc50462e929d7fffb' (2023-04-21)
  → 'github:nixos/nixpkgs/54abe781c482f51ff4ff534ebaba77db5bd97442' (2023-04-29)
2023-04-30 06:05:10 +00:00
renovate[bot] e9bc57dbf3 chore(deps): update dependency netlify-cli to v14.3.1 [staging] 2023-04-26 20:14:08 +00:00
renovate[bot] 85c409ba40 chore(deps): update dependency netlify-cli to v14.3.0 [staging] 2023-04-25 12:31:27 +00:00
renovate[bot] 7442e59450 chore(deps): update dependency prettier to v2.8.8 [staging] 2023-04-23 08:51:28 +00:00
GitHub Actions 2441c753dc flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/29176972b4be60f7d3eb3101f696c99f2e6ada57' (2023-04-15)
  → 'github:nixos/nixpkgs/2362848adf8def2866fabbffc50462e929d7fffb' (2023-04-21)
2023-04-23 06:05:22 +00:00
renovate[bot] 36ee776db8 chore(deps): update dependency netlify-cli to v14.2.1 [staging] 2023-04-20 15:09:36 +00:00
renovate[bot] 0959f092f6 chore(deps): update dependency netlify-cli to v14.1.0 [staging] 2023-04-19 17:29:43 +00:00
renovate[bot] 74bb89d573 chore(deps): update dependency netlify-cli to v14 [staging] 2023-04-17 14:27:27 +00:00
GitHub Actions 61620897a6 flake.lock: Update
Flake lock file updates:

• Updated input 'flake-utils':
    'github:numtide/flake-utils/946da791763db1c306b86a8bd3828bf5814a1247' (2023-04-08)
  → 'github:numtide/flake-utils/cfacdce06f30d2b68473a46042957675eebb3401' (2023-04-11)
• Added input 'flake-utils/systems':
    'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e' (2023-04-09)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/431bf1e6cdd494e5230fbb72884afb4ca612c578' (2023-04-09)
  → 'github:nixos/nixpkgs/29176972b4be60f7d3eb3101f696c99f2e6ada57' (2023-04-15)
2023-04-16 06:05:19 +00:00
renovate[bot] 0e676d09c4 chore(deps): update actions/checkout digest to 8e5e7e5 [staging] 2023-04-13 14:17:35 +00:00
renovate[bot] 7052ed0421 chore(deps): update actions/checkout digest to 83b7061 [staging] 2023-04-12 17:27:44 +00:00
GitHub Actions 7c8a8d7c44 flake.lock: Update
Flake lock file updates:

• Updated input 'flake-utils':
    'github:numtide/flake-utils/93a2b84fc4b70d9e089d029deacc3583435c2ed6' (2023-03-15)
  → 'github:numtide/flake-utils/946da791763db1c306b86a8bd3828bf5814a1247' (2023-04-08)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3364b5b117f65fe1ce65a3cdd5612a078a3b31e3' (2023-03-31)
  → 'github:nixos/nixpkgs/431bf1e6cdd494e5230fbb72884afb4ca612c578' (2023-04-09)
2023-04-09 06:05:12 +00:00
Harsh Shandilya 8c898d2b42 fix: adjust Flake for updated devshell 2023-04-01 12:11:32 +05:30
Harsh Shandilya 2ea8025274 flake.lock: Update
Flake lock file updates:

• Updated input 'devshell':
    'github:numtide/devshell/5aa3a8039c68b4bf869327446590f4cdf90bb634' (2022-12-19)
  → 'github:numtide/devshell/3e0e60ab37cd0bf7ab59888f5c32499d851edb47' (2023-03-16)
• Updated input 'flake-compat':
    'github:edolstra/flake-compat/009399224d5e398d03b22badca40a37ac85412a1' (2022-11-17)
  → 'github:edolstra/flake-compat/35bb57c0c8d8b62bbfd284272c928ceb64ddbde9' (2023-01-17)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/5aed5285a952e0b949eb3ba02c12fa4fcfef535f' (2022-11-02)
  → 'github:numtide/flake-utils/93a2b84fc4b70d9e089d029deacc3583435c2ed6' (2023-03-15)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/37b97ae3dd714de9a17923d004a2c5b5543dfa6d' (2023-01-13)
  → 'github:nixos/nixpkgs/3364b5b117f65fe1ce65a3cdd5612a078a3b31e3' (2023-03-31)
2023-04-01 12:07:49 +05:30
Harsh Shandilya cf186dbbb7 fix: remove explicit branches from inputs 2023-04-01 12:07:41 +05:30
Harsh Shandilya 432f61de05 feat: add GitHub workflow for update `flake.lock` 2023-04-01 12:06:25 +05:30
Harsh Shandilya c2e7b225c3 feat: restore full-text RSS feed 2023-04-01 12:05:42 +05:30
Harsh Shandilya 1af4556a80 fix: update content 2023-04-01 12:00:01 +05:30
Harsh Shandilya 0e486ea807 feat: rework home page 2023-04-01 12:00:01 +05:30
Harsh Shandilya 831c1dc024 feat: include Dracula code style for Chroma 2023-04-01 11:30:19 +05:30
renovate[bot] aae968a67c chore(deps): update dependency netlify-cli to v13.2.2 [staging] 2023-03-28 13:26:48 +00:00
Harsh Shandilya e6834e176e rip twitter 2023-03-27 13:37:46 +05:30
renovate[bot] 7d5111052e chore(deps): update dependency prettier to v2.8.7 [staging] 2023-03-24 09:17:13 +00:00
renovate[bot] 5ca158a3d3 chore(deps): update actions/checkout digest to 8f4b7f8 [staging] 2023-03-24 06:26:10 +00:00
renovate[bot] c65f99ffa1 chore(deps): update dependency netlify-cli to v13.2.1 [staging] 2023-03-22 16:30:07 +00:00
renovate[bot] 3d5dd2eb63 chore(deps): update dependency netlify-cli to v13.2.0 [staging] 2023-03-21 14:47:43 +00:00
renovate[bot] 2feff393b5 chore(deps): update dependency prettier to v2.8.6 [staging] 2023-03-21 08:59:12 +00:00
renovate[bot] d2cf92d293 chore(deps): update dependency prettier to v2.8.5 [staging] 2023-03-20 08:12:32 +00:00
Harsh Shandilya 3c23e6e999 chore: slim down Flake closure size 2023-03-18 11:49:56 +05:30
Harsh Shandilya 103f7a6daf chore: adjust config 2023-03-18 11:49:46 +05:30
renovate[bot] 712e1bbd6e chore(deps): update actions/setup-go action to v4 [staging] 2023-03-16 01:21:45 +00:00
renovate[bot] 9b129494f7 chore(deps): update dependency prettier to v2.8.4 [staging] 2023-03-15 23:33:27 +00:00
renovate[bot] 2bbafee5f5 chore(deps): update actions/checkout digest to 24cb908 [staging] 2023-03-15 20:14:47 +00:00
renovate[bot] cfd1b670ea chore(deps): update dependency netlify-cli to v13.1.6 [staging] 2023-03-15 16:40:23 +00:00
Harsh Shandilya 65884438d8 games 2023-03-12 23:34:06 +05:30
renovate[bot] 2576efcf67 chore(deps): update dependency gohugoio/hugo to v0.111.3 [staging] 2023-03-12 12:18:36 +00:00
renovate[bot] 59761ff440 chore(deps): update dependency gohugoio/hugo to v0.111.2 [staging] 2023-03-05 15:39:16 +00:00
renovate[bot] 0a848133d2 chore(deps): update dependency gohugoio/hugo to v0.111.1 [staging] 2023-03-02 12:29:32 +00:00
renovate[bot] c6e3663b9f chore(deps): update dependency gohugoio/hugo to v0.111.0 [staging] 2023-03-01 21:44:30 +00:00
renovate[bot] c5ba56edb4 chore(deps): update dependency netlify-cli to v13 [staging] 2023-02-21 18:15:31 +00:00
Harsh Shandilya 589020512a feat: upgrade to PaperMod 7.0 2023-02-12 07:36:31 +00:00
Harsh Shandilya 46c28427d0 Step 1 of excising Twitter 2023-02-03 19:25:51 +05:30
Harsh Shandilya 44444cb55e . 2023-01-18 01:06:12 +05:30
Harsh Shandilya beb34d58fb Update Blog “tips-and-tricks-for-using-renovate” 2023-01-17 19:32:23 +00:00
Harsh Shandilya 07dfd99fcf . 2023-01-18 00:57:58 +05:30
Harsh Shandilya 986066807d Update Blog “tips-and-tricks-for-using-renovate” 2023-01-17 19:10:37 +00:00
renovate[bot] 57c677dda0 chore(deps): update dependency gohugoio/hugo to v0.110.0 [staging] 2023-01-17 12:48:53 +00:00
Harsh Shandilya 1892bb960c fix: add draft status 2023-01-15 15:29:02 +05:30
Harsh Shandilya 149e8d0d09 Update Blog “tips-and-tricks-for-using-renovate” 2023-01-15 09:54:54 +00:00
Harsh Shandilya 67edd86f24 Update Blog “tips-and-tricks-for-using-renovate” 2023-01-15 09:54:13 +00:00
Harsh Shandilya 3d8c1c600f Update Blog “tips-and-tricks-for-using-renovate” 2023-01-15 09:53:16 +00:00
Harsh Shandilya 6ae9f96a4d feat: set up Netlify CMS 2023-01-15 14:40:43 +05:30
Harsh Shandilya 35d8765b3b chore(nix): bump flake inputs 2023-01-15 14:18:15 +05:30
Harsh Shandilya fc407c7533 . 2023-01-10 01:46:05 +05:30
Harsh Shandilya 3717e43ca3 chore(nix): bump flake inputs 2023-01-10 01:20:43 +05:30
Harsh Shandilya b7db1c2ef9 feat(nix): set up flake-compat 2023-01-10 01:20:38 +05:30
Harsh Shandilya c7d99901d0 . 2023-01-08 19:33:44 +05:30
renovate[bot] 7e3aa7099c chore(deps): update actions/checkout digest to ac59398 [staging] 2023-01-05 16:43:30 +00:00
Harsh Shandilya 9c7fc4b50c 💀 2022-12-27 20:24:35 +05:30
Harsh Shandilya 4387aefdbd . 2022-12-26 15:13:11 +05:30
Harsh Shandilya 5c559f9f3e 👻 2022-12-26 14:56:08 +05:30
Harsh Shandilya 184ef5f8d8 :fingers-crossed: 2022-12-26 14:35:15 +05:30
renovate[bot] 5560a98807 chore(deps): update dependency gohugoio/hugo to v0.109.0 [staging] 2022-12-23 12:12:04 +00:00
Harsh Shandilya 4665774d0e plaintext? 2022-12-23 17:41:22 +05:30
Harsh Shandilya 74420ede7d Explain `concatStringsSep` 2022-12-23 17:13:51 +05:30
Harsh Shandilya 10f6ec78d7 static: cleanup 2022-12-23 17:06:43 +05:30
Harsh Shandilya 0f4711580c treewide: fix typos 2022-12-23 17:06:11 +05:30
Harsh Shandilya 2fd996d6e9 undraft post 2022-12-23 16:52:29 +05:30
Harsh Shandilya 67910b35f0 `nix flake check`
Fixes SDP-36
2022-12-23 16:51:25 +05:30
Harsh Shandilya fadb1c9899 fix(flakes): skip ntl dev 2022-12-23 16:07:21 +05:30
Harsh Shandilya 5a7d84b600 fix: disable special 1st post config 2022-12-20 01:12:50 +05:30
Harsh Shandilya 94ea5bac86 fix: remove stray closing tag 2022-12-20 01:12:11 +05:30
Harsh Shandilya 4fd7239f83 chore: replace imagemagick with libwebp 2022-12-19 10:31:08 +05:30
renovate[bot] ac01201593 chore(deps): update actions/setup-go digest to 6edd440 [staging] 2022-12-13 17:20:23 +00:00
renovate[bot] 07903a140f chore(deps): update actions/checkout digest to 755da8c [staging] 2022-12-13 15:08:35 +00:00
renovate[bot] 0ed40909b7 chore(deps): update actions/checkout digest to 7dd9e2a [staging] 2022-12-12 20:05:16 +00:00
Harsh Shandilya 831c324442 fix: add missing quote breaking highlighting 2022-12-08 11:25:48 +05:30
Harsh Shandilya 7f46f966df chore: tweak config 2022-12-08 11:23:54 +05:30
Harsh Shandilya 97487467db chore: add status badge 2022-12-08 11:13:30 +05:30
Harsh Shandilya a6ef01ba4a chore: refresh about page 2022-12-08 11:11:00 +05:30
Harsh Shandilya 7e17fbe2ac chore: update resume 2022-12-08 10:53:49 +05:30
renovate[bot] 8e8a96b972 chore(deps): update dependency gohugoio/hugo to v0.108.0 [staging] 2022-12-06 15:41:53 +00:00
Harsh Shandilya aa70289e94 chore(nix): bump flake inputs 2022-12-02 14:20:54 +05:30
renovate[bot] f639e528a1 chore(deps): update actions/setup-go digest to d0a58c1 [staging] 2022-12-01 16:32:14 +00:00
Harsh Shandilya 194ff42e9d Fix broken link 2022-11-28 14:15:01 +05:30
Harsh Shandilya a428b90737 flake.lock: update 2022-11-28 14:06:23 +05:30
Harsh Shandilya b44693c1ad fix: prevent Googlebot from poking at WebFinger 2022-11-28 11:16:03 +05:30
Harsh Shandilya 51e8bbb674 fix: avoid duplicate inputs 2022-11-25 01:31:03 +05:30
renovate[bot] a55f32bcbe chore(deps): update dependency gohugoio/hugo to v0.107.0 [staging] 2022-11-24 14:33:35 +00:00
Harsh Shandilya b67ea20cd2 chore: update uses 2022-11-22 10:45:23 +05:30
Harsh Shandilya 44491ab111 feat: properly configure Netlify dev command 2022-11-22 10:44:02 +05:30
Harsh Shandilya 65e8ca6ced chore(deps): update Netlify CLI and other dependencies 2022-11-22 00:39:12 +05:30
renovate[bot] c2566b77ed chore(deps): update dependency gohugoio/hugo to v0.106.0 [staging] 2022-11-17 20:20:32 +00:00
Harsh Shandilya e1aa6a10d0 fix(nix): directly use hugo for devshell commands 2022-11-17 21:20:51 +05:30
Harsh Shandilya a332e73a9c fix(nix): add help text to commands 2022-11-17 19:55:08 +05:30
Harsh Shandilya 21aca06e96 feat(nix): add build command 2022-11-17 02:04:13 +05:30
Harsh Shandilya d7ac56f2d5 feat(nix): migrate to Flakes 2022-11-16 17:27:38 +05:30
Harsh Shandilya 64020a845f chore: update README 2022-11-16 17:07:42 +05:30
Harsh Shandilya 7f76bc70d3 config: tweak description 2022-11-16 17:00:52 +05:30
Harsh Shandilya 281cbbdc50 whoops 2022-11-16 14:58:47 +05:30
Harsh Shandilya db53c9597b New post 2022-11-16 14:52:09 +05:30
Harsh Shandilya a32f81d853 fix(webfinger): restrict valid identities 2022-11-16 14:31:12 +05:30
Harsh Shandilya addedd5dc5 refactor(webfinger): put failure conditions first 2022-11-16 14:02:29 +05:30
Harsh Shandilya cd288072e8 chore: add Yarn lockfile 2022-11-16 12:04:38 +05:30
Harsh Shandilya 4df480ad49 fix(netlify): use correct status codes in error response
Also clean up an unnecessary log statement
2022-11-16 12:03:31 +05:30
Harsh Shandilya abe3f0ca96 refactor(netlify): rework the webfinger edge function 2022-11-16 11:59:00 +05:30
Harsh Shandilya 1b8466c0b4 feat(netlify): add an edge function for WebFinger 2022-11-16 00:51:53 +05:30
Harsh Shandilya e8f357a125 chore: flesh out development setup 2022-11-16 00:51:27 +05:30
Harsh Shandilya 6f34566e1b chore: remove useless `tsconfig.json` 2022-11-16 00:22:19 +05:30
Harsh Shandilya c8fffb4088 fixup! feat: add fediverse info 2022-11-11 15:57:04 +05:30
Harsh Shandilya 96627074fe fix(content): adjust tags 2022-11-11 15:33:59 +05:30
Harsh Shandilya 9aba3d013b feat: add fediverse info 2022-11-02 22:54:43 +05:30
renovate[bot] a925d0d83f chore(deps): update dependency gohugoio/hugo to v0.105.0 [staging] 2022-10-28 12:58:44 +00:00
Harsh Shandilya 829012df15 fix(netlify): remove unnecessary logging 2022-10-26 23:31:49 +05:30
renovate[bot] 3b7f37242e chore(deps): update peaceiris/actions-hugo digest to 16361eb [staging] 2022-10-23 17:01:48 +00:00
renovate[bot] 6b76cad14c chore(deps): update actions/setup-go digest to c4a742c [staging] 2022-10-18 13:43:46 +00:00
Harsh Shandilya 59ca8057a6 fix(nix): remove wrangler 2022-10-12 01:06:56 +05:30
renovate[bot] 93b1dace20 chore(deps): update actions/checkout digest to 93ea575 [staging] 2022-10-11 12:30:24 +00:00
Harsh Shandilya 6685ec3c44 all: remove Cloudflare Workers functionality 2022-10-08 20:19:37 +05:30
Harsh Shandilya 10708ab642 netlify: add an edge function to handle redirects 2022-10-08 20:13:57 +05:30
Harsh Shandilya 0c25ee7767 netlify: init 2022-10-06 19:42:24 +05:30
renovate[bot] f64289bb1f chore(deps): update actions/checkout digest to 2541b12 [staging] 2022-10-05 10:56:38 +00:00
renovate[bot] d44846cb5e chore(deps): update dependency gohugoio/hugo to v0.104.3 [staging] 2022-10-04 19:32:35 +00:00
renovate[bot] 6559c452d7 chore(deps): update actions/checkout digest to 93ea575 [staging] 2022-10-04 15:23:12 +00:00
renovate[bot] eef03d81a5 chore(deps): update dependency gohugoio/hugo to v0.104.2 [staging] 2022-09-29 13:22:32 +00:00
renovate[bot] 941d0bed3a chore(deps): update dependency typescript to v4.8.4 [staging] 2022-09-27 23:10:52 +00:00
Harsh Shandilya a037ac89c9 fix(renovate): remove invalid trailing comma 2022-09-27 18:27:02 +05:30
renovate[bot] c621ab48d1 chore(deps): update dependency gohugoio/hugo to v0.104.1 [staging] 2022-09-26 20:39:31 +00:00
renovate[bot] d20d097c8e chore(deps): update dependency gohugoio/hugo to v0.104.0 [staging] 2022-09-23 16:37:07 +00:00
renovate[bot] b4d4be9166 chore(deps): update dependency gohugoio/hugo to v0.103.1 [staging] 2022-09-18 16:01:10 +00:00
renovate[bot] e385550186 chore(deps): update dependency gohugoio/hugo to v0.103.0 [staging] 2022-09-15 18:15:41 +00:00
renovate[bot] 6221819e4b chore(deps): update dependency typescript to v4.8.3 [staging] 2022-09-08 19:33:56 +00:00
renovate[bot] 2799921e1c chore(deps): pin dependencies [staging] (#55)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-08 11:46:20 +05:30
Harsh Shandilya bbd4b01d35 fix(ci): use correct version of wrangler action
[staging] [deploy]
2022-09-02 00:31:12 +05:30
renovate[bot] 7b5edc1b94 chore(deps): update dependency @cloudflare/workers-types to v3.16.0 [staging] 2022-09-01 15:00:09 +00:00
renovate[bot] 0aa2dfdc5a chore(deps): update dependency gohugoio/hugo to v0.102.3 [staging] 2022-09-01 11:17:10 +00:00
renovate[bot] 70e45cde4a chore(deps): update dependency gohugoio/hugo to v0.102.2 [staging] 2022-08-31 13:20:25 +00:00
renovate[bot] 8e42aca5da chore(deps): update dependency @cloudflare/workers-types to v3.15.0 [staging] 2022-08-30 15:59:32 +00:00
renovate[bot] 76f478a4e0 chore(deps): update dependency gohugoio/hugo to v0.102.1 [staging] 2022-08-29 15:46:34 +00:00
renovate[bot] dfb0f11b8d chore(deps): update dependency gohugoio/hugo to v0.102.0 [staging] 2022-08-28 18:29:04 +00:00
Harsh Shandilya 09dae3288c feat(wrangler): add a preview namespace for local dev 2022-08-26 12:34:37 +05:30
Harsh Shandilya f4d4b95963 feat(node): bump package versions 2022-08-26 12:34:24 +05:30
Harsh Shandilya 4c4d9d4680 feat(wrangler): migrate to Wrangler 2 [deploy] 2022-08-26 12:25:04 +05:30
renovate[bot] a8828658b4 chore(deps): update dependency typescript to v4.8.2 [staging] 2022-08-26 00:14:40 +00:00
renovate[bot] 40562d056b chore(deps): update module go to 1.19 [staging] 2022-08-02 17:17:55 +00:00
Harsh Shandilya 63331bfdfd fix(deps): setup Renovate to pin GHA digests 2022-07-28 00:33:29 +05:30
Harsh Shandilya 768a9e0952 Fix utterances theme [deploy] 2022-07-27 10:18:14 +00:00
Harsh Shandilya 947879be03 Try fixing CSP again [deploy] 2022-07-27 10:08:00 +00:00
Harsh Shandilya 5f8ca1c1c5 Add share buttons to posts [deploy] 2022-07-27 10:00:01 +00:00
renovate[bot] 5ddd0dc7ca chore(deps): update dependency gohugoio/hugo to v0.101.0 [staging] 2022-07-23 08:44:30 +00:00
Harsh Shandilya 154414e424 fix(deps): try out a more manual way of updating GHA deps 2022-07-23 14:14:04 +05:30
Harsh Shandilya e182f160e3 fix(deps): bump PaperMod [deploy] 2022-07-21 18:59:44 +05:30
renovate[bot] 59a21afd07 chore(deps): update module go to 1.18 [staging] 2022-07-21 05:51:50 +00:00
Harsh Shandilya c2256c2b55 workers-site: also set `frame-ancesors` in CSP [deploy][staging] 2022-07-20 01:51:45 +05:30
renovate[bot] 972ff15029 chore(deps): update dependency @cloudflare/workers-types to v3.14.1 [staging] 2022-07-10 10:39:25 +00:00
Harsh Shandilya 1b98f90c3e Revert "paparazzi: add note about Kotlin 1.7.0 compat [deploy]"
This workaround is too involved when you can just set `android.composeOptions.kotlinCompilerExtensionVersion`.

This reverts commit 157bfc1d8c.
2022-07-09 19:13:58 +05:30
Harsh Shandilya 7ddcd937a8 Enable code highlighting for paparazzi post [deploy] 2022-07-09 19:02:48 +05:30
Harsh Shandilya 157bfc1d8c paparazzi: add note about Kotlin 1.7.0 compat [deploy] 2022-07-09 19:02:48 +05:30
Harsh Shandilya ca680b6772 renovate: disallow breakage-inducing updates 2022-07-09 19:02:48 +05:30
Harsh Shandilya f39aab0caa renovate: setup a regex manager for versions in GHA files 2022-07-05 01:12:01 +05:30
renovate[bot] c02e9863cc chore(deps): update actions/checkout action to v3 [staging] 2022-07-04 18:53:23 +00:00
renovate[bot] 97f0892778 chore(deps): update actions/setup-go action to v3 [staging] 2022-07-04 18:38:44 +00:00
renovate[bot] 32ec5ebf5d chore(deps): update dependency @cloudflare/workers-types to v3.14.0 [staging] (#51)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-04 18:38:21 +00:00
renovate[bot] ca47c0ef89 chore(deps): pin dependencies [staging] (#50)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-04 18:37:17 +00:00
Harsh Shandilya d65ca7229e github: add a build test job for renovate checks 2022-07-05 00:05:43 +05:30
Harsh Shandilya a585b2e646 github: allow manual deploys 2022-07-04 11:59:02 +05:30
Harsh Shandilya 0b6a7c92c0 renovate: add [staging] suffix to commit messages for auto-deploy 2022-07-04 11:56:55 +05:30
Harsh Shandilya 25530abbdd renovate: configure branch automerge 2022-07-04 11:53:54 +05:30
renovate[bot] 664bf83236 chore(deps): add renovate.json 2022-07-04 06:22:14 +00:00
Harsh Shandilya 8f71df047c uses: update [deploy] 2022-07-04 11:11:32 +05:30
Harsh Shandilya 3f5d58b59a content: fmt [deploy] 2022-06-29 02:32:08 +05:30
Harsh Shandilya 361137ed7d uses: RAM died Sadgers [deploy] 2022-06-29 02:30:54 +05:30
Harsh Shandilya 15347fe921 fix missing brace [deploy] 2022-06-29 02:21:53 +05:30
Harsh Shandilya 10dff28bf4 Revert "Revert "content: release KMP post [deploy]""
Fixed lol

This reverts commit 0713469376.
2022-06-29 02:12:46 +05:30
Harsh Shandilya 19b77317c9 Add links, parameterized tests and cleanup 2022-06-29 02:12:40 +05:30
Harsh Shandilya 0713469376 Revert "content: release KMP post [deploy]"
I didn't add the links omegalul

This reverts commit 54ea97dfce.
2022-06-29 01:40:48 +05:30
Harsh Shandilya 0f970286c2 content: fix incorrect code snippet 2022-06-29 01:40:16 +05:30
Harsh Shandilya 54ea97dfce content: release KMP post [deploy] 2022-06-28 13:35:47 +05:30
Harsh Shandilya 79fbd8b81c content: vague-ify about page wording [deploy]
It is a pain to keep this up-to-date
2022-06-27 17:26:50 +05:30
Harsh Shandilya 2ea70438d4 forestry: yeet 2022-06-27 17:25:19 +05:30
Harsh Shandilya 4365a5af74 content: add Paparazzi w/ KMP post [deploy] 2022-06-27 17:22:29 +05:30
Harsh Shandilya 9d5ebb2a57 content: `s/description/summary/` 2022-06-27 17:21:05 +05:30
Harsh Shandilya 3804d34b56 scripts: `s/description/summary/` 2022-06-27 17:21:03 +05:30
Harsh Shandilya f6cf0f6494 hugo: upgrade PaperMod 2022-06-27 17:19:29 +05:30
Harsh Shandilya 61b4ca6eae all: switch to Yarn 2022-05-27 16:35:35 +05:30
Harsh Shandilya 19bf61857f Publish convention plugins post [deploy] 2022-04-17 22:34:12 +05:30
Harsh Shandilya 2f923a1f49 Tweak some wording [staging] 2022-04-17 20:50:24 +05:30
Harsh Shandilya 223df0eab0 Add convention plugins post [staging] 2022-04-17 20:37:04 +05:30
Harsh Shandilya 5fdeaf284d workers-site: record page visits to KV [deploy][staging] 2022-04-09 22:19:11 +05:30
Harsh Shandilya 890492b75a wrangler: add KV namespaces 2022-04-06 16:04:13 +05:30
Harsh Shandilya e89dc1136d content: run prettier 2022-04-06 16:03:54 +05:30
Harsh Shandilya 75be503bb2 workers-site: add updated hashes [deploy][staging] 2022-04-05 12:58:16 +05:30
Harsh Shandilya 979a062138 content: undraft gphotos post [deploy][staging] 2022-04-05 12:13:29 +05:30
Harsh Shandilya 43f4284293 content: cleanup gphotos backup post [staging] 2022-04-05 12:12:56 +05:30
Harsh Shandilya a7fd6e1bda content: run prettier and fix links [staging] 2022-04-05 01:35:20 +05:30
Harsh Shandilya 1dbb5471a6 hugo: update PaperMod [deploy] 2022-04-05 01:33:38 +05:30
Harsh Shandilya 9ed20fc39a content: add photos backup post [staging] 2022-04-05 01:31:00 +05:30
Harsh Shandilya 613444d4aa config: set utterances theme to proton-dark [deploy] [staging] 2022-04-04 08:30:33 +05:30
Harsh Shandilya 946803993a content: remove hopeless draft [staging] 2022-03-08 15:50:45 +05:30
Harsh Shandilya babf8b21fb npm: remove transpile script 2022-03-05 01:57:28 +05:30
Harsh Shandilya dc41fd4c3b node: use gitignore to limit prettier scope 2022-03-05 01:54:13 +05:30
Harsh Shandilya 2dc8515657 content: rewrite about page [deploy] 2022-03-05 01:44:33 +05:30
Harsh Shandilya 5d8bc06fae github: notify search engines of sitemap updates [deploy] 2022-02-27 18:29:55 +05:30
Harsh Shandilya 4a7ce5e581 workers-site: remove invalid permissions policy entry [staging] 2022-02-27 10:07:46 +05:30
Harsh Shandilya c36f173f22 all: switch to Hugo PaperMod [staging] 2022-02-27 10:07:46 +05:30
Harsh Shandilya 3a326a4d0f Revert "config: set theme mode to auto [deploy][staging]"
Causes a white flash on page navigations, not worth it.

This reverts commit 21f754169b.
2022-02-27 02:02:21 +05:30
Harsh Shandilya edd9494026 layouts: no comments for pages [deploy] 2022-02-01 15:30:53 +05:30
Harsh Shandilya 55a5ea775d content: remove stray date [deploy] 2022-02-01 15:06:01 +05:30
Harsh Shandilya 2069ebac97 modules: force upgrade hugo-ink [deploy][staging] 2022-01-24 23:22:32 +05:30
Harsh Shandilya 21f754169b config: set theme mode to auto [deploy][staging] 2022-01-23 16:19:09 +05:30
Harsh Shandilya 3165561d1e workers-site: redirect /apsg to APS org [deploy] 2022-01-08 01:01:53 +05:30
Harsh Shandilya a69d93fc56 root: reformat with prettier 2022-01-08 01:01:41 +05:30
Harsh Shandilya e8f9cae8cd workers-site: reformat with prettier 2022-01-07 20:17:27 +05:30
Harsh Shandilya 8d1734559a content: reformat with prettier 2022-01-07 20:16:47 +05:30
Harsh Shandilya 7bef839204 content: get rid of projects page [deploy] 2022-01-06 14:11:48 +05:30
Harsh Shandilya 5baf64d637 uses: rewrite and update [deploy] 2022-01-06 14:11:22 +05:30
Harsh Shandilya 06840c9d15 workers-site: update CSP [deploy] [staging] 2022-01-06 11:26:30 +05:30
Harsh Shandilya a74a24d7fc layouts: overlay hugo-ink layouts for SA and Utterances [deploy] 2022-01-06 11:15:18 +05:30
Harsh Shandilya d7c5b92562 [deploy]
(cherry picked from commit 0cfa575f58)
2022-01-06 10:41:03 +05:30
Harsh Shandilya 00f4c8f13b all: switch theme to hugo-ink [staging] 2022-01-06 09:57:26 +05:30
Harsh Shandilya 3221fa4aba content: reorganize tags and categories to remove duplication [deploy] 2022-01-06 09:56:53 +05:30
Harsh Shandilya a03a9a48a4 content: bend to the SEO gods [deploy] 2022-01-04 09:59:01 +05:30
Harsh Shandilya 1c448cd04d themes/ezhil: link categories rather than tags 2022-01-04 09:55:39 +05:30
Harsh Shandilya 241233ff77 nix: add git to build inputs
`go mod download` requires Git
2022-01-04 09:53:44 +05:30
Harsh Shandilya 0cfa575f58 [deploy] 2022-01-02 18:35:15 +05:30
Harsh Shandilya be68c229ac workers-site: allow redirecting to other APS repos [staging] 2022-01-02 18:00:30 +05:30
Harsh Shandilya 36c8fb2cfa workers-site: fix type errors 2022-01-02 17:52:53 +05:30
Harsh Shandilya e40be3511a github: migrate prod to wrangler-action [deploy] 2021-12-22 10:42:00 +05:30
Harsh Shandilya 6dd2d54f74 github: test wrangler-action deployment [staging] 2021-12-22 10:39:00 +05:30
Harsh Shandilya 3c16172312 github: switch Actions to use moving tags 2021-12-22 10:36:07 +05:30
Harsh Shandilya c30988898d all: upgrade to Hugo v0.91.0 [staging] [deploy] 2021-12-22 10:36:07 +05:30
Harsh Shandilya f8d04def7a hugo: convert hugo-social-metadata to a Hugo module [deploy][staging] 2021-12-08 13:18:40 +05:30
Harsh Shandilya a9a780e859 npm: update config and dependencies 2021-11-20 18:13:36 +05:30
Harsh Shandilya d29b0377e3 Add screenshots [deploy] 2021-11-08 11:41:27 +05:30
Harsh Shandilya a4406804ff wrangler: add compatibility_date [staging] 2021-11-08 10:27:37 +05:30
Harsh Shandilya 23a05cc5c9 Undraft M3 migration post [deploy] 2021-11-08 10:26:23 +05:30
Harsh Shandilya bf4713141e Final shoutouts [staging] 2021-11-08 10:09:14 +05:30
Harsh Shandilya 63ad9fd6b1 nix: update shell config 2021-11-06 15:33:03 +05:30
Harsh Shandilya 2b07b24899 M3 migration for APS [staging] 2021-11-06 14:49:03 +05:30
Harsh Shandilya 78c9379ca7 static: update resume [staging][deploy] 2021-10-20 18:15:51 +05:30
Harsh Shandilya 4dee803a30 Publish static linking post [deploy][staging] 2021-10-17 21:58:24 +05:30
Harsh Shandilya b6d34c385c Finally add the static linking post [staging] 2021-10-15 03:21:55 +05:30
Harsh Shandilya b451129c13 Fix outdated Twitter handle 2021-10-15 03:18:38 +05:30
Harsh Shandilya 632f5299a0 bye felicia [deploy][staging] 2021-08-19 14:43:52 +05:30
Harsh Shandilya c9a01a9f21 content: flesh out Git post some more 2021-08-19 14:43:26 +05:30
Harsh Shandilya 86db6f0efa shell.nix: add imagemagick 2021-08-14 05:42:13 +05:30
Harsh Shandilya 6b3a3d8591 content: debut Git post [staging] 2021-08-14 05:42:03 +05:30
Harsh Shandilya c9eec093c0 config: fix Twitter username [staging] [deploy] 2021-07-20 02:42:11 +05:30
Harsh Shandilya 92a446a8e8 nix: add nix-shell configuration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-06-16 05:30:32 +05:30
Harsh Shandilya 1254997f73 workers-site: re-enable inline styles [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-06-07 11:33:45 +05:30
Harsh Shandilya 22139a2056 layouts/workers: remove incorrect nonce [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-06-06 17:01:28 +05:30
Harsh Shandilya 136a0c387e workers-site: remove unsafe-inline from styles [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-06-06 17:01:28 +05:30
Harsh Shandilya 00fd6c96fd workers-site: allow analytics scripts [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-06-06 17:01:27 +05:30
Harsh Shandilya 6f2e804ec4 workers-site: add cache headers to resource files [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-19 21:48:46 +05:30
Harsh Shandilya b466da9e52 workers: add types
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-19 21:44:14 +05:30
Harsh Shandilya a19c72322c npm: bump dependencies
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-19 21:38:15 +05:30
Harsh Shandilya 6df37406ab Learning Zig - Day 4 [deploy][staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-18 22:54:00 +05:30
Harsh Shandilya 165741e855 Learning Zig, Day 3 [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-16 22:30:03 +05:30
Harsh Shandilya 5661f86721 Bigger heading [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-15 23:16:46 +05:30
Harsh Shandilya db551270cf Learning Zig, day 2 [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-15 23:14:32 +05:30
Harsh Shandilya 4279ca7883 Add clarification about syntax highlighting [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-14 20:53:47 +05:30
Harsh Shandilya 4400591359 Slightly tweak first steps with Zig post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-14 17:05:56 +05:30
Harsh Shandilya 0c60256bcf Add first steps with zig [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-14 16:45:44 +05:30
Harsh Shandilya a59e6a55e1 workers-site: pre-emptively opt out of FLoC [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-04-16 12:58:32 +05:30
Harsh Shandilya 0752fb9e50 content: fix links [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-04-08 19:31:36 +05:30
Harsh Shandilya ee341c184d remove scrapped drafts [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-04-01 11:57:04 +05:30
Harsh Shandilya 49cbbd437c Just obliterate the flutter post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-17 17:13:06 +05:30
Harsh Shandilya 87e25ce376 Fix typo in moshi post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-17 09:35:06 +05:30
Harsh Shandilya 03ddfed6b2 Docs are really important [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-15 12:58:55 +05:30
Harsh Shandilya 1c63fd625d I have changed my mind on widgets [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-15 12:37:26 +05:30
Harsh Shandilya 87df51c13a Final touches to the flutter post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-12 17:40:42 +05:30
Harsh Shandilya 896d3add88 Generics are footguns in Dart [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-08 16:38:07 +05:30
Harsh Shandilya 364c060bed Extension function visibility in Dart [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-08 12:01:53 +05:30
Harsh Shandilya 2fe8e8d71f Type unsafety in Flutter [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-08 11:07:45 +05:30
Harsh Shandilya ccf5147492 Slightly expand on widgets [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 23:02:31 +05:30
Harsh Shandilya 34b4474c05 Tweaks [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 22:56:09 +05:30
Harsh Shandilya 44f71923a8 More words on Flutter [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 22:55:21 +05:30
Harsh Shandilya d62046db9e all: temporarily serve drafts from separate subdomain [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 22:18:38 +05:30
Harsh Shandilya 1a45d55395 Finish first version of Flutter post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 21:53:38 +05:30
Harsh Shandilya 9c5a74dad2 First wisps of Flutter post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-01 16:41:18 +05:30
Harsh Shandilya efd79cbd6c partials/sponsors: set rel=noopener [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-28 14:22:04 +05:30
Harsh Shandilya 01bff2fce3 content: remove SELinux post and refer to LineageOS [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-27 14:59:41 +05:30
Harsh Shandilya 0b93985706 More content on init scripts [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-15 16:11:15 +05:30
Harsh Shandilya 2a688ade6e Add another caveat to init scripts post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 14:09:37 +05:30
Harsh Shandilya 49795099bf content: fix file path in code snippet
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 14:06:29 +05:30
Harsh Shandilya 90ad288704 Add init scripts post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 14:05:17 +05:30
Harsh Shandilya f70530b626 all: revert social tags experiments [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 13:03:24 +05:30
Harsh Shandilya b5eae97bf3 all: convert everything from WebP to PNG [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 12:45:39 +05:30
Harsh Shandilya c98b94faa4 config: set card type to summary [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 12:06:43 +05:30
Harsh Shandilya 0dd68dfa3f content: add update to inline classes post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-08 09:08:52 +05:30
Harsh Shandilya 9e9d0b0836 github: add step name to checkout
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 13:48:45 +05:30
Harsh Shandilya 77fed3e2fd content/uses: update [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 13:45:57 +05:30
Harsh Shandilya b84b519676 Revert "github: allow manually running deployments"
This reverts commit f9206a8c77.
2021-01-23 13:44:51 +05:30
Harsh Shandilya f9206a8c77 github: allow manually running deployments 2021-01-20 21:48:49 +05:30
Harsh Shandilya 8b32410341 themes/ezhil: tweak dark theme CSS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-13 22:32:32 +05:30
Harsh Shandilya 4a138b4a1e workers-site: fix 404 fallback [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-11 02:16:01 +05:30
Harsh Shandilya e76545b8dc posts: fix precompiled script confusion [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-11 01:25:12 +05:30
Harsh Shandilya f2cfed5758 posts: fix links [staging] 2021-01-09 03:24:21 +05:30
Harsh Shandilya e3865443cd posts: update buildSrc post with next heading 2021-01-09 03:19:02 +05:30
Harsh Shandilya 6537111df5 themes/ezhil: restrict comments widget to prod [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-07 04:31:51 +05:30
Harsh Shandilya 125229ffdd posts: initial draft of Gradle plugins post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-07 04:29:05 +05:30
Harsh Shandilya fc96d6db74 workers-site: add issue/pr support to personal repos [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-06 17:49:16 +05:30
Harsh Shandilya 334d6c132a package.json: add repository field
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-06 17:49:16 +05:30
Harsh Shandilya 9232af41e8 workers-site: update CSP for migrated resources [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-06 13:56:11 +05:30
Harsh Shandilya 1e6eae008e themes/ezhil: migrate critical remote resources into the site
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-06 13:55:02 +05:30
Harsh Shandilya fe1d460f9d scripts/generate_post_skeleton.sh: reformat with 2 space indent
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-05 11:42:46 +05:30
Harsh Shandilya 3f6bf07368 scripts/generate_post_skeleton: handle empty post slugs
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-05 11:42:13 +05:30
Harsh Shandilya b10d1d7374 content: publish GHA tips post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-04 10:59:12 +05:30
Harsh Shandilya d3fbb20d71 imagine a world where I didn't make spelling mistakes [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-04 00:14:02 +05:30
Harsh Shandilya 08f76f8cb9 posts: continuous rewriting is the way [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-04 00:07:09 +05:30
Harsh Shandilya 2ffadee895 scripts/generate_post_skeleton: make bash opts match pngtowebp.sh
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 19:55:17 +05:30
Harsh Shandilya 5ea57261ae posts: more updates to github tips and tricks [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 11:05:34 +05:30
Harsh Shandilya 217c72caf5 scripts/pngtowebp: fail-fast on errors
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 11:04:59 +05:30
Harsh Shandilya 5fc391e89f posts: add security concerns section to Actions post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 06:55:35 +05:30
Harsh Shandilya 66de37296d layouts/shortcodes: add horizontal_line
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 06:46:57 +05:30
Harsh Shandilya 36720cc88b posts: tweak wording in GitHub Actions post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 06:14:54 +05:30
Harsh Shandilya 8c3c20663a posts: beef out Actions tips and tricks post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 00:30:11 +05:30
Harsh Shandilya 2db93b30ef layouts: add a sub shortcode
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 00:29:45 +05:30
Nishith Khanna 76ff87ef05 content/uses: fix links to cli tooling (#41) [deploy] 2021-01-02 12:46:26 +05:30
Harsh Shandilya a6f07fba4a themes/ezhil: reland link accessibility rework [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-01 14:55:56 +05:30
Harsh Shandilya 38c0bc5b10 Revert "themes/ezhil: improve link styling for accessibility [deploy]"
This reverts commit 8b49d1d1b0.
2021-01-01 14:48:36 +05:30
Harsh Shandilya 8b49d1d1b0 themes/ezhil: improve link styling for accessibility [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-01 14:45:46 +05:30
Harsh Shandilya 4e45164e8c workers-site: allow connecting to analytics domain [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-30 16:52:35 +05:30
Harsh Shandilya f5b59a5dd0 workers-site: update CSP for utteranc.es widget [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-30 16:32:50 +05:30
Harsh Shandilya 191d1a158a layouts: enable comments backed by utteranc.es [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-30 15:55:27 +05:30
Harsh Shandilya 49ef77b146 simple_analytics: drop events [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-28 23:30:15 +05:30
Harsh Shandilya e91454b80a github: rename default branch to main
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-28 22:58:46 +05:30
Harsh Shandilya c1e27ad920 assets: remove unused syntax highlighting definition
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-28 02:35:40 +05:30
Harsh Shandilya 23fc647825 content: formatting tweaks for SELinux post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-27 16:02:26 +05:30
Harsh Shandilya 614ef4ca58 content: tweak and reword SELinux denials post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-27 15:43:23 +05:30
Harsh Shandilya b9dfe06599 simple_analytics: desperate times
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-27 15:20:17 +05:30
Harsh Shandilya 18b852ce57 themes/ezhil: improve analytics events handling [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-25 12:32:23 +05:30
Harsh Shandilya 0329424553 themes/ezhil: fix CSP violation from click analytics event [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-25 10:41:02 +05:30
Harsh Shandilya 8df5c9867d simple_analytics: ignore DNT [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-25 10:19:59 +05:30
Harsh Shandilya a570c64800 themes/ezhil: define more analytics events [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-24 12:54:31 +05:30
Harsh Shandilya 445212cbab layouts/shortcodes: set nonce for asciinema event script
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-24 12:48:15 +05:30
Harsh Shandilya eae7c59b9a simple_analytics: define sa_event for analytics events
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-24 12:46:35 +05:30
Harsh Shandilya c70ae339fe themes/codex: remove 2020-12-23 15:49:31 +05:30
Harsh Shandilya 793eac3e1a Slight wording tweaks [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-23 11:56:04 +05:30
Harsh Shandilya fb8d410bd6 Publish inline classes post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:54:48 +05:30
Harsh Shandilya b3529cb294 Add post on inline class improvements in Kotlin 1.4.30 [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:47:21 +05:30
Harsh Shandilya c2bc226e0c fixup! layouts: add simpleanalytics [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:38:57 +05:30
Harsh Shandilya 21305bb2a7 fixup! layouts: add simpleanalytics [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:32:16 +05:30
Harsh Shandilya 9f4c336338 wrangler: change prod deployment name [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 18:09:35 +05:30
Harsh Shandilya a0e63682bc package.json: add webpack-cli
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 17:21:37 +05:30
Harsh Shandilya 9bc2874b0e layouts: add simpleanalytics [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 16:54:26 +05:30
Harsh Shandilya 09d26a7b74 fixup! all: add some missing social images [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 22:19:17 +05:30
Harsh Shandilya 6fcdc1793e themes/ezhil: drop internal social media templates [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 22:16:39 +05:30
Harsh Shandilya 3bea0a7ab3 Merge branch 'main' of github.com:msfjarvis/hugo-social-metadata into src [deploy] [staging]
* 'main' of github.com:msfjarvis/hugo-social-metadata:
  layouts: use direct permalink
2020-12-21 22:05:54 +05:30
Harsh Shandilya 9c89456620 layouts: use direct permalink
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 22:05:28 +05:30
Harsh Shandilya c0879a685e Merge branch 'main' of github.com:msfjarvis/hugo-social-metadata into src [deploy] [staging]
* 'main' of github.com:msfjarvis/hugo-social-metadata:
  layouts: add rel="canonical" link to each post
  hugo: mark theme as a module
  theme: update branch
2020-12-21 22:04:00 +05:30
Harsh Shandilya 2bc1f67a69 themes/ezhil: add social metadata [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 22:02:57 +05:30
Harsh Shandilya ec8824c81f layouts: add rel="canonical" link to each post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 21:59:09 +05:30
Harsh Shandilya 220d3d548d content: remove unnecessary `reader.` qualifier [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 20:12:39 +05:30
Harsh Shandilya 524a268080 all: add some missing social images [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 16:05:48 +05:30
Harsh Shandilya a2bc4af910 content: reformat Moshi post code samples [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 15:57:16 +05:30
Harsh Shandilya abd21cc14e themes/ezhil: tweak post width [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 15:47:42 +05:30
Harsh Shandilya 7bd9fe5c96 content: bump date on Moshi post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 15:16:14 +05:30
Harsh Shandilya 45b2c10ef8 content: publish moshi post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 12:23:39 +05:30
Harsh Shandilya 1e1ecce994 workers-site: enable inline styles for code highlighting [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 12:17:04 +05:30
Harsh Shandilya 5f60f6ff2c workers-site: drop Feature-Policy header [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:22:19 +05:30
Harsh Shandilya 454086f350 workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:20:46 +05:30
Harsh Shandilya 33809c89ab workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:12:35 +05:30
Harsh Shandilya 8439baeb21 workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:04:57 +05:30
Harsh Shandilya 5d5eaac47a workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:00:06 +05:30
Harsh Shandilya 277aaad753 workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:54:04 +05:30
Harsh Shandilya f74564cf70 workers-site: set Permissions-Policy header [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:45:45 +05:30
Harsh Shandilya 5a5ab88bf0 workers-site: enable referrer in secure contexts
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:42:36 +05:30
Harsh Shandilya 7352c7b648 workers-site: formatting fixup
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:42:11 +05:30
Harsh Shandilya c466e906fe workers-site: update CSP [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:39:49 +05:30
Harsh Shandilya 4c01bbc250 workers-site: set CSP and Feature-Policy headers [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-18 12:13:22 -08:00
Harsh Shandilya c54dedcb03 workers-site: sync from redirekt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-18 00:31:06 +05:30
Harsh Shandilya ba6339974e npm: update packages
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-18 00:30:47 +05:30
Harsh Shandilya 4807424f6e Revert "all: enable automatic dark theme switching [staging]"
This reverts commit 1d6e0213fa.
2020-12-18 00:26:33 +05:30
Harsh Shandilya 1d6e0213fa all: enable automatic dark theme switching [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:34:53 +05:30
Harsh Shandilya b3dc24195d taxonomies: enable categories
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:24:19 +05:30
Harsh Shandilya a8af141f48 github: fix staging deployment command [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:21:31 +05:30
Harsh Shandilya a697a7a1df fix tags and RSS [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:13:16 +05:30
Harsh Shandilya 21e11ab243 all: switch to ezhil
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:10:29 +05:30
Harsh Shandilya 962bd342a5 Merge branch 'master' of github.com:vividvilla/ezhil into src
* 'master' of github.com:vividvilla/ezhil: (56 commits)
  adding base tag to header to fix static file linking
  render code blocks as inline-block
  Remove .DS_Store file
  Include front matter in home and list pages if provided
  chore: add doc for summary length config
  replace .RawContent with .Summary - looks way better
  fix: disable custom js from sample config
  feat: default style for table
  fix: don't prepend host url to external js if it starts with http:// or https://
  fix: disable disqus if Site.DisqusShortname is not set
  fix: update demo pygmentes style
  Disable Google Analytics when hugo server
  [Fix] Link to home in head partial.
  feat: load custom CSS and JS
  fix: anchor text color for dark theme
  chore: add gitignore
  fix: readability fixes
  fix: change layout for tags
  fix: readability fix for small screen devices
  fix: anchor tag overflow on chrome bug
  ...

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-16 23:05:13 +05:30
Harsh Shandilya 2ce4624149 trigger prod build [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-16 22:41:07 +05:30
Harsh Shandilya dd0d039d0b layouts: turn off Sponsors embed completely [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-16 22:34:22 +05:30
Harsh Shandilya 70a58b112d More tweaks to Moshi post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-16 22:26:32 +05:30
Harsh Shandilya 4150081805 More work on Moshi post [staging] 2020-12-14 06:53:33 -08:00
Harsh Shandilya 6690dcfe6c Add moshi parsing post [staging] 2020-12-13 11:13:18 -08:00
Harsh Shandilya dcb0f2e120 More words
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-12 14:54:11 +05:30
Harsh Shandilya cf9d76728a layouts: remove sponsors partial when serving locally
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-12 13:33:18 +05:30
Harsh Shandilya 922e33b3b6 Update from Forestry.io
Harsh Shandilya updated content/posts/tips-and-tricks-for-github-actions.md
2020-12-11 18:34:31 +00:00
Harsh Shandilya 37233d6b56 Update from Forestry.io
Harsh Shandilya created content/posts/tips-and-tricks-for-github-actions.md
2020-12-11 18:24:12 +00:00
Harsh Shandilya b1459a1389 Update from Forestry.io
Harsh Shandilya created static/uploads/actions.png
2020-12-11 18:23:13 +00:00
Harsh Shandilya 3886362a3e Revert "layouts: enable CWA [deploy]"
This reverts commit 609dac2ec4.
2020-12-11 15:29:31 +05:30
Harsh Shandilya 609dac2ec4 layouts: enable CWA [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-10 21:37:32 +05:30
Harsh Shandilya c999124e7d Update from Forestry.io
Harsh Shandilya updated content/posts/tips-for-building-kotlin-libraries.md
2020-12-08 08:03:19 +00:00
Harsh Shandilya 6c9630de05 all: update to my new Twitter username [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-05 08:56:52 +05:30
Harsh Shandilya 0796d1d4b9 openring: remove [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-22 16:15:16 +05:30
Harsh Shandilya 97be4a8f8d assets: switch syntax highlighting theme to tango [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-22 16:01:32 +05:30
Harsh Shandilya b7b114a841 config: swallow errors during Twitter rendering
This allows the site to build offline, allowing me to write in peace

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-22 15:51:40 +05:30
Harsh Shandilya 1083e62a18 hugo: mark theme as a module
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 15:55:16 +05:30
Harsh Shandilya 5fe553b204 theme: update branch
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 15:50:29 +05:30
Harsh Shandilya 23e2e40389 content: tweak some wording [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 14:42:35 +05:30
Harsh Shandilya a7bf8ee8c5 themes: remove hugo-cloak-email [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 14:33:17 +05:30
Harsh Shandilya f5f323761f content: add kotlin library tips post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 13:54:44 +05:30
Harsh Shandilya 4ab3465176 assets: add custom syntax highlighting [deploy]
Uses the colorful style from the pygments page

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 13:09:30 +05:30
Harsh Shandilya 231e41ccff [deploy] layouts/baseof: ignore DNT virtue signal 2020-11-19 19:54:42 +05:30
Harsh Shandilya d2e39e2529 wrangler: extract BASE_URL into config
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-19 14:15:49 +05:30
Harsh Shandilya cc1d50f8e7 wrangler: leverage env and secrets
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-19 14:15:17 +05:30
Harsh Shandilya 67fba3aab6 github: add checks to prevent unnecessary runs
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:57:43 +05:30
Harsh Shandilya e87e1c8815 Remove stale files
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:38:42 +05:30
Harsh Shandilya 332e5f764b config: update for new realities
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:37:42 +05:30
Harsh Shandilya 76b0ade93d workers-site: bring back redirekt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:31:24 +05:30
Harsh Shandilya 52d476288f static: desperate hackery
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-17 08:57:33 +05:30
Harsh Shandilya 6d1cadacb7 Cleanup for Netlify departure
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-17 08:29:52 +05:30
Harsh Shandilya 8f22ec4e38 Switch deployment to Cloudflare Workers
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-17 08:16:43 +05:30
Harsh Shandilya a3daeef148 layouts/asciinema: test analytics event
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-10 09:28:08 +05:30
Harsh Shandilya dd0ae36456 layouts/baseof: define sa_event method for analytics event tracking
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-10 09:20:18 +05:30
Harsh Shandilya bd5288f4ed Fix formatting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-07 18:52:27 +05:30
Harsh Shandilya 27365ec680 themes/hyde: remove
It is time we parted ways

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-07 15:21:44 +05:30
Harsh Shandilya 7c448d3fca Tweak wording further 2020-11-06 18:00:17 +05:30
Harsh Shandilya 465b65d5fe Fix code sample 2020-11-06 17:53:37 +05:30
Harsh Shandilya 97781345ed Update language in GitHub Packages post 2020-11-06 17:52:36 +05:30
Harsh Shandilya 138dd2d254 themes/codex: allow posts to span wider across the screen
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-06 17:49:34 +05:30
Harsh Shandilya bbb0583846 Update GitHub packages post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-06 17:48:58 +05:30
Harsh Shandilya bf4dff9297 themes/codex: better highlight blockquotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-06 17:39:23 +05:30
Harsh Shandilya cbfc88f39f Update from Forestry.io
Harsh Shandilya updated content/posts/why-should-you-be-using-kotlin-s-explicit-api-mode-for-your-library-projects.md
2020-11-03 06:23:51 +00:00
Harsh Shandilya a505425f63 Update from Forestry.io - Updated Forestry configuration 2020-11-03 06:23:34 +00:00
Harsh Shandilya e0011ca936 README: update Netlify badge URL 2020-11-03 10:50:53 +05:30
Harsh Shandilya 183f33c740 Update from Forestry.io
Harsh Shandilya created content/posts/why-should-you-be-using-kotlin-s-explicit-api-mode-for-your-library-projects.md
2020-11-03 05:20:31 +00:00
Harsh Shandilya 0bdef56104 Update from Forestry.io
Harsh Shandilya created static/uploads/kotlin_800x320.png
2020-11-03 05:20:20 +00:00
github-actions[bot] c8247a1fef layouts: update openring data (#36)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-11-02 09:51:58 +05:30
github-actions[bot] eb731b414a layouts: update openring data (#35)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-11-01 10:17:03 +05:30
Harsh Shandilya 48df761ee2 Update from Forestry.io
Harsh Shandilya updated content/uses.md
2020-10-31 19:13:12 +00:00
github-actions[bot] af64fdbbc5 layouts: update openring data (#34)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-10-31 09:08:24 +05:30
github-actions[bot] b47a55b66f layouts: update openring data (#33)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-10-29 09:08:17 +05:30
Harsh Shandilya 103a7f3d3b github: patch openring update workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-28 11:38:23 +05:30
Harsh Shandilya d139a498aa scripts/openring: update sources
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-28 11:15:31 +05:30
github-actions[bot] 903d71f113 Periodic openring sync (#32)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-28 05:35:55 +05:30
github-actions[bot] 86714a76a4 layouts: update openring data (#31)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-26 12:18:08 +05:30
github-actions[bot] 691d70f1c2 layouts: update openring data (#30)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-25 11:36:17 +05:30
Harsh Shandilya dca4c04feb Add note about auto sync being rolled back
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-23 22:23:52 +05:30
Harsh Shandilya b382c9ca96 netlify: update Hugo
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:59:21 +05:30
Harsh Shandilya 5ce5ecb1a5 netlify: disable Algolia export plugin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:46:22 +05:30
Harsh Shandilya 43eb9c7554 Publish October release notes for APS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:34:12 +05:30
Harsh Shandilya 464c6443f5 Remove never-published post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:31:48 +05:30
Harsh Shandilya 8290baacde Add APS October release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:25:17 +05:30
Harsh Shandilya 4ae9147900 layouts: sync after merge
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-19 00:42:28 +05:30
Harsh Shandilya 7552259973 Merge branch 'master' of github.com:jakewies/hugo-theme-codex into src
* 'master' of github.com:jakewies/hugo-theme-codex:
  fix: toc overflow caused by improper css solution
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  Extract favicon into a partial
  Add rel-me to social links
  Fix browse-by-tag link
  layouts: Add markdown render hook to open links in new tab
  Update post-pagination.html
2020-10-19 00:40:08 +05:30
Jake Wiesler 8b3f2c89aa Merge pull request #136 from jakewies/fix-toc-overflow
Fix ToC overflow caused by visibility: hidden
2020-10-18 11:51:32 -04:00
Jake Wiesler e2fbbd1d19 fix: toc overflow caused by improper css solution 2020-10-18 11:49:07 -04:00
Jake Wiesler b566f98177 Merge pull request #135 from jakewies/all-contributors/add-skvale 2020-10-18 11:24:35 -04:00
allcontributors[bot] cba1e8cc99 docs: update .all-contributorsrc [skip ci] 2020-10-18 15:24:19 +00:00
allcontributors[bot] 42489d277e docs: update README.md [skip ci] 2020-10-18 15:24:18 +00:00
Jake Wiesler 991c083daf Merge pull request #118 from skvale/patch-1
Update post-pagination.html
2020-10-18 11:23:48 -04:00
Jake Wiesler 780787127c Merge pull request #121 from SanchithHegde/hooks-new-tab
layouts: Add markdown render hook to open links in new tab
2020-10-18 11:22:53 -04:00
Jake Wiesler 579182dfd7 Merge pull request #134 from jakewies/all-contributors/add-sdil 2020-10-18 11:18:00 -04:00
allcontributors[bot] 60c735f9df docs: update .all-contributorsrc [skip ci] 2020-10-18 15:17:48 +00:00
allcontributors[bot] acc7c04241 docs: update README.md [skip ci] 2020-10-18 15:17:47 +00:00
Jake Wiesler 2d80977413 Merge pull request #122 from sdil/master
Fix browse-by-tag link
2020-10-18 11:17:29 -04:00
Jake Wiesler d6a32151f2 Merge pull request #133 from jakewies/all-contributors/add-tommorris 2020-10-18 11:00:53 -04:00
allcontributors[bot] 91d7fdd60d docs: update .all-contributorsrc [skip ci] 2020-10-18 15:00:46 +00:00
allcontributors[bot] 621b854ad6 docs: update README.md [skip ci] 2020-10-18 15:00:45 +00:00
Jake Wiesler c3558ceca1 Merge pull request #129 from tommorris/patch-1 2020-10-18 11:00:26 -04:00
Jake Wiesler d2c28ab49c Merge pull request #132 from jakewies/all-contributors/add-wilsonehusin 2020-10-18 10:59:55 -04:00
allcontributors[bot] 3ab8982b81 docs: update .all-contributorsrc [skip ci] 2020-10-18 14:58:04 +00:00
allcontributors[bot] 18598c3f2e docs: update README.md [skip ci] 2020-10-18 14:58:03 +00:00
Jake Wiesler 37bca131f9 Merge pull request #131 from wilsonehusin/favicon-hooks
Extract favicon into a partial
2020-10-18 10:57:47 -04:00
Wilson E. Husin b05203c2e6 Extract favicon into a partial
- Backwards compatible with previous implementation
- Consumers can define their own favicon in parital, depending on their
  preference of render / source
2020-10-13 19:31:20 -07:00
github-actions[bot] 6518629457 layouts: update openring data (#29)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-07 05:45:11 +05:30
Harsh Shandilya ae45c9bd0d forestry: update
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-02 04:50:12 +05:30
Harsh Shandilya 610fda03f3 Caddyfile: remove
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-02 04:50:12 +05:30
Harsh Shandilya 382c09fc15 github: remove PR audit workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-02 04:50:12 +05:30
Tom Morris c5d00ccad1 Add rel-me to social links 2020-10-01 19:10:49 +01:00
github-actions[bot] cdeabb9ec1 Periodic openring sync (#28) 2020-09-30 11:40:46 +05:30
github-actions[bot] 904f6d628e layouts: update openring data (#27)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-29 06:22:17 +05:30
github-actions[bot] 7b5b4bdddd layouts: update openring data (#26)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-27 05:50:16 +05:30
github-actions[bot] 969601c8df layouts: update openring data (#25)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-26 11:25:25 +05:30
Harsh Shandilya 3a6a4f6892 layouts: add analytics
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-25 16:51:59 +05:30
github-actions[bot] 8237f67d79 layouts: update openring data (#24)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-25 10:10:44 +05:30
Harsh Shandilya 45efa06076 layouts: fix alternate outputs formatting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 22:26:19 +05:30
Harsh Shandilya 177cfc7de3 Weirdo 2020-09-24 15:48:24 +05:30
Harsh Shandilya 96f4a76fb3 Reword SSH key section of v1.12.0 relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 15:42:16 +05:30
Harsh Shandilya 4ef0843521 Tweak headings
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 15:34:04 +05:30
Harsh Shandilya 7b4ff06c15 Reword sponsors blurb
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 15:31:54 +05:30
Harsh Shandilya f6b71193f6 Publish relnotes for APS v1.12.0
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 15:29:34 +05:30
github-actions[bot] 2c6d9c0246 layouts: update openring data (#23)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-24 10:50:23 +05:30
Harsh Shandilya bc3cd3f91e Tweak wording
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 00:11:10 +05:30
Harsh Shandilya 74ebcd9e14 layouts: reword Sponsors blurb
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 00:01:45 +05:30
Harsh Shandilya 5327d10f0f ci: remove unused script
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-23 23:59:53 +05:30
Harsh Shandilya 84e9d6ef5d Add September release notes for APS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-23 23:59:36 +05:30
Harsh Shandilya 2f982731a7 Fix july post headings
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-21 21:27:55 +05:30
Harsh Shandilya 2b9e7e9814 static: fix redirect URL
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-21 13:44:04 +05:30
github-actions[bot] f5a0fd0a32 Periodic openring sync (#22)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-19 05:37:30 +05:30
github-actions[bot] 24bcc057fb layouts: update openring data (#21)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-15 10:10:21 +05:30
github-actions[bot] aa5cdee01d layouts: update openring data (#20)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-14 10:05:51 +05:30
github-actions[bot] 641efd1d3f layouts: update openring data (#19)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-13 11:21:46 +05:30
github-actions[bot] c42598c9af layouts: update openring data (#18)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-12 11:25:26 +05:30
Harsh Shandilya b338b8398c layouts: increase top margin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-09 11:55:53 +05:30
Harsh Shandilya e3be562888 layouts: add GitHub sponsors card
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-09 11:52:21 +05:30
github-actions[bot] edcf620757 layouts: update openring data (#17)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-09 06:38:24 +05:30
Harsh Shandilya 81eec68fc6 static: add another redirect case
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-08 14:16:05 +05:30
github-actions[bot] 61086f8dcf Periodic openring sync (#16) 2020-09-05 05:45:57 +05:30
Harsh Shandilya 3af9d3b1b9 Revert "[TEMP] github: run openring workflow on pushes to openring-test branch"
This reverts commit 079ba790a1.
2020-09-02 17:39:12 +05:30
Harsh Shandilya 01e3b60f81 github: update openring workflow to use a different PR action
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-02 17:39:12 +05:30
github-actions[bot] 9cf49afcf5 Periodic openring sync (#15) 2020-09-02 17:38:33 +05:30
Harsh Shandilya 4b370abb27 Don't repeat yourself
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-02 17:17:44 +05:30
Harsh Shandilya 079ba790a1 [TEMP] github: run openring workflow on pushes to openring-test branch
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-02 17:06:28 +05:30
Harsh Shandilya 878ffe4455 Publish SDKMAN post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-02 17:01:30 +05:30
Harsh Shandilya 79a87e5792 Add SDKMAN post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-31 22:08:22 +05:30
Harsh Shandilya 2882df0e55 netlify: exclude some files from algolia index
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-30 23:09:13 +05:30
Harsh Shandilya 7577649bc3 netlify: add algolia export plugin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-30 23:03:30 +05:30
Harsh Shandilya 9acb70b3a3 netlify: include basic configuration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-30 23:00:26 +05:30
Harsh Shandilya cb31e5e5d4 Revert "layouts: remove now needless standalone type"
Unfortunately the upstream variant still unconditionally includes
pagination which we do not want.

This reverts commit 32c63b7fbd.
2020-08-30 22:36:44 +05:30
Harsh Shandilya 3b14c74892 Remove commento
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 15:10:06 +05:30
Harsh Shandilya 603a4e5f25 Fixup
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 15:07:25 +05:30
Harsh Shandilya b377cc1159 Touch up posts to add some consistency
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:58:37 +05:30
Harsh Shandilya 159c40dbc3 Update README
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:54:52 +05:30
Harsh Shandilya 8e23bc4b71 Remove deployment workflow and update README
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:53:13 +05:30
Harsh Shandilya 28458e5ba7 Fix pastebin URLs in fzf post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:50:00 +05:30
Harsh Shandilya c04dc1730a static: add aps redirect
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:44:51 +05:30
Harsh Shandilya 10f8c86390 static: add repo redirect
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:39:10 +05:30
Harsh Shandilya fd1f958c51 static: remove commit redirect
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:38:36 +05:30
Harsh Shandilya da798db589 static: add redirects for Netlify
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:37:05 +05:30
Fadhil Yaacob 7f63494248 Fix browse-by-tag link 2020-08-22 10:33:35 +08:00
Harsh Shandilya eb0c85d2dc Publish APS August release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-19 10:46:02 +05:30
Harsh Shandilya 86b2973ff3 Reword release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-19 10:43:16 +05:30
Harsh Shandilya 76057dc8d5 Update release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-19 04:00:23 +05:30
Harsh Shandilya 9dc275c22a Caddyfile: drop proxy variant
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 23:12:52 +05:30
Harsh Shandilya bb3b2d7ded WIP APS August release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 22:30:11 +05:30
Harsh Shandilya feef21c418 fix formatting on july release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 22:07:20 +05:30
Harsh Shandilya f6cb9a023f Publish fd post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 17:59:09 +05:30
Harsh Shandilya 7fdccccbad Add fd post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-17 21:45:15 +05:30
Harsh Shandilya 0cd2e64906 github: fix task inputs for create-pull-request
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-17 11:18:43 +05:30
Harsh Shandilya 5425348c63 github: update openring workflow to use pull requests
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-15 21:54:31 +05:30
Sanchith Hegde 675564be42 layouts: Add markdown render hook to open links in new tab 2020-08-15 18:34:40 +05:30
GitHub Actions 25ad722b8a layouts: update openring 2020-08-15 00:02:12 +00:00
Harsh Shandilya 53ac370b0d github: fix job name
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 15:57:28 +05:30
Harsh Shandilya 433bbf9747 openring: tweak UI and regen
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 15:56:24 +05:30
GitHub Actions 419aa86a00 layouts: update openring 2020-08-14 00:02:30 +00:00
Harsh Shandilya 1801efabed openring: reduce width
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 02:53:27 +05:30
Harsh Shandilya 2edef02155 github: fixup openring update workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 02:53:17 +05:30
Harsh Shandilya 284e2e4dd5 scripts/openring: import feed list from my TT-RSS instance
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 02:45:32 +05:30
Harsh Shandilya e2a164e1a0 layouts: rollback openring from prod deployment
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:48:03 +05:30
Harsh Shandilya cb987597eb assets: kill post footer top padding
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:29:03 +05:30
Harsh Shandilya 9e0512fb53 openring: touch up layout
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:23:14 +05:30
Harsh Shandilya 7f2abb5a7c layouts: sync openring
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:16:17 +05:30
Harsh Shandilya e844bb4b29 scripts/openring: include Pascal's blog
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:15:45 +05:30
Harsh Shandilya 32c63b7fbd layouts: remove now needless standalone type
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:11:52 +05:30
Harsh Shandilya 67db3569a5 layouts: merge post date fix
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:11:32 +05:30
Harsh Shandilya 50d5aa6743 Merge remote-tracking branch 'codex/master' into src
* codex/master:
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: Document showPageTitleInTOC in README.md and config.toml
  Allow for omitting date on post
2020-08-12 22:09:24 +05:30
Harsh Shandilya e64d7cd33f layouts: include openring in single template
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:06:58 +05:30
Harsh Shandilya 0dd4933712 github: add a workflow for weekly update of openring data
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:06:33 +05:30
Harsh Shandilya 05f6395bff layouts: insert first openring data
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:06:15 +05:30
Harsh Shandilya 0352ad45ba openring: set up an initial framework
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:05:54 +05:30
Harsh Shandilya af62f14cc0 Fix typo and publish
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-11 20:24:54 +05:30
Harsh Shandilya 12be3013c2 Some cleanups
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-11 14:46:25 +05:30
Harsh Shandilya 4b5c9a8fdd Finish up fzf post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-11 03:56:40 +05:30
Sam Kvale 08df4d35e2 Update post-pagination.html 2020-08-10 09:35:52 -05:00
Harsh Shandilya 49e146bea4 Get going on fzf
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-10 03:55:44 +05:30
Jake Wiesler 559ccfe896 Merge pull request #117 from jakewies/all-contributors/add-SanchithHegde 2020-08-09 16:54:15 -04:00
allcontributors[bot] fa4917a862 docs: update .all-contributorsrc [skip ci] 2020-08-09 20:54:06 +00:00
allcontributors[bot] f803ef038f docs: update README.md [skip ci] 2020-08-09 20:54:05 +00:00
Jake Wiesler 074ca10ea0 Merge pull request #113 from SanchithHegde/doc-toc-title
docs: Document showPageTitleInTOC in README.md and config.toml
2020-08-09 16:53:49 -04:00
Jake Wiesler fbc9dd4910 Merge pull request #116 from jakewies/all-contributors/add-jdl031 2020-08-09 16:52:43 -04:00
allcontributors[bot] e7cb0c3b4d docs: update .all-contributorsrc [skip ci] 2020-08-09 20:52:36 +00:00
allcontributors[bot] 586796bc0b docs: update README.md [skip ci] 2020-08-09 20:52:35 +00:00
Jake Wiesler b2988e0034 Merge pull request #111 from jdl031/patch-1
Allow for omitting date on post
2020-08-09 16:52:17 -04:00
Sanchith Hegde 536efa0444 docs: Document showPageTitleInTOC in README.md and config.toml 2020-08-08 17:02:37 +05:30
Harsh Shandilya ddd4e0771a Expand tags
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-05 01:36:30 +05:30
Harsh Shandilya e47d272c62 Reword some things
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:44:26 +05:30
Harsh Shandilya 804504e429 Undraft post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:36:16 +05:30
Harsh Shandilya 48acc88999 Fix social image url
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:27:55 +05:30
Harsh Shandilya 7f04eabbbf Add first part of the 'Tools of the trade' series
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:23:00 +05:30
Harsh Shandilya 163bb6833e Caddyfile: update CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 13:07:50 +05:30
Harsh Shandilya 7a5fee64c9 layouts/shortcodes: add asciinema embed
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 12:41:25 +05:30
Harsh Shandilya be0b3595ad Merge remote-tracking branch 'codex/master' into src
* codex/master:
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  change hardcoded colors to  variable
  Add overrides.scss (#85)
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: Use iconOrder when stating desired icon order
2020-08-04 11:18:05 +05:30
Harsh Shandilya be04efa8b1 functions: remove
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 03:13:03 +05:30
Harsh Shandilya 77f1fd7eb0 functions: fixup urls
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 03:09:36 +05:30
Harsh Shandilya e5fdcfcf9b github: remove staging deploy
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 02:54:14 +05:30
Harsh Shandilya 5f1f7b715e functions: init
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 02:53:45 +05:30
Harsh Shandilya ed61d7c6f2 Init terminal deep dive post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-30 16:41:30 +05:30
Harsh Shandilya 83139c8068 Undraft APS v1.10.2 relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-30 14:51:35 +05:30
Harsh Shandilya 6cdb136163 Add relnotes for APS v1.10.2
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-30 14:29:47 +05:30
James Lloyd 5af0eb8056 Allow for omitting date on post
Previously, all posts had to show a date. If the `date:` attribute was removed from the md file, then something like "0000 Jan 01" would default. 

This is use for static pages that are not part of the blog structure, like a separate "about" or "contact" page.
2020-07-30 00:23:05 -06:00
Jake Wiesler 384b63ad68 Merge pull request #109 from jakewies/all-contributors/add-CER10TY 2020-07-29 09:39:59 -04:00
allcontributors[bot] 4523bd0fd3 docs: update .all-contributorsrc [skip ci] 2020-07-29 13:39:46 +00:00
allcontributors[bot] 99702951b3 docs: update README.md [skip ci] 2020-07-29 13:39:45 +00:00
Jake Wiesler 6513f7727d Merge pull request #108 from CER10TY/hardcoded-colors-fix
Change hardcoded colors to SCSS variable
2020-07-29 09:38:16 -04:00
Sören Johanson 9ce10c4044 change hardcoded colors to variable 2020-07-29 15:06:22 +02:00
Jake Wiesler 8ebb4ed202 Add overrides.scss (#85)
* feat: add overrides.scss

* docs: Update README

* refactor: fix naming

* refactor: scss vars
2020-07-29 17:02:52 +08:00
Prateek Punetha c5fc125f5a _config.toml: Fix about redirection (#14)
- When clicking on the about logo in the main menu, the site was not redirecting to about page

- This was happening because the about url in the _config.yml was set to '/'

--> Fix that by defining the about page url.

Signed-off-by: prateekpunetha <prateekpunetha@gmail.com>
2020-07-29 10:52:14 +05:30
Jake Wiesler f4cf317476 Merge pull request #105 from jakewies/all-contributors/add-SanchithHegde 2020-07-28 13:54:03 -04:00
allcontributors[bot] 8b80af25c5 docs: update .all-contributorsrc [skip ci] 2020-07-28 17:53:54 +00:00
allcontributors[bot] d27c041e9b docs: update README.md [skip ci] 2020-07-28 17:53:53 +00:00
Jake Wiesler 6d4433f74d Merge pull request #101 from SanchithHegde/fix-iconorder-config
docs: Use iconOrder when stating desired icon order
2020-07-28 13:53:34 -04:00
Harsh Shandilya c085c9b92b content: turn on table of contents for some posts
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-28 14:43:34 +05:30
Sanchith Hegde 4a113b268d docs: Use iconOrder when stating desired icon order 2020-07-24 23:47:20 +05:30
Harsh Shandilya 0869b7f1ec Publish 'Why upgrade Android?' to DEV
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-24 16:37:28 +05:30
Harsh Shandilya 6e8c534cab Add relnotes for APS v1.10.1
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 23:08:07 +05:30
Harsh Shandilya 4e23251f27 I can never get this right
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 13:34:05 +05:30
Harsh Shandilya 5fbc2aa344 Publish 'Why upgrade Android?'
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 13:18:18 +05:30
Harsh Shandilya 8c945a8b89 static: update social image
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 13:18:08 +05:30
Harsh Shandilya 2a2f27b7dd Fix release notes post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 10:13:42 +05:30
Harsh Shandilya 485c78ac9e Grammar nits
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 16:33:27 +05:30
Harsh Shandilya 494b1ec345 Publish APS July notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 15:14:09 +05:30
Harsh Shandilya 37c9c20160 use cloakemail shortcode
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:32:45 +05:30
Harsh Shandilya b5ebcfa46e Bump date for APS post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:19:50 +05:30
Harsh Shandilya 711db171ef Make url format consistent
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:19:30 +05:30
Harsh Shandilya 48fa0ab3c2 Add new post: Why upgrade Android?
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:19:08 +05:30
Harsh Shandilya 803bdf5eaf scripts/generate_post_skeleton: sort frontmatter keys
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 06:06:36 +05:30
Harsh Shandilya 9ffa66ade7 Merge remote-tracking branch 'codex/master' into src
* codex/master:
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
2020-07-22 05:08:38 +05:30
Jake Wiesler 208dc60b22 Merge pull request #99 from jakewies/all-contributors/add-dgnicholson 2020-07-21 16:29:20 -04:00
allcontributors[bot] bb015f2aad docs: update .all-contributorsrc [skip ci] 2020-07-21 20:29:00 +00:00
allcontributors[bot] 467e8aba40 docs: update README.md [skip ci] 2020-07-21 20:28:59 +00:00
Harsh Shandilya 301fe30ece Reword a few things in relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 01:58:45 +05:30
Jake Wiesler 38e7f880ec Merge pull request #97 from dgnicholson/move_anchor_to_top
Fix #92: Move anchor tag to top line in multiline heading
2020-07-21 16:28:45 -04:00
Harsh Shandilya c618033cfd Add sponsorship blurb to relnotes post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 01:41:33 +05:30
Harsh Shandilya 2033a7fa9e layouts/taxonomy: fix hardcoded /blog link
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 01:30:07 +05:30
Harsh Shandilya 11b5e9709d Merge branch 'move_anchor_to_top' of github.com:dgnicholson/hugo-theme-codex into src
* 'move_anchor_to_top' of github.com:dgnicholson/hugo-theme-codex:
  Update post.scss with _gen assets
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  use iconOrder when editing/stating desired icon order
  nav: fix aria attributes
2020-07-22 01:26:55 +05:30
dgnicholson a9079185d9 Update post.scss with _gen assets 2020-07-21 08:57:53 -07:00
Jake Wiesler 51cfd349a4 Merge pull request #96 from jakewies/all-contributors/add-ewenme 2020-07-21 11:36:36 -04:00
allcontributors[bot] 0a74d62139 docs: update .all-contributorsrc [skip ci] 2020-07-21 15:36:27 +00:00
allcontributors[bot] b7747b0077 docs: update README.md [skip ci] 2020-07-21 15:36:26 +00:00
Jake Wiesler 497b6cfb47 Merge pull request #91 from ewenme/patch-1
use iconOrder when editing/stating desired icon order
2020-07-21 11:36:00 -04:00
Harsh Shandilya bed5940815 Update relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-21 02:21:43 +05:30
Jake Wiesler 2c59b87a37 Merge pull request #93 from jakewies/all-contributors/add-msfjarvis 2020-07-20 16:22:17 -04:00
allcontributors[bot] 336c0c50f6 docs: update .all-contributorsrc [skip ci] 2020-07-20 20:20:42 +00:00
allcontributors[bot] e936b4077e docs: update README.md [skip ci] 2020-07-20 20:20:40 +00:00
Jake Wiesler 9aff1f4149 Merge pull request #90 from msfjarvis/fixup-aria-controls
nav: fix aria attributes
2020-07-20 16:20:24 -04:00
Harsh Shandilya 841a125437 Add draft for APS July release post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-20 19:26:26 +05:30
Harsh Shandilya 6cbb98d02e layouts: remove image render hook
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-20 19:11:01 +05:30
ewen 14d29775e8 use iconOrder when editing/stating desired icon order
I needed to set `iconOrder` when I wanted to edit the order of social icons. I think this example is clearer.
2020-07-19 15:00:38 +01:00
Harsh Shandilya 543916f14a nav: fix aria attributes
Lighthouse reports that the aria-controls attribute has an invalid value[1]. This
patch resolves it, fixing the lighthouse score[2].

1: https://github.com/msfjarvis/msfjarvis.dev/suites/933117726/artifacts/11488586
2: https://github.com/msfjarvis/msfjarvis.dev/suites/933157898/artifacts/11489135

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-18 21:49:48 +05:30
Harsh Shandilya 591a6d0ee2 themes/codex: try fixing aria attributes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-18 21:45:13 +05:30
Harsh Shandilya 6cefc0b26e content/uses: fix link to diskus
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-18 21:31:00 +05:30
Harsh Shandilya f821f9e8f3 Caddyfile: update CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 19:24:50 +05:30
Harsh Shandilya b0f8b250b5 Undraft BT post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 18:57:48 +05:30
Harsh Shandilya 68eb78ec54 content: remove breaking tag
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 18:56:02 +05:30
Harsh Shandilya b15649e9d8 Merge remote-tracking branch 'codex/master' into src
* codex/master:
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  Changed twitter:site and twitter:meta tags
2020-07-17 18:50:59 +05:30
Harsh Shandilya 0e6c314989 Add social image
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 18:23:55 +05:30
Harsh Shandilya 6f282048ad Revise wording
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 15:45:33 +05:30
Harsh Shandilya 3ba900578e Flesh out post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 15:37:21 +05:30
Jake Wiesler eef7584e41 Merge pull request #88 from jakewies/all-contributors/add-ProfessorLogout 2020-07-16 22:14:12 -04:00
allcontributors[bot] f447297957 docs: update .all-contributorsrc [skip ci] 2020-07-17 02:13:59 +00:00
allcontributors[bot] d8c5cae681 docs: update README.md [skip ci] 2020-07-17 02:13:58 +00:00
Jake Wiesler 04cb3f3d66 Merge pull request #86 from ProfessorLogout/master
Twitter Meta Tags
2020-07-16 22:13:38 -04:00
Harsh Shandilya 787c0f5466 Add initial draft
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:49:07 +05:30
Harsh Shandilya a70adc784c content/posts: fix build
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:37:11 +05:30
Harsh Shandilya 53010070b5 scripts/generate_post_skeleton: fixup date format
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:20:28 +05:30
Harsh Shandilya 692a54e23a content/posts: sort frontmatter keys
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:18:46 +05:30
Harsh Shandilya f1d4c98e0a Merge remote-tracking branch 'codex/master' into src
* codex/master:
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  layouts: add text/css MIME type to stylesheets
2020-07-17 01:04:50 +05:30
Marco Kamner 4592404816 Changed twitter:site and twitter:meta tags
Both should contain a twitter handle and not a url
This can now be achieved through config.toml
2020-07-15 15:35:52 +02:00
Jake Wiesler f3876e5906 Merge pull request #84 from jakewies/all-contributors/add-msfjarvis 2020-07-15 08:44:31 -04:00
allcontributors[bot] 8e60785bdf docs: update .all-contributorsrc [skip ci] 2020-07-15 12:44:00 +00:00
allcontributors[bot] 0980cc52de docs: update README.md [skip ci] 2020-07-15 12:43:59 +00:00
Jake Wiesler b0d0c4bf59 Merge pull request #83 from msfjarvis/mime-type
layouts: add text/css MIME type to stylesheets
2020-07-15 08:43:40 -04:00
Harsh Shandilya 3953020892 layouts: set MIME type in my overridden version
This reverts commit 284e447d24.
2020-07-15 15:59:25 +05:30
Harsh Shandilya 7f493143c3 layouts: add text/css MIME type to stylesheets
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 15:48:36 +05:30
Harsh Shandilya a79616ec5e Revert "layouts: reset to theme versions"
This reverts commit 11715fcfd1.
2020-07-15 15:02:58 +05:30
Harsh Shandilya fe7a4d7c41 Caddyfile: update CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 15:01:05 +05:30
Harsh Shandilya 284e447d24 themes/codex: add text/css MIME type
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 14:57:00 +05:30
Harsh Shandilya eccfbe3528 github/forestry: bump Hugo version
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 14:54:13 +05:30
Harsh Shandilya 80565893ab Revert "github: update for codex branch"
This reverts commit c837b676ca.
2020-07-15 14:51:04 +05:30
Harsh Shandilya 3b0d0b496e Tweak keywords
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 14:11:29 +05:30
Harsh Shandilya fdf0c32e7b Merge branch 'codex' into src
* codex: (159 commits)
  Revert "Don't use pygments"
  make wide code blocks/tables responsive
  feat: include build:example script (#77)
  Don't use pygments
  layouts: reset to theme versions
  Revert "Disable commento"
  Disable commento
  Revert "[skip prod] remove commento checks"
  github: update for codex branch
  docs: update README
  style: pagination icon filepath
  refactor: move svg icons to static/svg/
  [skip prod] more layout tweaks
  [skip prod] fix comments layout
  [skip prod] remove commento checks
  [skip prod] layouts: add back commento
  [skip prod] lowercase description
  [skip prod] use hugo-social-metadata for Twitter cards
  [skip prod] use categories rather than tags in post list sidebar
  [skip prod] drop pagination, tags and disqus in standalone
  ...
2020-07-15 13:40:20 +05:30
Harsh Shandilya 570cea3ff3 Revert "Don't use pygments"
This reverts commit c5ff5f25b5.
2020-07-14 21:35:31 +05:30
Harsh Shandilya 5bac9fde41 Merge remote-tracking branch 'codex/master' into codex
* codex/master:
  make wide code blocks/tables responsive
  feat: include build:example script (#77)
  docs: update README
  style: pagination icon filepath
  refactor: move svg icons to static/svg/
2020-07-14 21:35:03 +05:30
Jake Wiesler 9d6ad58ac5 Merge pull request #80 from kentnek/kent-fix-width
Make wide code blocks/tables responsive
2020-07-14 11:54:31 -04:00
kentnek ef92641d29 make wide code blocks/tables responsive 2020-07-14 22:47:38 +08:00
Jake Wiesler 1304113842 feat: include build:example script (#77) 2020-07-14 22:15:14 +08:00
Jake Wiesler 0e2dba65a8 Merge pull request #76 from jakewies/svg-filepath 2020-07-14 10:07:02 -04:00
Harsh Shandilya c5ff5f25b5 Don't use pygments
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 18:59:17 +05:30
Harsh Shandilya 11715fcfd1 layouts: reset to theme versions
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 18:56:54 +05:30
Harsh Shandilya 0ae39df5df Revert "Disable commento"
Doesn't fix the problem

This reverts commit 576cfa993e.
2020-07-14 16:08:56 +05:30
Harsh Shandilya 576cfa993e Disable commento
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 16:06:46 +05:30
Harsh Shandilya c17fbf892b Revert "[skip prod] remove commento checks"
This reverts commit c573db5ac5.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 16:06:30 +05:30
Harsh Shandilya c837b676ca github: update for codex branch
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 11:17:38 +05:30
Jake Wiesler 9b1f99fc41 docs: update README 2020-07-13 22:23:33 -04:00
Jake Wiesler d5c7d3c16b style: pagination icon filepath 2020-07-13 22:23:06 -04:00
Jake Wiesler d02539d24f refactor: move svg icons to static/svg/ 2020-07-13 22:22:42 -04:00
Harsh Shandilya 0354e6ce74 Fix typo in Rust post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 22:56:32 +05:30
Harsh Shandilya 1f110c0a67 [skip prod] more layout tweaks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:10:59 +05:30
Harsh Shandilya 47610d5c8d [skip prod] fix comments layout
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:08:55 +05:30
Harsh Shandilya c573db5ac5 [skip prod] remove commento checks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:06:19 +05:30
Harsh Shandilya 88715a4281 [skip prod] layouts: add back commento
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:02:58 +05:30
Harsh Shandilya 8ea4f129f7 [skip prod] lowercase description
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 02:33:43 +05:30
Harsh Shandilya 45ffcbf9f4 [skip prod] use hugo-social-metadata for Twitter cards
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 19:48:55 +05:30
Harsh Shandilya 7d84927301 [skip prod] use categories rather than tags in post list sidebar
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 19:41:35 +05:30
Harsh Shandilya 363804d6b9 [skip prod] drop pagination, tags and disqus in standalone
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 19:19:51 +05:30
Harsh Shandilya 993ee84269 [skip prod] bring back standalone type
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 19:16:59 +05:30
Harsh Shandilya bb717ef3ee [skip prod] Switch to Codex
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 03:24:45 +05:30
Harsh Shandilya 9f9fce4b9a Merge remote-tracking branch 'codex/master' into src
* codex/master: (137 commits)
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  Fix nav display error when expanding window with open burger.
  fix icon sizes
  docs: update .all-contributorsrc [skip ci]
  docs: update README.md [skip ci]
  Conform icons to Google's mobile usability reqs
  fix relative icon issue + add title
  docs: Clean up README and config.toml (#65)
  update screenshot and add to README
  v1.5.0
  added resources folder back
  refactor: revert md/js files
  refactor: use semicolon in js
  refactor: ignore exampleSite/content dir
  change bottom padding of pages to 1rem
  update CONTRIBUTING.md
  add prettier
  v1.4.0
  fix script block
  ...

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 03:09:52 +05:30
Harsh Shandilya d7469a0e23 Add social image to Rust post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 02:18:23 +05:30
Harsh Shandilya 9b8a65c8ab Publish 'Simple tricks for faster Rust programs'
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 01:49:36 +05:30
Harsh Shandilya e9d3419a7c Add more content to the Rust post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 01:41:07 +05:30
Harsh Shandilya a44a1ae030 Write about cows
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 01:32:10 +05:30
Jake Wiesler 9fae997ac5 Merge pull request #72 from jakewies/all-contributors/add-dgnicholson 2020-07-08 08:26:23 -04:00
allcontributors[bot] 92ffb6ef82 docs: update .all-contributorsrc [skip ci] 2020-07-08 12:26:14 +00:00
allcontributors[bot] 997dbb0a20 docs: update README.md [skip ci] 2020-07-08 12:26:13 +00:00
Jake Wiesler c459d3dba9 Merge pull request #71 from dgnicholson/fix-active-nav-width
Fix nav display error when expanding window with open burger.
2020-07-08 08:25:49 -04:00
dgnicholson 811bd0431f Fix nav display error when expanding window with open burger. 2020-07-07 20:26:04 -07:00
Jake Wiesler d133435894 Merge pull request #70 from kentnek/kent-fix-icon-size 2020-07-05 21:51:56 -04:00
kentnek 2de5554489 fix icon sizes 2020-07-06 04:38:47 +08:00
Jake Wiesler a96cdc82de Merge pull request #68 from jakewies/all-contributors/add-aareet 2020-07-05 15:57:05 -04:00
allcontributors[bot] e18f5db9b9 docs: update .all-contributorsrc [skip ci] 2020-07-05 19:56:55 +00:00
allcontributors[bot] aced26410d docs: update README.md [skip ci] 2020-07-05 19:56:54 +00:00
Jake Wiesler 7f0166ba8a Merge pull request #67 from aareet/patch-1 2020-07-05 15:56:35 -04:00
Aareet Shermon 918c65178e Conform icons to Google's mobile usability reqs 2020-07-05 12:33:21 -07:00
Harsh Shandilya 21808828bb Add first draft of Rust perf post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-05 17:37:42 +05:30
Harsh Shandilya cb50d90c5e assets/css: add border around code blocks
[purge cache]

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-05 17:26:46 +05:30
Harsh Shandilya 4e51cb352b scripts: use env-backed shebang
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-05 15:22:00 +05:30
Jake Wiesler 0b99d0e779 Merge pull request #66 from kentnek/kent-fix-urls
Fix relative icon issue + add title
2020-07-04 14:20:29 -04:00
kentnek cd9ad33d88 fix relative icon issue + add title 2020-07-05 02:18:37 +08:00
Jake Wiesler b1070fe6a6 docs: Clean up README and config.toml (#65)
* docs: Clean up README and config.toml

* refactor: update line number
2020-07-05 02:05:26 +08:00
Harsh Shandilya 9056f6b543 static: update resume
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-04 19:33:57 +05:30
Jake Wiesler 76d09e8e7e Merge pull request #63 from kentnek/kent-add-screenshot
Update screenshot and add to README
2020-07-02 17:54:18 -04:00
kentnek 82e1a4c198 update screenshot and add to README 2020-07-03 01:54:48 +08:00
Jake Wiesler c5fec1b2cd v1.5.0 2020-07-02 10:03:58 -04:00
Jake Wiesler 654d426c64 Merge pull request #62 from kentnek/kent-fix-demo
Add resources folder back
2020-07-02 08:19:01 -04:00
kentnek ca4c648abe added resources folder back 2020-07-02 20:12:04 +08:00
Kent 678fcb73d8 Merge pull request #57 from jakewies/prettier
Add prettier
2020-07-01 02:53:44 +08:00
Jake Wiesler 8cf1971dcd refactor: revert md/js files 2020-06-28 21:59:54 -04:00
Harsh Shandilya 32996b9afd Escape HTML correctly in images
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-28 21:19:33 +05:30
Harsh Shandilya 8eeb899f8a layouts/sidebar: bring back description
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-28 20:06:28 +05:30
Jake Wiesler b07965d36f Merge pull request #59 from kentnek/kent-fix-bottom-padding
Fix #58: excessing bottom padding
2020-06-27 18:39:06 -04:00
Jake Wiesler 39733768aa refactor: use semicolon in js 2020-06-27 18:39:04 -04:00
Jake Wiesler daaa4504e0 refactor: ignore exampleSite/content dir 2020-06-27 18:38:49 -04:00
kentnek 5606034ae2 change bottom padding of pages to 1rem 2020-06-28 04:35:06 +08:00
Jake Wiesler fc2dbc46d8 update CONTRIBUTING.md 2020-06-27 10:56:37 -04:00
Jake Wiesler 51fa4ecebb add prettier
Prettier has been added as a dev dependency along with a few other tools
that run prettier on staged files before committing them. This prevents
any file from being committed that hasn't gone through the project's
formatting. Check the prettier.config.js file for details on how we
format files.
2020-06-27 10:53:50 -04:00
Jake Wiesler 5330f3dfeb v1.4.0 2020-06-27 10:14:02 -04:00
Jake Wiesler ef51f8da14 Merge pull request #56 from jakewies/fix-scripts 2020-06-27 10:08:07 -04:00
Jake Wiesler 5edc60ced3 fix script block 2020-06-27 10:09:02 -04:00
Jake Wiesler 143b59988e Merge pull request #55 from jakewies/all-contributors/add-xvallspl 2020-06-27 10:04:13 -04:00
allcontributors[bot] d0507b8bcc docs: update .all-contributorsrc [skip ci] 2020-06-27 14:04:04 +00:00
allcontributors[bot] 0c13d413f9 docs: update README.md [skip ci] 2020-06-27 14:04:03 +00:00
Jake Wiesler 06ce561652 Merge pull request #10 from xvallspl/TableOfContents 2020-06-27 10:03:25 -04:00
Jake Wiesler 7bdddfb999 Merge branch 'master' into TableOfContents 2020-06-27 10:00:42 -04:00
Jake Wiesler cfee586edd update single.html 2020-06-27 10:00:52 -04:00
Jake Wiesler 8b85261f45 update README 2020-06-26 09:36:14 -04:00
Jake Wiesler 2b138baf44 docs: document toc on desktop only 2020-06-26 09:27:37 -04:00
Jake Wiesler 941d012611 refactor: check toc in post frontmatter 2020-06-26 09:22:38 -04:00
Harsh Shandilya 98f5c09bfb assets/css: switch to borland theme for syntax highlighting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-26 18:10:10 +05:30
Harsh Shandilya 68d8a3b46b Remove dark theme
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-26 18:08:11 +05:30
Harsh Shandilya 68c5b79936 Caddyfile: fix CSP derp
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-26 17:53:05 +05:30
kentnek 8f9fa41512 add option to show/hide title in TOC, and add margin-bottom to title 2020-06-26 00:40:58 +08:00
Jake Wiesler 9ea3be7d21 refactor: add post-title to ToC 2020-06-25 12:21:47 -04:00
Jake Wiesler 970d27c330 refactor: ToC styles
This commit includes a few adjustments to the layout of a post in order
to accommodate an optional ToC. The layout adjustments have been done in
such a way in order to mitigate as much visual differences between a post
with a ToC and and post without ToC as possible.
2020-06-25 10:57:09 -04:00
Xavier Valls Pla 8e0ba00192 simplify toc and remove post title from it
Highlight all sections on sight instead of last one to intersect
2020-06-25 15:56:49 +02:00
Xavier Valls Pla 83cb7d2079 hide the toc at 1k px 2020-06-25 15:39:09 +02:00
Xavier Valls Pla 6b75895a9d fix indentation 2020-06-25 15:35:11 +02:00
Xavier Valls Pla f47a0f4ff6 reduce time complexity of toc highlighting
and solve no highlighting when heading not on sight
2020-06-25 15:34:19 +02:00
Kent 77e4928fc2 Merge pull request #52 from jakewies/all-contributors/add-jlebar
docs: add jlebar as a contributor
2020-06-25 02:11:41 +08:00
allcontributors[bot] d38d0a3821 docs: update .all-contributorsrc [skip ci] 2020-06-24 18:11:16 +00:00
allcontributors[bot] f74adad26d docs: update README.md [skip ci] 2020-06-24 18:11:15 +00:00
Kent 00de15707e Merge pull request #50 from jlebar/prismjs
Change how prismjs is loaded.
2020-06-25 02:10:47 +08:00
Xavier Valls Pla 136f700b91 load the toc js conditionally 2020-06-24 19:04:08 +02:00
Justin Lebar da505aa0f5 Change how prismjs is loaded.
- Load minified code (3kB vs 30kB)
 - Add prism autoloader so that we get highlighting for languages we
   use.
 - Hardcode exact prism version.  Perhaps this is controversial, but it
   saves a redirect for each request, shaving off 30ms on a fast
   connection.
2020-06-24 10:03:08 -07:00
Jake Wiesler 253ed0d133 Merge pull request #49 from jakewies/all-contributors/add-pyvain 2020-06-24 12:58:51 -04:00
allcontributors[bot] 56f94e2aa3 docs: update .all-contributorsrc [skip ci] 2020-06-24 16:58:36 +00:00
allcontributors[bot] a8a0138269 docs: update README.md [skip ci] 2020-06-24 16:58:35 +00:00
Jake Wiesler 362ab606ea Merge pull request #48 from pyvain/master
Rename /static/icons to /static/images/social
2020-06-24 12:58:16 -04:00
Xavier Valls Pla 763a218011 restructure the single post
post pagination was not correctly aligned, which helped see that the structure
2020-06-24 18:45:03 +02:00
Xavier Valls Pla 5dcd8b937b Document the toc parameter 2020-06-24 18:37:14 +02:00
Xavier Valls Pla fe927df7a8 make the toc optional 2020-06-24 18:37:02 +02:00
Xavier Valls Pla 432a6da204 add the post title into the toc 2020-06-24 18:35:33 +02:00
Xavier Valls Pla c6433ee574 signal in toc the current section 2020-06-24 18:34:50 +02:00
Xavier Valls Pla ab2ca2cbc9 add table of contents to post 2020-06-24 18:31:03 +02:00
Pyvain dec266a2e9 update readme section for new social icons 2020-06-24 18:28:11 +02:00
Pyvain 48cc567831 pagination chevron is just an image 2020-06-24 18:18:03 +02:00
Pyvain 58ec6d7807 move social icons to /static/images/social/ for better compatibility with Apache2 (Issue #47) 2020-06-24 17:37:58 +02:00
Harsh Shandilya f0a1d2116c layouts/sidebar: replace description with GitHub Sponsors iframe
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-24 20:39:23 +05:30
Harsh Shandilya ce15cd5f70 Caddyfile: sync from server-config
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-24 20:35:05 +05:30
Jake Wiesler 0fc16261bf Merge pull request #45 from kentnek/kent-disqus-ga 2020-06-24 09:44:38 -04:00
kentnek 1bd2a38771 add support for disqus and Google Analytics 2020-06-24 15:39:32 +08:00
Jake Wiesler 081033d71f Merge pull request #44 from kentnek/kent-raw-html 2020-06-23 15:30:49 -04:00
kentnek 8e032ada3a fix cite example 2020-06-24 00:20:59 +08:00
kentnek 9b625b55a3 modify blockquote style 2020-06-24 00:19:05 +08:00
kentnek 42e02fa004 enable raw HTML by default and add some styling 2020-06-23 23:50:13 +08:00
Jake Wiesler 7eb26ab371 Merge pull request #43 from kentnek/kent-date-format 2020-06-23 11:30:41 -04:00
kentnek a29b792bd4 add docs to config 2020-06-23 23:21:46 +08:00
kentnek 1004a391df make dateFormat configurable 2020-06-23 23:20:02 +08:00
Jake Wiesler 9c1b6ac916 v1.3.0 2020-06-23 10:35:00 -04:00
Jake Wiesler 787bbdf347 Merge pull request #42 from kentnek/kent-update-title
Fix site's title to be more SEO friendly
2020-06-23 10:29:53 -04:00
Jake Wiesler 217015811a Merge pull request #40 from kentnek/kent-social-icons 2020-06-23 10:29:07 -04:00
kentnek e426b2ae29 fix title 2020-06-23 22:24:43 +08:00
kentnek 10918ecd1b fix readme 2020-06-23 21:51:36 +08:00
kentnek 1d624b2705 Add more social icons, and an easy way to configure them 2020-06-23 21:48:49 +08:00
Jake Wiesler 3f3dfbfb6a Merge pull request #39 from kentnek/kent-add-docs-hugo-extended 2020-06-22 16:12:30 -04:00
kentnek 841e9e326f surround choco in code block 2020-06-23 04:00:19 +08:00
kentnek 290b843431 explain more on hugo-extended, and sprinkle in some emojis 2020-06-23 03:58:30 +08:00
Jake Wiesler 6c7ee83f33 Merge pull request #38 from jakewies/all-contributors/add-kentnek 2020-06-22 15:49:17 -04:00
allcontributors[bot] 27c9b5f58b docs: update .all-contributorsrc [skip ci] 2020-06-22 19:49:09 +00:00
allcontributors[bot] da186bbf4b docs: update README.md [skip ci] 2020-06-22 19:49:08 +00:00
Jake Wiesler 6ade15669d Merge pull request #37 from jakewies/all-contributors/add-kentnek 2020-06-22 15:48:35 -04:00
allcontributors[bot] 9c244a0426 docs: update .all-contributorsrc [skip ci] 2020-06-22 19:48:28 +00:00
allcontributors[bot] 785b248b32 docs: update README.md [skip ci] 2020-06-22 19:48:27 +00:00
Jake Wiesler 31cb5bd72e v1.2.1 2020-06-22 15:47:24 -04:00
Jake Wiesler fb378fa6a2 Merge pull request #36 from kentnek/kent-fix-resources-links 2020-06-22 15:45:10 -04:00
kentnek a8aa6e7ecc use RelPermalink instead of Permalink 2020-06-23 03:38:36 +08:00
Jake Wiesler 6abff093cc v1.2.0 2020-06-22 10:43:03 -04:00
Jake Wiesler a3e524234c Merge pull request #33 from kentnek/kent-scss 2020-06-22 10:20:14 -04:00
kentnek 112a5a17dd - remove static/css, static/js and yarn.lock
- specify output for generated css resources to "css/"
- update documentations
2020-06-22 03:27:41 +08:00
kentnek e36a5cd65a fix heading styles (#28) and remove stylus files 2020-06-21 05:30:31 +08:00
kentnek d251fde9fb migrate to SCSS 2020-06-21 05:19:49 +08:00
Jake Wiesler 07b5416e26 Merge pull request #30 from jakewies/all-contributors/add-xvallspl 2020-06-19 15:28:00 -04:00
allcontributors[bot] 487974f9fb docs: update .all-contributorsrc [skip ci] 2020-06-19 19:27:51 +00:00
allcontributors[bot] 544c84c231 docs: update README.md [skip ci] 2020-06-19 19:27:50 +00:00
Jake Wiesler b390fe8cb4 Merge pull request #17 from xvallspl/master
update CONTRIBUTING.md
2020-06-19 15:27:34 -04:00
Jake Wiesler c8083886a9 Merge pull request #29 from kentnek/kent-default-list-single
Moving list and single templates to _default
2020-06-19 15:26:20 -04:00
kentnek 37ce67b758 moving list and single templates to _default 2020-06-20 03:19:28 +08:00
Jake Wiesler 53ceca769e 1.1.0 2020-06-19 09:17:10 -04:00
Jake Wiesler ce072a6e34 Merge pull request #27 from jakewies/all-contributors/add-jakewies 2020-06-19 08:54:29 -04:00
allcontributors[bot] d35ed24328 docs: update .all-contributorsrc [skip ci] 2020-06-19 12:54:14 +00:00
allcontributors[bot] 383c6c5e8d docs: update README.md [skip ci] 2020-06-19 12:54:13 +00:00
Jake Wiesler 7dbfdb3422 Merge pull request #26 from jakewies/update-readme
update README
2020-06-19 08:53:56 -04:00
Jake Wiesler c83f35b5f6 update README 2020-06-19 08:54:30 -04:00
Jake Wiesler 4bd7e7a4a9 Merge pull request #25 from jakewies/all-contributors/add-somaniarushi 2020-06-19 08:40:19 -04:00
allcontributors[bot] 4c090ab31e docs: update .all-contributorsrc [skip ci] 2020-06-19 12:40:03 +00:00
allcontributors[bot] 2174c53e1b docs: update README.md [skip ci] 2020-06-19 12:40:02 +00:00
Jake Wiesler 6413a642f3 Merge pull request #24 from jakewies/all-contributors/add-jakewies 2020-06-19 08:39:21 -04:00
Jake Wiesler 7149dbd4f8 Update README.md 2020-06-19 08:39:11 -04:00
Jake Wiesler 6fcb8e9e6e Update .all-contributorsrc 2020-06-19 08:38:21 -04:00
allcontributors[bot] dce37005f4 docs: update .all-contributorsrc [skip ci] 2020-06-19 12:37:54 +00:00
allcontributors[bot] 0eeada4dbf docs: update README.md [skip ci] 2020-06-19 12:37:53 +00:00
Jake Wiesler 2dce74f485 Merge pull request #23 from jakewies/all-contributors/add-kentnek 2020-06-19 08:36:34 -04:00
allcontributors[bot] feea6248d4 docs: update .all-contributorsrc [skip ci] 2020-06-19 12:36:26 +00:00
allcontributors[bot] 3f84a99068 docs: update README.md [skip ci] 2020-06-19 12:36:25 +00:00
Jake Wiesler bd7252fdbd Merge pull request #22 from jakewies/all-contributors/add-chuxinh 2020-06-19 08:35:56 -04:00
allcontributors[bot] c4ccb06d34 docs: update .all-contributorsrc [skip ci] 2020-06-19 12:35:04 +00:00
allcontributors[bot] 8d93ce95f8 docs: update README.md [skip ci] 2020-06-19 12:35:03 +00:00
allcontributors[bot] f31eb2eddd docs: update .all-contributorsrc [skip ci] 2020-06-19 12:33:35 +00:00
allcontributors[bot] f6f9189ff8 docs: update README.md [skip ci] 2020-06-19 12:33:34 +00:00
Jake Wiesler 14454a7fd7 Merge pull request #20 from jakewies/all-contributors/add-chuxinh 2020-06-19 08:32:30 -04:00
Jake Wiesler 402cb24977 Update README.md 2020-06-19 08:32:03 -04:00
allcontributors[bot] b40ecac59d docs: create .all-contributorsrc [skip ci] 2020-06-19 12:30:15 +00:00
allcontributors[bot] 259940d4b6 docs: update README.md [skip ci] 2020-06-19 12:30:14 +00:00
Jake Wiesler 96917854f7 Merge pull request #19 from kentnek/master
Add support for creating new sections
2020-06-19 08:22:36 -04:00
Xavier Valls Pla ba5619ac21 update CONTRIBUTING file 2020-06-19 08:36:55 +02:00
kentnek 24ec6b0d2d add support for creating new sections 2020-06-19 03:41:02 +08:00
Jake Wiesler c0de0b0e86 1.0.0 2020-06-17 11:50:55 -04:00
Jake Wiesler 02b7d5f354 Merge pull request #16 from jakewies/fixes 2020-06-17 11:46:46 -04:00
Jake Wiesler 9c256507a2 docs: update README 2020-06-17 11:28:10 -04:00
Jake Wiesler ec0f3ff3bd refactor: move all config to exampleSite 2020-06-17 11:16:57 -04:00
Jake Wiesler 42e5ab2a2c refactor: use prismjs from unpkg 2020-06-17 11:10:18 -04:00
Jake Wiesler fb465a64aa 0.3.0 2020-06-17 09:03:29 -04:00
Jake Wiesler a1d87ee795 Merge pull request #13 from jakewies/asset-pipeline 2020-06-17 08:57:37 -04:00
Jake Wiesler 6ec926aa2e docs: update CONTRIBUTING.md 2020-06-17 08:53:04 -04:00
Jake Wiesler fdcf780d31 docs: add CONTRIBUTING.md 2020-06-17 08:49:47 -04:00
Jake Wiesler f2d4ad2e83 feat: add asset pipepline 2020-06-17 08:40:53 -04:00
Jake Wiesler 93d3108f28 Merge pull request #12 from jakewies/remove-default-content 2020-06-17 07:48:39 -04:00
Jake Wiesler b35d2834e9 update: README 2020-06-16 14:04:51 -04:00
Jake Wiesler 0e942de96c update: README 2020-06-16 14:04:22 -04:00
Jake Wiesler 521a24d4f9 refactor: remove default content 2020-06-16 13:59:27 -04:00
Jake Wiesler 91dfbf0bef Merge pull request #9 from jakewies/default-content 2020-06-15 11:03:01 -04:00
Jake Wiesler 70398ca253 fix: update filies 2020-06-15 10:47:36 -04:00
Jake Wiesler f41622c551 feat: add default content 2020-06-15 10:34:39 -04:00
Jake Wiesler 837dbec6ad Merge pull request #5 from somaniarushi/master
Update README.md to correct module addition
2020-06-11 21:55:13 -04:00
Arushi Somani dc40052b2a Update README.md 2020-06-11 18:39:41 -07:00
Jake Wiesler 1089badf54 update: theme.toml 2020-06-09 09:08:40 -04:00
Jake Wiesler c89d692c5a update: hugo min version in theme.toml 2020-06-09 09:07:06 -04:00
Jake Wiesler 80d5528e22 Merge pull request #4 from chuxinh/chuxin-readme
Updating README
2020-06-08 09:32:52 -04:00
Chuxin Huang 5da32d4125 update readme 2020-06-08 19:47:03 +10:00
Chuxin Huang 4892a067e0 update readme 2020-06-08 19:45:16 +10:00
Harsh Shandilya 513cdc25d3 fix double notice
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-06 12:59:16 +05:30
Harsh Shandilya ceef1ca8e5 Update GitHub Packages post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-06 12:56:37 +05:30
Jake Wiesler 44bdbcabc7 docs: update README 2020-06-05 12:00:03 -04:00
Jake Wiesler 441138a4e8 docs: update README 2020-06-05 11:59:04 -04:00
Jake Wiesler 2edcaa0089 Update README.md 2020-06-05 11:44:35 -04:00
Jake Wiesler 1e4c6ef1f8 Update README.md 2020-06-05 11:44:14 -04:00
Jake Wiesler 3932f2bb2a Update README.md 2020-06-05 11:41:47 -04:00
Jake Wiesler 9029d04c00 docs: update README 2020-06-05 11:32:11 -04:00
Jake Wiesler dd583001f5 docs: add comment about social handles 2020-06-05 11:30:54 -04:00
Jake Wiesler 3cbeca7e93 docs: add comment about why theme is declared the way it is in example 2020-06-05 11:28:32 -04:00
Jake Wiesler 38adcb2bd7 update image sizes 2020-06-05 11:19:28 -04:00
Jake Wiesler 11a3c54206 update README 2020-06-05 11:14:45 -04:00
Jake Wiesler babed030c0 refactor: remove deps on _index pages 2020-06-05 10:55:22 -04:00
Jake Wiesler 5008682d46 Merge pull request #1 from chuxinh/chuxin-additions 2020-06-05 09:36:38 -04:00
Harsh Shandilya da43fb8493 #BlackLivesMatter
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-02 02:19:40 +05:30
Harsh Shandilya f04fbd0e26 layouts/partials: style
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-02 02:11:48 +05:30
Harsh Shandilya 341162b433 Revert "css: drop custom webfonts"
This reverts commit 104680611f.
2020-06-02 01:58:11 +05:30
Harsh Shandilya 15872c6a7d Revert "theme: simplify device dark theme detection"
This reverts commit 266835b881.
2020-06-02 01:58:08 +05:30
Harsh Shandilya 38c894c818 github: use hugo 0.71.1
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-30 13:59:54 +05:30
Harsh Shandilya ac76633bcd layouts: use heading render hook
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-30 13:59:24 +05:30
Vivek R df6c61bbaa Merge pull request #45 from obar/content-in-list-pages
Include front matter in home and list pages if provided
2020-05-24 06:49:43 +00:00
Vivek R 22c4cf4069 Merge pull request #51 from komish/make-pre-code-inline-block
render code blocks as inline-block to fix indentation/padding issue
2020-05-24 06:48:26 +00:00
Vivek R 706e712b37 Merge pull request #52 from komish/add-baseURL-to-head
adding base tag to header to fix static file linking
2020-05-24 06:48:05 +00:00
Harsh Shandilya 266835b881 theme: simplify device dark theme detection
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-22 20:37:46 +05:30
Jose R. Gonzalez b1f95401f8 adding base tag to header to fix static file linking 2020-05-17 16:22:39 -05:00
Harsh Shandilya 104680611f css: drop custom webfonts
[skip prod]

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-15 18:44:40 +05:30
Harsh Shandilya 9b5c22ad47 content: add social image to cf proxy post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-11 23:22:26 +05:30
Harsh Shandilya 3ee075eee0 Merge branch 'master' of github.com:msfjarvis/hugo-social-metadata into src
* 'master' of github.com:msfjarvis/hugo-social-metadata:
  layouts: simplify by dropping twitter keys with fallbacks

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-11 23:02:54 +05:30
Harsh Shandilya 89f3f87694 themes: delete hugo-social-metadata to re-merge correctly
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-11 23:02:26 +05:30
Harsh Shandilya e3be8f75e7 layouts: simplify by dropping twitter keys with fallbacks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-11 22:53:32 +05:30
Harsh Shandilya 4157698894 hyde: add a special case to account for smaller widths
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 20:30:39 +05:30
Harsh Shandilya 2ff4789198 tweak wording
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 18:49:42 +05:30
Harsh Shandilya 93ab98b10f single: remove tag view
this was ugly and I am a terrible dev

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 00:35:52 +05:30
Harsh Shandilya 55fca19b2e undraft new post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 00:32:36 +05:30
Harsh Shandilya 15e62708a5 Add new post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-08 23:50:41 +05:30
Harsh Shandilya ef8c1e649f uses: homebrew is gone
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-06 15:42:20 +05:30
Jose R. Gonzalez f0cf17ddea render code blocks as inline-block 2020-05-03 23:44:30 -05:00
Harsh Shandilya 5c4e6ad0b6 css: brighten inline code in dark theme
Improves legibility in low brightness

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-30 14:41:43 +05:30
Harsh Shandilya 9ebe2df091 github: remove directory before next run
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-29 20:08:46 +05:30
Harsh Shandilya 2eded4b165 uses: undraft
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-29 20:08:25 +05:30
Vivek R 71de6dec35 Merge pull request #46 from miteigi/upstream-patch/remove-ds-store
Remove .DS_Store file
2020-04-28 11:43:54 +05:30
Harsh Shandilya 0d1d3e10bd head: add correct type annotations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 05:10:10 +05:30
Harsh Shandilya 8b38a9b846 config: add uses link
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 00:13:47 +05:30
Harsh Shandilya bd1ad5e2de uses: flesh out some more
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 00:13:24 +05:30
Harsh Shandilya cfc9a2e76a themes/hyde: tweak table styling
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 00:02:56 +05:30
Harsh Shandilya 375376ee79 projects: grammar nit
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-25 08:55:55 +05:30
Harsh Shandilya a1fb877ca6 Add the rest of my hardware to the uses page
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-25 08:50:26 +05:30
Harsh Shandilya d02f37f273 WIP: uses.tech page
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 16:22:19 +05:30
Harsh Shandilya bf50f7b48f css: improve inline code styling
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 15:57:21 +05:30
Harsh Shandilya 1cd144519e move util scripts to subfolder
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 15:46:17 +05:30
Harsh Shandilya 43c0e0d059 assets: move custom syntax css out of theme dir
Also sync themes/hyde copy back to upstream.

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-22 20:43:28 +05:30
Harsh Shandilya 4cc8d3c5eb syntax: sync with hugo 0.69.1 output
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-22 20:37:24 +05:30
Harsh Shandilya aef95ce309 github: bump hugo version
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-22 20:34:47 +05:30
Harsh Shandilya ebb73f9d79 Add a Caddyfile to test CSP compatibility
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-20 00:26:06 +05:30
Harsh Shandilya 97f06d1085 Make theme switcher compliant with my new CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-20 00:23:38 +05:30
Harsh Shandilya 356efbe491 Publish purelymail post to dev.to
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-14 20:06:31 +05:30
Harsh Shandilya ab0872fe8b tweak purelymail post description
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:57:30 +05:30
Harsh Shandilya 438b986977 github: Fix cache-purge step
[skip deploy]

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:56:46 +05:30
Harsh Shandilya 1c19d39fb2 Publish purelymail post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:44:11 +05:30
Harsh Shandilya da6c308be0 tweak wording in purelymail post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:27:23 +05:30
Harsh Shandilya b790347878 layouts: remove trailing newlines in markup overrides
These add nbsp characters that look weird in pages

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:09:28 +05:30
Harsh Shandilya f0be40d519 Add draft for purelymail post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 18:45:42 +05:30
Harsh Shandilya caa65c64e9 github: Use Hugo 0.69.0
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-12 01:07:40 +05:30
Harsh Shandilya 4cdda9be49 layouts: make indexing logic match homepage
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-11 14:02:46 +05:30
Harsh Shandilya 0e9d28eb49 layouts: update RSS template to add consistent imagery
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-11 13:19:08 +05:30
Harsh Shandilya 46bea3798c layouts: add full content RSS template
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-11 13:11:11 +05:30
miteigi 3efd046872 Remove .DS_Store file 2020-03-19 19:43:55 +09:00
Harsh Shandilya 7f1cb6772f Update robots.txt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-15 17:23:28 +05:30
Harsh Shandilya ec4203dd3f Switch up syntax highlighting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-07 03:44:58 +05:30
Harsh Shandilya b404822f64 Publish Dagger post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 11:04:17 +05:30
Harsh Shandilya 4188812c31 Fix URL escaping
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:51:24 +05:30
Harsh Shandilya 02685759dd Link to code from Dagger part 2 post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:46:58 +05:30
Harsh Shandilya fdef60acc7 Tweak post width for desktop view
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:27:56 +05:30
Harsh Shandilya 770442e799 Remove unused code from baseof.html
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:19:49 +05:30
Harsh Shandilya cc50b317b1 Add Subcomponent.Factory note
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:14:04 +05:30
Harsh Shandilya 9fe3adee0c Update Dagger part 2 post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:10:14 +05:30
Harsh Shandilya f01a56ec24 Update public key
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-05 13:00:45 +05:30
Harsh Shandilya 52b6271e47 WIP dagger part 2 update
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-04 19:15:25 +05:30
Harsh Shandilya c02ac41be5 Clarify a bit more what scoping means
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-04 18:53:47 +05:30
Harsh Shandilya 64e994e307 Fix apple-touch-icon attribute
In accordance with https://webhint.io/scanner/ed2f1f14-28b5-4aad-b2a5-ba2822ec7e5d#hint-apple-touch-icons-1

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-04 18:19:09 +05:30
Harsh Shandilya 48187ac278 Fix syntax highlighting for SELinux post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-03 20:22:42 +05:30
Harsh Shandilya e011f9e687 Finish up Dagger post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-03 11:59:33 +05:30
Harsh Shandilya c5d231c8cd Make dark theme toggle inherit sidebar background
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-28 18:21:53 +05:30
Harsh Shandilya 902cd977a7 Ensure bold text is themed properly
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-28 11:57:03 +05:30
Harsh Shandilya b10fc85cb1 github: Upgrade to Hugo 0.65.3
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 23:51:19 +05:30
Harsh Shandilya 277aea1a3e Revert "Setup Carbon ads"
And so ends the experiment.

This reverts commit 2e86a91ac7.
2020-02-26 23:44:21 +05:30
Harsh Shandilya 8f4029f5f7 [skip deploy] Update workflow name
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 18:41:56 +05:30
Harsh Shandilya 0dfea94da7 github: Add a way to run the CF cache buster
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 18:36:31 +05:30
Harsh Shandilya 32eaf59798 css/fonts: Set font-display: swap
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 10:33:10 +05:30
Harsh Shandilya 2e86a91ac7 Setup Carbon ads
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 10:33:10 +05:30
Harsh Shandilya d4011af9e1 Tweak CSS location
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 20:04:26 +05:30
Harsh Shandilya 8d80730efa Remove Internet Explorer compat hacks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 19:25:27 +05:30
Harsh Shandilya 6079f00dc6 partials/head: Load fonts stylesheet separately
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 19:18:46 +05:30
Harsh Shandilya 597735fcb1 Update my public key
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 18:57:20 +05:30
Harsh Shandilya f196d2f115 Deploy to prod
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-23 21:22:21 +05:30
Harsh Shandilya 78a8e76fb7 [skip prod] Add rel="noreferrer" to links
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-23 15:27:49 +05:30
Harsh Shandilya a1e0565a77 [skip prod] Switch to self-hosting Google Fonts
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-23 14:31:47 +05:30
Harsh Shandilya ce26f90ba8 Merge remote-tracking branch 'social/master' into src
* social/master:
  Add theme.toml
2020-02-20 19:36:56 +05:30
Harsh Shandilya a25a827aef Add theme.toml
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-20 19:31:34 +05:30
Harsh Shandilya d948d86380 Update projects page
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-20 13:53:06 +05:30
Ori adcfdb48b8 Include front matter in home and list pages if provided
Contents in `_index.md` files will be used if the relevant files
exist, per hugo documentation:
https://gohugo.io/templates/lists/#add-content-and-front-matter-to-list-pages
2020-02-18 23:53:05 -05:00
Harsh Shandilya 937cc05408 Add label on mobile view as well
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-18 23:05:58 +05:30
Harsh Shandilya 16ea737797 Make theme toggle label dynamic
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-18 21:24:26 +05:30
Harsh Shandilya 9c54000dc9 Create separately placed dark theme toggle for desktop
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-18 13:35:31 +05:30
Harsh Shandilya 8bc7da737a [skip prod] Sidebar tweaks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-18 03:03:01 +05:30
Harsh Shandilya 439e236d0e Cleanup custom CSS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:54:32 +05:30
Harsh Shandilya 89d8ae77bc Improve dark theme button's accessibility
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:49:29 +05:30
Harsh Shandilya 71ef4b0120 Cleanup theme toggle JS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:40:20 +05:30
Harsh Shandilya d39d6c734c Introduce some transitions to dark mode button
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:34:52 +05:30
Harsh Shandilya 02cbd1c782 Add a dark theme toggle
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 22:26:49 +05:30
Harsh Shandilya 2d992d34bf Move custom anchor CSS to our file
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 09:53:45 +05:30
Harsh Shandilya 3325ec90ad Remove useless gitkeep
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 09:42:53 +05:30
Harsh Shandilya d8639b5c5c Redesign tag entry view
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 01:09:23 +05:30
Harsh Shandilya a25320a1fc Revert to monokai theme for syntax highlighting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 00:53:27 +05:30
Harsh Shandilya 0b19ea0197 Re-enable theme override
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 00:48:23 +05:30
Harsh Shandilya b58f33d46d Set font-display property in the right place
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-15 21:02:59 +05:30
Harsh Shandilya c3b270595b layouts/index: Remove stray tag
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-15 20:44:51 +05:30
Vivek R 0e1211ab6f chore: add doc for summary length config 2020-02-14 20:38:38 +05:30
Vivek R ca1b91f2a2 Merge pull request #43 from iromeister/patch-1
replace .RawContent with .Summary - looks way better
2020-02-14 20:34:43 +05:30
Harsh Shandilya f11950a119 Swap sidebar and body color for dark theme
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 13:23:19 +05:30
Harsh Shandilya 76b4cc4d49 Reformat custom CSS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 13:23:18 +05:30
Harsh Shandilya 7d22ee3399 Introduce dark theme backed by prefers-color-scheme (#12)
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 12:57:48 +05:30
Harsh Shandilya 693515f586 Remove image compression workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 05:54:19 +05:30
Harsh Shandilya 4f567651bd Only run lighthouse when deploy succeeds
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 05:53:24 +05:30
Harsh Shandilya e2479c28ef Replace carbon snaps with actual code in commento post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 05:48:08 +05:30
Harsh Shandilya ec5b50cb72 Update forestry config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-14 05:48:04 +05:30
Harsh Shandilya 1edba9cc00 ci: Exit on fails
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-13 01:08:15 +05:30
Timo Ollech abfb047db2 replace .RawContent with .Summary - looks way better
.Summary retains all formatting of posts for the paginator which looks much nicer than .RawContent. The length of the .Summary (in words, not characters) can be set via the config variable summaryLength.
2020-02-11 21:40:23 +01:00
Harsh Shandilya cf6d1d61b7 Increase header items font size for SEO
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-12 00:01:22 +05:30
Harsh Shandilya a3e12819ad Revert "Add vertical spacing between menu items for appropriate tap target sizing"
This reverts commit ce211c01d2.
2020-02-11 23:53:29 +05:30
Harsh Shandilya ce211c01d2 Add vertical spacing between menu items for appropriate tap target sizing
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-11 09:02:34 +05:30
Harsh Shandilya f3709b6467 Revert "Test summary card type"
My social images aren't adapted for this format and I'm lazy >:)

This reverts commit 5d16814ae6.
2020-02-11 08:54:18 +05:30
Harsh Shandilya 6c7f429e81 Revert "Tweak tags in commento post"
This reverts commit 5a1ff858aa.
2020-02-10 11:49:00 +05:30
Harsh Shandilya 0bae76802a Make tag view scrollable
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 11:48:45 +05:30
Harsh Shandilya 4b39e41c5d Also skip building when skip directives are used
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 11:04:49 +05:30
Harsh Shandilya 5d16814ae6 [skip prod] Test summary card type
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 11:01:19 +05:30
Harsh Shandilya fa2efba909 Merge remote-tracking branch 'social/master' into src
* social/master:
  Allow override card type

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 11:00:08 +05:30
Harsh Shandilya e22d36b821 Allow override card type
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 10:58:02 +05:30
Harsh Shandilya 1a661d514b Linkify headings directly
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 19:04:46 +05:30
Harsh Shandilya 069ea94c5c Publish Viscerion post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 18:07:03 +05:30
Harsh Shandilya 3d529cfecd Add post about shutting down Viscerion
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 16:44:11 +05:30
Harsh Shandilya 9c9447c3f6 Normalize config
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 13:17:14 +05:30
Harsh Shandilya 2c06ac5fe4 [skip deploy] Add script to convert all PNG assets to WebP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-08 15:46:17 +05:30
Harsh Shandilya ebdbc41a12 Switch statuspage post assets to WebP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-07 21:02:14 +05:30
Harsh Shandilya 2e1a7fae13 Add social metadata to statuspage post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-07 20:59:12 +05:30
Harsh Shandilya 3a5c165d70 Finish and publish statuspage post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-07 20:38:57 +05:30
Harsh Shandilya ca93cc9493 WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-05 11:19:10 +05:30
Harsh Shandilya e9df2e450c Move template modifications out of themes/hyde and rollback misc changes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-04 02:15:50 +05:30
Harsh Shandilya 834d8a42cf themes: Remove unused hello-frieng-ng
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-04 02:03:44 +05:30
Vivek R 8211a72cc3 fix: disable custom js from sample config 2020-02-03 18:24:52 +05:30
Harsh Shandilya ff222354cd Tweak metadata post social image
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:43:53 +05:30
Harsh Shandilya 8c699c2788 Publish social metadata post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:34:59 +05:30
Harsh Shandilya 5e9458123c [skip prod] Convert all social uploads to WebP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:29:15 +05:30
Harsh Shandilya da1439c748 Update social metadata post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:26:54 +05:30
Harsh Shandilya 155aecc274 Stylize images with borders and captions
Taken from https://css-tricks.com/give-your-images-space-and-captions-for-better-layout/ and adapted to be a Hugo render hook.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:00:55 +05:30
Harsh Shandilya e9335a187a Init social metadata post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 10:13:18 +05:30
Harsh Shandilya 909a3245a4 Update config for partial update
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:55:30 +05:30
Harsh Shandilya 80db8e2781 Merge remote-tracking branch 'social/master' into src
* social/master:
  Append BaseURL to all social image links
  README: Document including hugo-social-metadata in themes

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:54:56 +05:30
Harsh Shandilya e4281728df Append BaseURL to all social image links
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:54:29 +05:30
Harsh Shandilya 7f2de9c889 Use hugo-social-metadata subcomponent for social metadata
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:50:45 +05:30
Harsh Shandilya 14e29d1fd0 README: Document including hugo-social-metadata in themes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:45:28 +05:30
Harsh Shandilya bf0b9bce22 Merge remote-tracking branch 'social/master' into src
* social/master:
  Don't hardcode Twitter username
  Code drop
  Initial commit

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:39:53 +05:30
Harsh Shandilya da03beb04d Don't hardcode Twitter username
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:39:16 +05:30
Harsh Shandilya 2e80cc3f4a Code drop
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:36:22 +05:30
Harsh Shandilya a48def1358 Initial commit
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:35:51 +05:30
Harsh Shandilya bd483d5804 Use cloaked email
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 00:09:48 +05:30
Harsh Shandilya 63de0b39b0 Merge remote-tracking branch 'cloak/master' into src
* cloak/master:
  Update README.md
  Add checks for address without @-symbol
  Ensure spaces around span tag (#3)
  Add parameter to display a text instead of the e-mail address
  Update usage documentation
  Add "class" parameter
  Fix protocol scheme
  Backport ideas by @mxmehl
  Update README.md
  Fix link
  Added Awesome badge
  Create .gitignore file
  Add files to repository
  Initial commit

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 00:05:32 +05:30
Harsh Shandilya 36d62ce5b5 Add social images to posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-02 19:41:51 +05:30
Harsh Shandilya b72caa0b04 Add social metadata to pages
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-02 19:35:52 +05:30
Harsh Shandilya c7424cdc3c themes/hyde: Rollback head.html to upstream and override locally
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-02 13:58:04 +05:30
Harsh Shandilya 5a1ff858aa Tweak tags in commento post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-01 11:22:06 +05:30
Harsh Shandilya 4998d86277 Move Lighthouse testing to deploy job
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 21:55:37 +05:30
Harsh Shandilya 5713a6e7e9 Revert "ci: Tweak deployment pipeline"
This reverts commit b2eef32f30.
2020-01-31 21:52:26 +05:30
Harsh Shandilya 0a8adfe3a2 Update
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 21:50:09 +05:30
Harsh Shandilya c1b15e054f Prevent incorrect formatting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 20:22:58 +05:30
Harsh Shandilya 44e26425a0 Initial commit for Dagger part 2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 12:25:57 +05:30
Harsh Shandilya da695c8c1a generate_post_skeleton: Add empty description field
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 11:19:23 +05:30
Harsh Shandilya dec3fe8454 Add more favicons and move CSS files to css/
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-30 14:53:28 +05:30
Harsh Shandilya bfe8bad0f6 Update resume
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-26 02:25:03 +05:30
Harsh Shandilya 0499177010 Cache some partials
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-23 11:26:13 +05:30
Harsh Shandilya 559d864097 Update Dagger post with comments from Arun
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-22 11:55:15 +05:30
Harsh Shandilya 3d1ed1164a Add APS privacy policy
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 21:11:56 +05:30
Harsh Shandilya abbbadc18d Add dev.to links for all posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 14:12:26 +05:30
Harsh Shandilya 6ffb154f58 layouts/single: Add dev.to link to subhead and use buttons for tags
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 14:12:26 +05:30
Harsh Shandilya dc03b7b757 Fix formatting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 12:30:25 +05:30
Harsh Shandilya 5f7ba57a04 Publish dagger tutorial's part 1
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 11:44:42 +05:30
Harsh Shandilya 907f13f7c4 Adjust for repo cleanup
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 15:00:45 +05:30
Harsh Shandilya 7bba04c9e7 Tweak opening for Dagger post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 14:55:20 +05:30
Harsh Shandilya 3bad104efc Finish up Dagger part 1 post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 14:47:15 +05:30
Harsh Shandilya 59cd63698d Add commento post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 01:38:50 +05:30
Harsh Shandilya a1abd07fc2 Add partial for commento and enable it for prod environment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 01:08:23 +05:30
Harsh Shandilya 38635fbeb8 WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-18 12:16:44 +05:30
Harsh Shandilya f619cf9204 WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-17 22:51:26 +05:30
Harsh Shandilya 48d75b3027 themes/hyde: Make heading anchors use title color
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-17 21:01:45 +05:30
Harsh Shandilya 74ea4ddb27 Update post metadata
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-17 20:39:14 +05:30
Harsh Shandilya 5adc40f1f8 More work on Dagger tutorial
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-14 14:11:02 +05:30
Harsh Shandilya d1f26e848c Only linkify h1 and h2 headings
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-14 11:37:39 +05:30
Harsh Shandilya 903b9ebc0d Add WIP Dagger tutorial
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-14 10:56:47 +05:30
Harsh Shandilya afa790443c github: Use prebuilt image for lighthouse action
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-13 01:48:35 +05:30
Harsh Shandilya 38329ae670 themes/hyde: Defer font loading to eliminate render blocking
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-13 01:43:00 +05:30
Harsh Shandilya 6d72fec89f Add a robots.txt file
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 03:12:29 +05:30
Harsh Shandilya 035b79f273 Re-add formatting changes removed by Forestry
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 02:59:28 +05:30
Harsh Shandilya f3ba5e29bf Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-11 21:28:13 +00:00
Harsh Shandilya 8c3ad419d7 Final formatting touchups
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 02:50:31 +05:30
Harsh Shandilya 0b0fa8373a Publish my dagger story
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 02:47:37 +05:30
Harsh Shandilya 9cef3b889c [skip deploy] github: Update lighthouse action
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-11 01:40:43 +05:30
Harsh Shandilya f7ef842460 themes/hyde: Load syntax CSS with the main bundle
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 21:49:48 +05:30
Harsh Shandilya c00d547763 github: Remove Cloudflare cachebust step from deploy
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 21:43:28 +05:30
Harsh Shandilya 2df14399d5 themes/hyde: Use Hugo pipes to load CSS and make syntax load only when required
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 21:41:34 +05:30
Harsh Shandilya d0d2b1d2da themes/hyde: Preload fonts.gstatic.com
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 21:12:21 +05:30
github-actions[bot] 95ebf3e56e Optimised images with calibre/image-actions 2020-01-10 21:06:28 +05:30
Harsh Shandilya cbd48eb624 themes/hyde: Use font-display: swap to eliminate render-blocking fonts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 21:05:52 +05:30
Harsh Shandilya 4abc0b1556 github: Simplify deploy condition
[skip deploy]

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 13:41:10 +05:30
Harsh Shandilya 1dbe2db49a [skip deploy] Add pull request audit workflow
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 13:39:54 +05:30
Harsh Shandilya ebeee47036 [skip deploy] Update forestry to Hugo 0.62.2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-09 22:57:54 +05:30
Harsh Shandilya f95b582fcb Add customized single layout to linkify headings
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-08 10:40:39 +05:30
Harsh Shandilya 82898c3cf7 [skip deploy] generate_post_skeleton: Properly concatenate args
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-08 10:06:24 +05:30
Harsh Shandilya 05e3cf4c67 Add default template to add _blank target to all links
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-08 09:59:55 +05:30
Harsh Shandilya 1452b32a02 Formatting fix
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-06 19:58:18 +05:30
Harsh Shandilya a83b392dc3 Update from Forestry.io - Updated Forestry configuration 2020-01-06 14:26:14 +00:00
Harsh Shandilya 01f9199581 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-06 14:25:09 +00:00
Harsh Shandilya 15603751c1 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-05 15:50:36 +00:00
Harsh Shandilya 69102cebe0 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-05 15:39:52 +00:00
Harsh Shandilya a9fdea2c15 Formatting tweaks
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-05 17:46:11 +05:30
Harsh Shandilya 662f0d71e0 Add a custom list layout for tag and category pages
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-05 17:39:34 +05:30
Harsh Shandilya 2ec632bc8d Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-05 11:46:39 +00:00
Harsh Shandilya deeaea4511 Heavily expand Dagger post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-05 16:53:04 +05:30
Vivek R d635a44599 feat: default style for table 2020-01-05 11:55:42 +05:30
Harsh Shandilya 9546456e66 [skip deploy] github: Don't run lighthouse testing when not deploying
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-31 13:56:58 +05:30
Harsh Shandilya 450e0c3e34 [skip deploy] Update CI badge URLs
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-31 13:55:06 +05:30
Harsh Shandilya d26af8ac58 github: Setup deploy skipping
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-31 13:52:07 +05:30
Vivek R e9b0effd39 fix: don't prepend host url to external js if it starts with http:// or https:// 2019-12-31 10:11:22 +05:30
Harsh Shandilya 472f99ac1a WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-30 22:56:11 +05:30
Vivek R 5c6b0cb4a9 fix: disable disqus if Site.DisqusShortname is not set 2019-12-30 19:39:09 +05:30
Vivek R 0c0c28e696 Merge pull request #34 from mahito1594/feature/disable-ga-when-server
Disable Google Analytics when the site being served with build-in server
2019-12-30 19:24:36 +05:30
Harsh Shandilya edae57fbff Start up a dagger scratchpad
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-29 21:21:49 +05:30
Harsh Shandilya 0a7bc5051a themes/hyde: Add tags to each post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 13:08:06 +05:30
Harsh Shandilya dbde9fddda Add description to analytics post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 01:45:38 +05:30
Harsh Shandilya 1c50da42ed Update from Forestry.io
Harsh Shandilya updated content/posts/server-side-analytics-with-caddyserver-and-goaccess.md
2019-12-25 20:13:23 +00:00
Harsh Shandilya 8b6300ebf4 Update from Forestry.io
Harsh Shandilya updated content/posts/server-side-analytics-with-caddyserver-and-goaccess.md
2019-12-25 20:05:13 +00:00
Harsh Shandilya caf4a54de9 Update from Forestry.io
Harsh Shandilya created static/uploads/goaccess_terminal.png
2019-12-25 20:03:34 +00:00
Harsh Shandilya 0a93e6c2d9 Update from Forestry.io
Harsh Shandilya updated content/posts/server-side-analytics-with-caddyserver-and-goaccess.md
2019-12-25 20:00:30 +00:00
Harsh Shandilya b7c28d98e3 Update from Forestry.io
Harsh Shandilya updated content/posts/server-side-analytics-with-caddyserver-and-goaccess.md
2019-12-25 19:59:35 +00:00
Harsh Shandilya e56326cb90 github: Reduce lighthouse waiting times and use direct URLs
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 00:21:28 +05:30
Harsh Shandilya b59a836568 CI: Update to Hugo 0.62.0
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 00:19:02 +05:30
Harsh Shandilya 24ef028924 Update server-side analytics post again
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 00:17:24 +05:30
Harsh Shandilya 475ddde003 Revert "Use Hugo highlighting"
This isn't needed to actually use Hugo highlighting, the fenced code blocks are automatically interpreted and
rendered at build-time.

This reverts commit 7e7477fdd3.
2019-12-26 00:13:00 +05:30
Harsh Shandilya b733183417 content/about: Link languages to GitHub repositories
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-25 21:40:33 +05:30
Harsh Shandilya 70d12ee3f3 themes/hyde: Tweak date format and reading time
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-25 20:34:04 +05:30
Harsh Shandilya fc88a7d4f2 Flesh out contact page and header links
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-23 13:17:13 +05:30
Harsh Shandilya 8cb9812637 Tweak formatting of github packages post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-22 23:51:45 +05:30
Harsh Shandilya 6a9538c905 WIP post update
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-20 21:23:35 +05:30
Harsh Shandilya f32a357cb6 Revert "Add Caddyfile for local testing"
Don't need it anymore since Lighthouse is run in CI

This reverts commit 8335d68450.
2019-12-20 20:09:02 +05:30
Harsh Shandilya ceacfd94dc Add a shortcode for gfycat embeds
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-20 20:08:37 +05:30
Harsh Shandilya 9d4d31721b Update from Forestry.io
Harsh Shandilya updated content/posts/server-side-analytics-with-caddyserver-and-goaccess.md
2019-12-17 13:35:42 +00:00
Harsh Shandilya e800cb8235 Update from Forestry.io
Harsh Shandilya created content/posts/server-side-analytics-with-caddyserver-and-goaccess.md
2019-12-17 13:03:31 +00:00
Harsh Shandilya d790318d43 Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-3--caveats-coming-from-java.md
2019-12-16 18:21:00 +00:00
Harsh Shandilya 32b9e865ca Remove Google Analytics
I'm switching to server-side analytics backed by Caddy and Goaccess

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-16 23:47:20 +05:30
Harsh Shandilya 7d5eaa6799 Update site URLs in github actions post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-13 20:39:49 +05:30
Harsh Shandilya 91e5770159 Remove Keybase file proof in favor of DNS
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-13 19:08:23 +05:30
Harsh Shandilya af5b7e07e6 Update base URL
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-13 19:04:34 +05:30
Harsh Shandilya 5f36b4889a Add binary incompatibility post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-13 01:25:22 +05:30
Harsh Shandilya c28d3e33b6 Add runtime asserts to caveats post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 14:14:31 +05:30
Harsh Shandilya 414505ebc4 themes/hyde: Use correct favicon
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 13:57:36 +05:30
Harsh Shandilya 4a6766c446 Cleanup static assets
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 13:57:12 +05:30
Harsh Shandilya e3559df423 themes/hyde: Remove usage of Abril Fatface font
It's often too large for screens and PT Sans looks just fine

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 13:25:25 +05:30
Harsh Shandilya 7e7477fdd3 Use Hugo highlighting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:45:49 +05:30
Harsh Shandilya 496f5755d0 Update syntax highlighting CSS
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:35:23 +05:30
Harsh Shandilya 3dfe5a8d76 Enable pygments highlighting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:35:11 +05:30
Harsh Shandilya 14307b55cc Revert "themes/hyde: Use PrismJS for syntax highlighting"
This reverts commit 741722cd8b.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:26:59 +05:30
Harsh Shandilya 5a5c33b365 Revert "theme: Update prism to support more languages"
This reverts commit cdabca0c50.
2019-12-05 23:26:36 +05:30
Harsh Shandilya 1a68adda08 Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-1-classes-and-objects-and-everything-in-between.md
2019-12-05 17:39:43 +00:00
Harsh Shandilya e634c291aa Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-1-classes-and-objects-and-everything-in-between.md
2019-12-05 17:35:57 +00:00
Harsh Shandilya 65580ff23e Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-3--caveats-coming-from-java.md
2019-12-05 17:32:13 +00:00
Harsh Shandilya 1e9e3f09d0 Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-3--caveats-coming-from-java.md
2019-12-05 17:29:33 +00:00
Harsh Shandilya 870b3cb726 Update contact page and add that link to nav
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 00:51:20 +05:30
Harsh Shandilya ba95978f71 github: Reduce lighthouse waiting time
GitHub Actions + Hugo = 🚀

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 17:50:01 +05:30
Harsh Shandilya 1ef9fd42a9 themes/hyde: Add reading time to posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 17:47:59 +05:30
Harsh Shandilya 68eed37e2e Add descriptions to all posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 17:39:37 +05:30
Harsh Shandilya fa63e7e003 themes/hyde: Use Description field to summarize pages in main list
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 17:39:08 +05:30
Harsh Shandilya 513e77d559 Update README
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 16:25:47 +05:30
Harsh Shandilya 8bf12d325c Revert "themes/hyde: Respect SRI when loading prism JS"
For some reason dis is broken

This reverts commit 02e71780b9.
2019-12-04 16:17:56 +05:30
Harsh Shandilya 21f10f8c27 Update from Forestry.io
Harsh Shandilya updated content/posts/deploying-hugo-sites-with-github-actions.md
2019-12-04 09:40:36 +00:00
Harsh Shandilya e048cf46aa Update from Forestry.io
Harsh Shandilya updated content/posts/deploying-hugo-sites-with-github-actions.md
2019-12-04 09:24:33 +00:00
Harsh Shandilya 7804d9f7e8 Init skeleton
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 10:08:39 +05:30
Harsh Shandilya 02e71780b9 themes/hyde: Respect SRI when loading prism JS
https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 09:58:34 +05:30
Harsh Shandilya 0d217fa4c8 Tweak code highlight theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-02 20:15:34 +05:30
Harsh Shandilya 5b2b380f6a Delete FUNDING.yml 2019-12-02 19:26:33 +05:30
Harsh Shandilya f4085802dc github: Separate testing and deployment pipelines
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-01 21:11:23 +05:30
Harsh Shandilya 31b5b52b53 Update CV
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-01 21:04:08 +05:30
Harsh Shandilya 1967c61110 Embed repls properly
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-30 07:28:19 +05:30
Harsh Shandilya 37c8cfa559 Extend syntax highlighting to include Java and JSON
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-30 07:04:47 +05:30
Harsh Shandilya 741722cd8b themes/hyde: Use PrismJS for syntax highlighting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-29 20:12:17 +05:30
Harsh Shandilya 1cff1c9afa themes/hyde: Exclude pages without date from main loop
This allows having standalone pages at the top level without them showing up in the blog post list

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-29 19:57:00 +05:30
Harsh Shandilya afb40dddfd Re-introduce standalone pages
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-29 19:44:47 +05:30
Harsh Shandilya 2c0625817d Fix baseurl
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 18:34:23 +05:30
Harsh Shandilya 9294f224c3 Relocate standalone pages for now
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 18:09:11 +05:30
Harsh Shandilya 260dc2972e Switch to hyde theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 17:25:51 +05:30
Harsh Shandilya a810ae8acc Tweak post formatting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 17:25:44 +05:30
Harsh Shandilya 82abe42756 Add 'themes/hyde/' from commit '9230a016f771570e39a6bc2443b942d00c8d2d67'
git-subtree-dir: themes/hyde
git-subtree-mainline: 55c3b73bd7
git-subtree-split: 9230a016f7
2019-11-28 17:06:56 +05:30
Sorin Davidoi 9230a016f7 fix(static/css/poole): Contrast issues
Ensures that the contrast ratio is at least 4.5:1 (so that is complies with WCAG 2.0: https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html).
2019-11-22 17:43:36 +01:00
Harsh Shandilya 55c3b73bd7 Minor formatting tweak
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 18:12:27 +05:30
Harsh Shandilya 883ddbb84e Publish github packages post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 18:02:05 +05:30
Harsh Shandilya 948ac1f9a7 Tweak github packages post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 18:01:27 +05:30
Harsh Shandilya cdabca0c50 theme: Update prism to support more languages
- Git diffs
- Dockerfile
- Kotlin

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 17:42:40 +05:30
Harsh Shandilya 4fa3886873 Make image naming more explicit
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 20:14:00 +05:30
Harsh Shandilya 04997344eb Update from Forestry.io
Harsh Shandilya updated content/posts/publishing-an-android-library-to-github-packages.md
2019-11-21 14:40:38 +00:00
Harsh Shandilya bb9c169c1c Update from Forestry.io
Harsh Shandilya created static/uploads/Screenshot from 2019-11-21 20-08-01.png
2019-11-21 14:39:01 +00:00
Harsh Shandilya 47d5a0b5fd Update from Forestry.io
Harsh Shandilya created static/uploads/Screenshot from 2019-11-21 19-50-41.png
2019-11-21 14:21:21 +00:00
Harsh Shandilya b53c5cd66e Update from Forestry.io
Harsh Shandilya created static/uploads/Screenshot from 2019-11-21 19-50-20.png
2019-11-21 14:21:03 +00:00
Harsh Shandilya 60548dce7c Update from Forestry.io
Harsh Shandilya updated content/posts/publishing-an-android-library-to-github-packages.md
2019-11-21 09:23:52 +00:00
Harsh Shandilya 1e08e12d9c Update post skeleton generator
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 11:58:23 +05:30
Harsh Shandilya 8173a9d9b4 Add new post skeleton
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 11:58:22 +05:30
Harsh Shandilya d10a9638fc Add frontmatter to viscerion privacy policy page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 11:57:20 +05:30
Harsh Shandilya 99ee0353d7 Test official Lighthouse CI action
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-19 19:54:41 +05:30
Vivek R 7d985dd68c fix: update demo pygmentes style 2019-11-19 16:22:05 +05:30
Harsh Shandilya 8722ee6a63 Merge remote-tracking branch 'theme/master' into src
* theme/master:
  Update README.md
  Update prism.js to v1.17.1
  Update assets
  Update svg.html
  A bit cleanup
  Fix disableReadOtherPosts feature
  Update head.html
  Update README.md
  Update head.html
  Update npm packkages
  Added option to disable Read Other Posts

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-17 14:22:56 +05:30
Djordje Atlialp 43de81539d Update README.md 2019-11-14 18:22:13 +01:00
Djordje Atlialp 244db5b466 Update prism.js to v1.17.1 2019-11-14 18:22:11 +01:00
Djordje Atlialp 2fed0ca9ba Update assets 2019-11-14 18:21:17 +01:00
Djordje Atlialp 7b6565d06f Update svg.html
Add kaggle icon
2019-11-14 18:16:28 +01:00
Djordje Atlialp 5fd27c572a A bit cleanup 2019-11-14 17:34:53 +01:00
Djordje Atlialp b322b07a36 Fix disableReadOtherPosts feature 2019-11-14 17:34:34 +01:00
Djordje Atlialp 0ac667654b Update head.html
Improve Styling
2019-11-14 16:37:36 +01:00
Djordje Atlialp bd75ffa29f Merge pull request #73 from JPYamamoto/master
Added option to disable Read Other Posts
2019-11-14 16:31:38 +01:00
Djordje Atlialp 5f23ddb1a5 Update README.md 2019-11-14 16:29:35 +01:00
Djordje Atlialp 254107ca82 Update head.html
Fix https://github.com/rhazdon/hugo-theme-hello-friend-ng/issues/77
2019-11-14 15:32:52 +01:00
Djordje Atlialp f997d71752 Update npm packkages 2019-11-14 15:19:05 +01:00
Harsh Shandilya 7bea3e3b70 Remove subtree merge errors
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-13 22:24:29 +05:30
Harsh Shandilya e6f86939dc Update deploying-hugo-sites-with-github-actions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-12 21:51:36 +05:30
Harsh Shandilya 0b6ecc2082 Revert "Properly configure conditions"
This doesn't help outside the initial deploy testing experiment.

This reverts commit 96a30da0a1.
2019-11-11 10:00:17 +05:30
Harsh Shandilya 16ee4e55c5 Merge remote-tracking branch 'theme/master' into msf/update-from-upstream
* theme/master:
  Hindi language added in langFlags and translations also added for hindi.
2019-11-11 00:46:40 +05:30
Harsh Shandilya 1520e4f1d0 github: Compress images through actions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-11 00:46:09 +05:30
Harsh Shandilya 26eb8fd8ab Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-10 15:10:04 +05:30
Mahito TANNO 6f8908b192 Disable Google Analytics when hugo server 2019-11-10 00:00:18 +09:00
Djordje Atlialp aa3654293c Merge pull request #76 from prashantbhardwaj/master
Hindi language added in langFlags and translations also added for hindi.
2019-11-08 09:34:20 +01:00
Harsh Shandilya a58545d0c3 Update from Forestry.io
Harsh Shandilya updated content/posts/deploying-hugo-sites-with-github-actions.md
2019-11-06 08:28:47 +00:00
Harsh Shandilya 5f89986477 Add skeleton for new post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 13:17:23 +05:30
Harsh Shandilya dff5357c0c Update from Forestry.io
Harsh Shandilya updated content/posts/why-i-went-back-to-the-gradle-groovy-dsl.md
2019-11-06 06:31:01 +00:00
Harsh Shandilya 9678bd96db Update from Forestry.io
Harsh Shandilya updated content/posts/why-i-went-back-to-the-gradle-groovy-dsl.md
2019-11-06 06:30:17 +00:00
Harsh Shandilya de7df2382b Syntax highlighting fixes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 11:58:53 +05:30
Harsh Shandilya 2832918b07 Update from Forestry.io
Harsh Shandilya updated content/posts/why-i-went-back-to-the-gradle-groovy-dsl.md
2019-11-06 06:27:10 +00:00
Harsh Shandilya 7783a48c33 Update from Forestry.io
Harsh Shandilya updated content/posts/why-i-went-back-to-the-gradle-groovy-dsl.md
2019-11-06 06:20:04 +00:00
Harsh Shandilya ad2820b396 Update from Forestry.io
Harsh Shandilya updated content/posts/why-i-went-back-to-the-gradle-groovy-dsl.md
2019-11-06 06:03:37 +00:00
Harsh Shandilya 5bf643593f github: Remove GitHub pages deployment and run audits on prod
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 11:06:07 +05:30
Harsh Shandilya 67867021f3 github: Purge Cloudflare cache upon pipeline completion
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 09:35:01 +05:30
Harsh Shandilya c727cf25ad github: Properly set destination for deploys
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 09:25:22 +05:30
Harsh Shandilya b2eef32f30 ci: Tweak deployment pipeline
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 23:22:12 +05:30
Harsh Shandilya a6845c3266 Setup prod deployment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 23:21:30 +05:30
Harsh Shandilya adb9e06515 Setup staging deployment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 23:21:30 +05:30
Harsh Shandilya 96a30da0a1 Properly configure conditions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 20:07:24 +05:30
Vivek R aa5f461c56 Merge pull request #31 from was-up/fix_home_link
[Fix] Link to home in head partial.
2019-11-04 15:22:33 +05:30
Prashant Bhardwaj f60b8726ac Hindi language added in langFlags and translations also added for hindi. 2019-11-02 23:51:28 +00:00
Andre Restivo 16758f957c [Fix] Link to home in head partial.
Link was pointing to / instead of using .Site.BaseURL.
2019-11-02 17:06:32 +00:00
Harsh Shandilya ecba1346eb github: Use prebuilt Docker images
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-02 18:12:16 +05:30
Harsh Shandilya 2afed2dccb Run lighthouse testing in Actions CI
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 17:09:05 +05:30
Harsh Shandilya 6fca9e83d3 Test GitHub deployment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 16:48:33 +05:30
Harsh Shandilya c32503fb9a Use new download location
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 16:18:03 +05:30
Harsh Shandilya 30aa348f18 Merge remote-tracking branch 'theme/master' into src
* theme/master:
  add gitbook svg
  Added Stackoverflow icon
  Cursor color customization
  keybase
  favicons color
  Set container flex-basis to auto

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 16:16:20 +05:30
Djordje Atlialp 79e060debd Merge pull request #62 from klaidliadon/master
Custom favicons color
2019-11-01 08:31:29 +01:00
Harsh Shandilya 1a42a28564 theme: Switch Google Analytics to gtag
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-31 01:18:38 +05:30
Harsh Shandilya 7425e56088 Fix analytics config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-31 00:47:26 +05:30
Harsh Shandilya f09e6e297c Enable Google Analytics 2019-10-30 20:36:33 +05:30
Alex D. Guerrieri b63cd3ee0b Merge branch 'master' into master 2019-10-28 15:15:27 +01:00
Harsh Shandilya 7ad20b7df5 Stop caching things and remove existing service worker registrations
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-26 20:44:43 +05:30
Harsh Shandilya bf55d0857f static/service-worker: Update cache buster from MDN docs
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-26 20:37:23 +05:30
Harsh Shandilya 819cd2ebfc Update from Forestry.io
Harsh Shandilya created content/posts/why-i-went-back-to-the-gradle-groovy-dsl.md
2019-10-26 20:22:37 +05:30
JPYamamoto ba913cdffd Added option to disable Read Other Posts 2019-10-23 21:02:56 -05:00
Vivek R a26dd658b8 Merge pull request #26 from vividvilla/feat-custom-css-js
feat: load custom CSS and JS
2019-10-23 00:38:39 +05:30
Vivek R b143db0735 feat: load custom CSS and JS 2019-10-23 00:34:47 +05:30
Vivek R 9160868a99 Merge pull request #25 from vividvilla/fix-readability
Fix readability
2019-10-22 23:54:31 +05:30
Vivek R 93a0f332f9 fix: anchor text color for dark theme 2019-10-22 19:52:32 +05:30
Vivek R 4cf0f0c005 chore: add gitignore 2019-10-22 16:02:29 +05:30
Vivek R c269d8202c fix: readability fixes 2019-10-22 16:02:29 +05:30
Vivek R 000316e711 Merge pull request #19 from cgiacomi/feature/posttags
feat: add tag list to post
2019-10-19 18:07:05 +05:30
cgiacomi cf632eb271 fix: change layout for tags 2019-10-17 21:57:21 +02:00
cgiacomi ecc4e560a2 chore: merge from master 2019-10-17 21:04:50 +02:00
Djordje Atlialp 68f54a83df Merge pull request #51 from rinon/fix_container_flex_ie
Set container flex-basis to auto
2019-10-17 10:43:25 +02:00
Djordje Atlialp d4aa6011f3 Merge pull request #64 from JPYamamoto/master
Cursor color customization
2019-10-17 10:42:49 +02:00
Djordje Atlialp 45fc8b56cd Merge pull request #66 from JPYamamoto/stackoverflow
Added Stackoverflow icon
2019-10-17 10:39:40 +02:00
Djordje Atlialp 20339e9bd4 Merge pull request #67 from davidfeng88/master
Add GitBook svg
2019-10-17 10:38:55 +02:00
davidfeng88 901d0db335 add gitbook svg 2019-10-16 13:45:43 -04:00
JPYamamoto 310d5809c7 Added Stackoverflow icon 2019-10-14 11:14:42 -05:00
Artur Zylinski 3a62de0cdd Add meta description to header
Based on hugo docs: https://gohugo.io/variables/site/#example-site-params
And developers.google recommendations: https://developers.google.com/web/tools/lighthouse/audits/description?utm_source=lighthouse&utm_medium=devtools
2019-10-13 22:40:02 +02:00
Juan Pablo Yamamoto e4ef854c2b Cursor color customization 2019-10-12 17:18:08 -05:00
Vivek R 76710a9006 fix: readability fix for small screen devices 2019-10-13 01:23:11 +05:30
Vivek R ded092f962 fix: anchor tag overflow on chrome bug 2019-10-13 00:52:27 +05:30
Vivek R 3933706593 fix: set demo pagination to 5 items 2019-10-12 23:02:22 +05:30
Vivek R a0b079dcad Merge pull request #21 from vividvilla/feat-dark-mode
feat: add dark mode
2019-10-12 23:00:32 +05:30
Vivek R 43b2c4f1ab feat: add dark mode 2019-10-12 22:48:57 +05:30
Vivek R 22240bed18 Merge pull request #18 from cgiacomi/feature/draftlabal
feat: add draft label for draft posts
2019-10-12 22:39:08 +05:30
cgiacomi db0bf60405 fix: move tags to bottom of post 2019-10-12 17:39:40 +02:00
cgiacomi 1aa2b3f0fa feat: add draft label to recent articles 2019-10-12 17:24:28 +02:00
cgiacomi 48b1cab950 feat: add draft label to post list 2019-10-12 17:11:34 +02:00
Vivek R 2ff9e0b539 Merge pull request #20 from vividvilla/fix-typography
fix: increase header font weight
2019-10-12 19:30:41 +05:30
Vivek R d60e1c0b16 fix: increase header font weight 2019-10-12 19:28:34 +05:30
cgiacomi 9f5e251feb feat: add tag list to post header 2019-10-12 09:27:08 +02:00
cgiacomi a021ff0f78 feat: add draft label for draft posts 2019-10-11 21:25:17 +02:00
Vivek R 3bceb9f94e Merge pull request #17 from cgiacomi/feature/copyright
feat: add copyright option
2019-10-10 17:19:09 +05:30
Christian Giacomi ab2a6bb5d3 feat: add copyright option 2019-10-10 13:01:45 +02:00
Vivek R 00d10af8f6 Merge pull request #16 from directed-graph/master
feat: allow specifying favicon via configuration
2019-10-10 11:34:09 +05:30
Travis Chen 3cee34d31e feat: allow specifying favicon via configuration
We assume PNG MIME type, because, from my understanding, PNG is the main format
for favicons nowadays (even if they have an "ico" extension). Further
configuration options are needed to allow for specifying different MIME types.
2019-10-09 17:00:30 -07:00
Harsh Shandilya 1ffe80b263 Cleanup static assets
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-04 18:48:29 +05:30
Harsh Shandilya 8335d68450 Add Caddyfile for local testing
Helpful to be able to replicate my production setup for Lighthouse testing.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-04 18:42:50 +05:30
Sorin Davidoi b50c642ad5 fix(css): Add text-size-adjust
https://developer.mozilla.org/en-US/docs/Web/CSS/text-size-adjust
2019-10-03 20:43:07 +02:00
Sorin Davidoi 4df1fdd4f5 fix(heads): Add protocol to gmpg URL
The resource is available over HTTPS.

https://webhint.io/docs/user-guide/hints/hint-no-protocol-relative-urls/
2019-10-03 20:42:44 +02:00
Harsh Shandilya 494ee6beec Remove aria-role flagged by Lighthouse
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:27:44 +05:30
Harsh Shandilya e8a41a76be Use font-display: swap to avoid render blocking
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:27:30 +05:30
Harsh Shandilya fc665d09ab Use description parameter from site config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:26:44 +05:30
Harsh Shandilya 130799fe8a Revert "Re-add flag-icon-css"
The theme uses this but not me

This reverts commit b07dadb048.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:02:22 +05:30
Harsh Shandilya 2339d3dc28 Refactor site for pagespeed improvements (#8)
* Strip out FontAwesome and inline icons

* Add icomoon fonts to cache

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 13:56:11 +05:30
Harsh Shandilya b07dadb048 Re-add flag-icon-css
Used in the theme

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 13:30:01 +05:30
Harsh Shandilya 395cd38b24 Update to Prism 1.17.1
Switch to a leaner edition with only the languages I use

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 13:27:34 +05:30
Harsh Shandilya 9a813b6b53 Service worker fixes
Remove logging and run cache purge in activate event

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 19:19:06 +05:30
Harsh Shandilya fd5e13aa77 static: Update service worker cache
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 19:15:42 +05:30
Harsh Shandilya 803941bfa3 Wrap up part 2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 19:12:18 +05:30
Harsh Shandilya 6c6b374c8d Visibility modifiers topic
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 18:54:21 +05:30
Harsh Shandilya 23916c9282 More progress on part 2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-29 22:16:19 +05:30
Harsh Shandilya 84219f1f13 Disable PWA on local builds
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-29 10:38:57 +05:30
Harsh Shandilya e99035318f Check-in empty structure for post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-29 10:20:27 +05:30
Harsh Shandilya c0fc562876 Disable analytics
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-28 20:38:02 +05:30
Harsh Shandilya c44010deff Add Fathom analytics support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:53:41 +05:30
Harsh Shandilya f340dbd03c Remove unused JS
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:38:15 +05:30
Harsh Shandilya e11f174dfe Codestyle cleanup for service workers
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:26:16 +05:30
Harsh Shandilya e14de726e9 Purge old caches during service worker init
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:25:57 +05:30
Harsh Shandilya f333b9af35 Inject page views stats tracker
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:10:30 +05:30
Harsh Shandilya 794c2f3597 Fix typo
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 23:24:05 +05:30
Harsh Shandilya 93930ff83a Refresh cache
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 15:28:10 +05:30
Harsh Shandilya 0c523afd04 Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-1-classes-and-objects-and-everything-in-between.md
2019-09-23 09:56:16 +00:00
Alex Guerrieri d367cf3771 keybase 2019-09-23 11:27:05 +02:00
Alex Guerrieri e68d9aaad3 favicons color 2019-09-23 11:26:57 +02:00
Harsh Shandilya d1a8b57754 Wrap up Teaching Kotlin Part 1
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 06:44:08 +05:30
Harsh Shandilya 145cc2f1cd Properties and initialization blocks
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 06:40:34 +05:30
Harsh Shandilya a1c58ae953 Improve code samples
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 06:05:46 +05:30
Harsh Shandilya 9c944e8b84 github: Add sponsors button
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 22:34:15 +05:30
Harsh Shandilya 0b249c279b I'm dumb
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 01:10:03 +05:30
Harsh Shandilya 3cba765c80 Add code examples to finality section
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 00:58:25 +05:30
Harsh Shandilya 6de7101734 Static classes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 00:47:27 +05:30
Harsh Shandilya 476fd2935b Add subheading about finality of classes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 23:42:17 +05:30
Harsh Shandilya 2f67fe19a5 Fix replit liquid tag
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 02:45:50 +05:30
Harsh Shandilya 267e83b2ae Cache new post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 02:42:09 +05:30
Harsh Shandilya a590c18424 Add constructors and parameters topic
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 02:41:26 +05:30
Harsh Shandilya 043f7463ba Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-part-1-classes-and-objects-and-everything-in-between.md
2019-09-20 20:24:45 +00:00
Harsh Shandilya 5d2e7e3fef Update from Forestry.io
Harsh Shandilya created content/posts/teachingkotlin-part-1-classes-and-objects-and-everything-in-between.md
2019-09-20 07:22:16 +00:00
Harsh Shandilya 1e923c806a Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-kotlin-for-android-java-developers.md
2019-09-20 02:57:11 +00:00
Harsh Shandilya 635c03cc91 README: I stan Forestry
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-20 08:19:57 +05:30
Harsh Shandilya 2cc87e750e Update from Forestry.io
Harsh Shandilya updated content/posts/teachingkotlin-kotlin-for-android-java-developers.md
2019-09-20 02:44:00 +00:00
Harsh Shandilya 19add6a98d Update from Forestry.io
Harsh Shandilya created content/posts/teachingkotlin-kotlin-for-android-java-developers.md
2019-09-20 02:42:00 +00:00
Harsh Shandilya 99e6c74b62 Reconfigure `#DigitalClimateStrike`
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-20 08:01:34 +05:30
Harsh Shandilya 0fa422a98d Update from Forestry.io - Updated Forestry configuration 2019-09-20 02:04:02 +00:00
Harsh Shandilya 85324cc301 Update from Forestry.io - Updated Forestry configuration 2019-09-20 02:03:52 +00:00
Vivek R c749a34b03 Merge pull request #15 from vividvilla/fix-media
fix: image and video getting scaled to 100% width
2019-09-20 00:03:06 +05:30
Vivek R 04f2a80ceb fix: add whitespace between title and subtitle in title header 2019-09-20 00:01:19 +05:30
Vivek R 605e27c53b fix: images and other media doesn't get scaled 100% width 2019-09-20 00:01:19 +05:30
Vivek R 074da2dc73 Merge pull request #14 from vividvilla/fix-build
fix: build failed due to invalid variable reference
2019-09-19 22:58:13 +05:30
Vivek R 1cfa50c76d fix: build failed due to invalid variable reference 2019-09-19 22:53:48 +05:30
Vivek R 41bc705e3d fix: use site.baseurl for assets url 2019-09-19 22:44:58 +05:30
Harsh Shandilya 0424f5c3ab Update from Forestry.io - Updated Forestry configuration 2019-09-15 00:33:25 +00:00
Harsh Shandilya 95031c8eeb service-worker: Cache current posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-13 19:43:07 +05:30
Harsh Shandilya 86d460a8ef Make statusbar color match rest of the app
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-13 19:34:47 +05:30
Harsh Shandilya 19e4b1863e Update from Forestry.io - Updated Forestry configuration 2019-09-12 09:17:03 +00:00
Harsh Shandilya 6e6f95c82d Update from Forestry.io - Updated Forestry configuration 2019-09-12 09:12:38 +00:00
Harsh Shandilya b6faaafe2a Add flattr meta tag
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 14:21:36 +05:30
Harsh Shandilya 892a5d6b95 Update cache name to re-cache updated FA assets
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 13:29:50 +05:30
Harsh Shandilya 043f84a624 Add script to update FontAwesome
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 13:27:46 +05:30
Harsh Shandilya 421ac66772 Update FontAwesome
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 13:27:43 +05:30
Harsh Shandilya 6a8696e3ad Revert "Re-use service worker from official hugo example"
This is not as good as I thought it would be.

This reverts commit 5314b668ac.
2019-09-12 01:58:06 +05:30
Harsh Shandilya 5314b668ac Re-use service worker from official hugo example
https://gohugohq.com/howto/go-offline-with-service-worker/

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 01:16:59 +05:30
Harsh Shandilya 66621fe46d Move all assets in-repo to allow service worker to cache them
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 01:02:20 +05:30
Harsh Shandilya 8295277cba Add caching service worker
TODO: Add a build step that automatically caches all posts as well
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 21:04:48 +05:30
Harsh Shandilya 7c46a25ae6 theme: Make style name consistent across builds
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 20:43:10 +05:30
Harsh Shandilya 671a9bae9d theme: Make bundle name consistent across builds
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 20:35:10 +05:30
Harsh Shandilya 69b9da8a06 Unbreak PWA
Why does this still need a PNG is beyond me

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:56:27 +05:30
Harsh Shandilya 1cc9b313c7 Add 384x384 icon to site manifest
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:53:23 +05:30
Harsh Shandilya 697ba2afde Convert static assets to use WebP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:53:22 +05:30
imgbot[bot] 7d7d9befb7 [ImgBot] Optimize images (#7)
*Total -- 279.94kb -> 273.94kb (2.14%)

/static/android-chrome-384x384.png -- 160.60kb -> 155.92kb (2.92%)
/static/android-chrome-192x192.png -- 48.60kb -> 48.00kb (1.24%)
/static/apple-touch-icon.png -- 43.27kb -> 42.78kb (1.15%)
/static/mstile-150x150.png -- 27.46kb -> 27.25kb (0.77%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2019-09-11 04:48:21 +05:30
Harsh Shandilya 367541b317 Complete PWA implementation
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:44:02 +05:30
Harsh Shandilya f436c79b42 Rename PWA manifest
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:26:22 +05:30
Harsh Shandilya 0e5f41554c Prepare preliminary PWA support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-10 04:12:40 +05:30
Vivek R 4c9b8d07ca fix: remove `params.mainSections` from exampleSite config 2019-09-10 00:33:35 +05:30
Vivek R 2cf6be48f3 fix: increase font weight for em inside blockquote 2019-09-10 00:29:23 +05:30
Vivek R f8bfdac5ce fix: paginate recent posts and use params.mainSections 2019-09-10 00:12:59 +05:30
Harsh Shandilya cd80f975e1 Merge remote-tracking branch 'theme/master' into src
* theme/master:
  Fixed typo in German i18n
  Changed i18n file comment heading
  Fixed accidental text selection
  Added rule to ignore .vscode

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-10 00:02:21 +05:30
Harsh Shandilya 9979f636c9 Join the Digital `#ClimateStrike`
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-09 22:29:19 +05:30
Djordje Atlialp b7a2d04347 Merge pull request #49 from agmm/master
Fixed accidental text selection
2019-09-08 20:30:44 +02:00
Djordje Atlialp 50b86648d8 Merge pull request #56 from VincentTam/patch-1
Changed i18n file comment heading
2019-09-08 20:29:20 +02:00
Djordje Atlialp da84728278 Merge pull request #57 from VincentTam/patch-2
Fixed typo in German i18n
2019-09-08 20:28:26 +02:00
Harsh Shandilya 8f18597ef4 Stick to more readable date formats
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-07 17:47:15 +05:30
Harsh Shandilya 880dd26735 Check in Rust tooling post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-07 12:55:36 +05:30
Harsh Shandilya a58cfcb85e static: Fix favicons
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-03 11:53:17 +05:30
Harsh Shandilya 142a47872a Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-03 01:43:25 +05:30
dependabot[bot] a0072fa354 Merge pull request #6 from msfjarvis/dependabot/npm_and_yarn/themes/hello-friend-ng/tar-2.2.2 2019-09-02 09:04:21 +00:00
dependabot[bot] 957a35320b Merge pull request #5 from msfjarvis/dependabot/npm_and_yarn/themes/hello-friend-ng/lodash-4.17.15 2019-09-02 09:04:17 +00:00
dependabot[bot] 0265be7f0b Merge pull request #4 from msfjarvis/dependabot/npm_and_yarn/themes/hello-friend-ng/lodash.mergewith-4.6.2 2019-09-02 09:04:14 +00:00
dependabot[bot] 8481c15652 Merge pull request #3 from msfjarvis/dependabot/npm_and_yarn/themes/hello-friend-ng/fstream-1.0.12 2019-09-02 09:04:10 +00:00
dependabot[bot] 2e8bdd884f Bump tar from 2.2.1 to 2.2.2 in /themes/hello-friend-ng
Bumps [tar](https://github.com/npm/node-tar) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Commits](https://github.com/npm/node-tar/compare/v2.2.1...v2.2.2)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-02 09:03:02 +00:00
dependabot[bot] ea7c90b148 Bump lodash from 4.17.11 to 4.17.15 in /themes/hello-friend-ng
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.15.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.15)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-02 09:03:02 +00:00
dependabot[bot] 3c252241b1 Bump lodash.mergewith from 4.6.1 to 4.6.2 in /themes/hello-friend-ng
Bumps [lodash.mergewith](https://github.com/lodash/lodash) from 4.6.1 to 4.6.2.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-02 09:03:00 +00:00
dependabot[bot] b853a17857 Bump fstream from 1.0.11 to 1.0.12 in /themes/hello-friend-ng
Bumps [fstream](https://github.com/npm/fstream) from 1.0.11 to 1.0.12.
- [Release notes](https://github.com/npm/fstream/releases)
- [Commits](https://github.com/npm/fstream/compare/v1.0.11...v1.0.12)

Signed-off-by: dependabot[bot] <support@github.com>
2019-09-02 09:02:59 +00:00
imgbot[bot] 3d63247178 [ImgBot] Optimize images (#2)
*Total -- 71.11kb -> 37.33kb (47.5%)

/themes/hello-friend-ng/images/screenshot.png -- 53.90kb -> 23.68kb (56.07%)
/themes/hello-friend-ng/images/tn.png -- 17.21kb -> 13.65kb (20.67%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2019-09-02 14:31:30 +05:30
Harsh Shandilya a39ff0a1d3 Switch theme to hello-friend-ng
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-02 14:27:40 +05:30
Harsh Shandilya fc6168c467 Merge branch 'master' of github.com:rhazdon/hugo-theme-hello-friend-ng into src
* 'master' of github.com:rhazdon/hugo-theme-hello-friend-ng: (129 commits)
  Update LICENSE.md
  Update LICENSE.md
  fix typo
  added additional font-display configuration
  Added font-display: auto to _fonts.scss
  Add pre scrollbar custom like hermit
  Small fix on name of language
  sass: make logo font monospaced
  icons: add Telegram icon
  sass: fix h1 position
  Add translations and support for pt-br.
  Set correct theme color after page is loaded
  Better multilingual support: absURL -> absLangURL
  Fix menu items are not clickable on smart devices sometimes
  Added spanish support for flag and translation
  switching to RelPermalink instead of Permalink for JS and CSS files
  Adding media query for reduced motion to turn off animation in that case
  Add main tag in homepage
  Rename css in pipeline
  Fix assets generation path
  ...

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-02 14:13:38 +05:30
Dinesh e8b222c162 Add section for Sidebar description 2019-08-30 21:12:23 +02:00
Dinesh 8e4f7f25a5 Add example for Sidebar menus 2019-08-30 21:12:23 +02:00
Harsh Shandilya 231ada34b8 generate_post_skeleton: Add success message
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-31 00:20:17 +05:30
Harsh Shandilya 2fca01ff85 Remove unfinished and discarded post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-30 23:46:51 +05:30
Harsh Shandilya 35bdb030e9 Fix warning with Hugo 0.57.2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-30 23:42:40 +05:30
Vincent Tam e2ff648753 Fixed typo in German i18n 2019-08-27 22:52:53 +02:00
Vincent Tam 6b4867efb8 Changed i18n file comment heading
France ≠ French
2019-08-27 22:39:42 +02:00
Harsh Shandilya d84b32dcbd Remove unused Caddyfile
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-16 15:18:00 +05:30
Stephen Crane 48d67c783e Set container flex-basis to auto
Without flex-basis: auto, IE overlays the footer on top of long pages of text,
as its position seems to be computed relative to the initial viewport.
2019-08-15 16:11:26 -07:00
Harsh Shandilya 70125f0344 README: Update for caddyserver migration
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-15 01:26:50 +05:30
Harsh Shandilya d60c161f25 Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-15 01:20:00 +05:30
Bjørn Erik Pedersen 69edc71dc6 Add go.mod 2019-08-14 20:38:26 +02:00
Bjørn Erik Pedersen 19d9a135fe Use .Site.RegularPages on home page 2019-08-14 20:32:15 +02:00
Arnaldo Gabriel c12bd3ccf2 Fixed accidental text selection 2019-08-12 21:26:19 -04:00
Arnaldo Gabriel 240a15bccd Added rule to ignore .vscode 2019-08-12 20:39:01 -04:00
Harsh Shandilya 40b705c0c8 Ensure avatar stays in sync with GitHub
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:46:25 +05:30
Harsh Shandilya c294d6da87 Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:40:17 +05:30
Harsh Shandilya 863111a397 Fix link to theme submodule
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:28:32 +05:30
Harsh Shandilya b55cb7a3a7 Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:27:41 +05:30
Harsh Shandilya e870962099 Add page desc
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:24:32 +05:30
Harsh Shandilya 14c9fe9eb0 treewide: Update GitHub URLs
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 11:53:37 +05:30
Harsh Shandilya 2ead4131b4 projects: Reword floating-action-button entry
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 11:51:51 +05:30
Harsh Shandilya ae36930e8e Add redirect for GitHub
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-28 09:57:03 +05:30
Harsh Shandilya ac41afae81 Update GitHub username
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-28 09:55:04 +05:30
Harsh Shandilya 218ccdcda0 Relocate redirection config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-27 23:38:17 +05:30
Harsh Shandilya af09bc86ef Add Brave redirect
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-27 22:57:46 +05:30
Harsh Shandilya ae6326b0d0 Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-26 04:12:38 +05:30
Djordje Atlialp 9f40a4c205 Update LICENSE.md 2019-07-24 10:42:44 +02:00
Djordje Atlialp 80d06ee165 Update LICENSE.md 2019-07-24 10:41:51 +02:00
Harsh Shandilya ea427e6bc9 Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-21 17:09:19 +05:30
Harsh Shandilya e01636e479 projects: I'm not a substratum maintainer now
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-21 16:30:23 +05:30
Djordje Atlialp 6b34d51cfa Merge pull request #44 from shibumi/font-display-auto-additions
added additional font-display configuration
2019-07-19 18:54:05 +02:00
Djordje Atlialp 25a4359bb7 Merge pull request #45 from vgalin/patch-1
fix typo
2019-07-19 18:53:23 +02:00
vgalin 8c0dc428f5 fix typo
"mot" is masculine in french, so "un" has to be used here instead of "une"
2019-07-19 11:33:03 +02:00
Harsh Shandilya ead426f24d Update contact page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-18 12:25:29 +05:30
Harsh Shandilya b5ca3e6a96 Add resume page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-18 12:21:41 +05:30
Harsh Shandilya 3257fb87a7 Empty out description while I await an epiphany
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-17 11:42:15 +05:30
Christian Rebischke 3ed9b7ea7d added additional font-display configuration
unfortunately wasn't my last patch enough.
So here are all missing font-display configurations

Signed-off-by: Christian Rebischke <chris@nullday.de>
2019-07-16 19:10:13 +02:00
Djordje Atlialp 48094d707b Merge pull request #43 from shibumi/shibumi/enable-font-display-auto
Added font-display: auto to _fonts.scss
2019-07-16 08:21:33 +02:00
Djordje Atlialp 50c1bef3a2 Merge pull request #38 from hervyqa/master
Add pre scrollbar custom like hermit
2019-07-16 08:20:13 +02:00
Christian Rebischke 60b1665d92 Added font-display: auto to _fonts.scss
font-display on `auto` makes sure that the text is always
visible for the user. It's a suggestion by Googles PageSpeed Insights
to activate this feature:

https://developers.google.com/web/updates/2016/02/font-display?utm_source=lighthouse&utm_medium=unknown

Signed-off-by: Christian Rebischke <chris@nullday.de>
2019-07-15 23:41:46 +02:00
Harsh Shandilya 90d70a53de Update resume
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-13 09:20:17 +05:30
Harsh Shandilya 602f6df828 Let's try this BAT thing
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-12 14:14:00 +05:30
Hervy Qurrotul Ainur 5e8c63b220 Add pre scrollbar custom like hermit 2019-06-30 23:53:17 +07:00
Harsh Shandilya e07bf43d0d Add resume
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-26 16:50:20 +05:30
Harsh Shandilya b2451e1252 Locally keep avatar image
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-20 19:30:59 +05:30
Harsh Shandilya e9f1c05427 Trim down favicons even more
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-20 19:24:56 +05:30
Harsh Shandilya a3a4ba7e57 generate_post_skeleton: Shellcheck cleanup
Also generify passing of title to not require quoting the entire
thing.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-20 19:06:05 +05:30
Vivek R 7625516649 fix: broken Hugo site link in footer 2019-06-19 15:52:48 +05:30
Vivek R d7cda6ee77 fix: move footer scripts to footer template 2019-06-19 15:37:55 +05:30
Vivek R 6e8c99627b Merge pull request #3 from mr-karan/list
fix: inline style for list
2019-06-19 15:25:08 +05:30
Harsh Shandilya 08466309e3 Trim down favicons
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-14 21:33:29 +05:30
Harsh Shandilya 4a7f1e60e0 Asynchronously load font and fontawesome
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-12 23:10:50 +05:30
Harsh Shandilya 1b87707011 Fix favicon paths in app manifest
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-11 07:50:10 +05:30
ImgBotApp 58e16d7396 [ImgBot] Optimize images
*Total -- 643.03kb -> 586.48kb (8.79%)

/static/images/favicon-32x32.png -- 3.14kb -> 2.78kb (11.62%)
/static/images/ms-icon-310x310.png -- 109.43kb -> 97.99kb (10.46%)
/static/images/android-icon-36x36.png -- 3.62kb -> 3.25kb (10.46%)
/static/images/apple-icon-57x57.png -- 7.07kb -> 6.38kb (9.78%)
/static/images/android-icon-48x48.png -- 5.46kb -> 4.93kb (9.73%)
/static/images/apple-icon-60x60.png -- 7.62kb -> 6.88kb (9.71%)
/static/images/ms-icon-70x70.png -- 9.71kb -> 8.80kb (9.38%)
/static/images/apple-icon-76x76.png -- 11.03kb -> 10.01kb (9.29%)
/static/images/apple-icon-72x72.png -- 10.11kb -> 9.17kb (9.28%)
/static/images/android-icon-72x72.png -- 10.11kb -> 9.17kb (9.28%)
/static/images/apple-icon-120x120.png -- 23.64kb -> 21.49kb (9.1%)
/static/images/favicon-96x96.png -- 16.18kb -> 14.71kb (9.07%)
/static/images/android-icon-96x96.png -- 16.18kb -> 14.71kb (9.07%)
/static/images/apple-icon-152x152.png -- 35.50kb -> 32.40kb (8.74%)
/static/images/apple-icon-114x114.png -- 21.55kb -> 19.68kb (8.68%)
/static/images/android-icon-144x144.png -- 32.32kb -> 29.52kb (8.67%)
/static/images/apple-icon-144x144.png -- 32.32kb -> 29.52kb (8.67%)
/static/images/ms-icon-144x144.png -- 32.32kb -> 29.52kb (8.67%)
/static/images/ms-icon-150x150.png -- 34.74kb -> 31.73kb (8.65%)
/static/images/apple-icon-180x180.png -- 47.74kb -> 43.66kb (8.54%)
/static/images/apple-icon.png -- 57.39kb -> 52.98kb (7.68%)
/static/images/apple-icon-precomposed.png -- 57.39kb -> 52.98kb (7.68%)
/static/images/android-icon-192x192.png -- 56.75kb -> 52.60kb (7.32%)
/static/images/favicon-16x16.png -- 1.70kb -> 1.63kb (3.86%)
2019-06-11 04:17:05 +05:30
Harsh Shandilya ac3369cdc3 Declare and use extended favicon support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-11 04:13:32 +05:30
Nicolas Martignoni f98a71eea1 Update README.md 2019-06-10 22:16:41 +02:00
Nicolas Martignoni a6c6196f0f Add checks for address without @-symbol
- This fixes bug #5.
2019-06-10 21:58:42 +02:00
Harsh Shandilya d256cdb39a Migrate my SELinux gist to blog
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-09 18:10:10 +05:30
Harsh Shandilya 0e9add9782 Redirect Netlify subdomain to my primary domain
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-08 20:22:06 +05:30
Harsh Shandilya b62644cadb Don't configure hugo version in repo
Changed globally on netlify instead.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-08 20:15:08 +05:30
Harsh Shandilya 35aab919c1 Make publickey a text file to allow opening in browser
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-06 17:20:22 +05:30
Harsh Shandilya b76308135f Add DEV.to badge
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-02 21:24:25 +05:30
Harsh Shandilya c91108b060 Add author name to RSS feed
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-02 15:44:10 +05:30
Harsh Shandilya 7d8c5fd03b Update theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 11:53:13 +05:30
Harsh Shandilya af5cf9e2b1 Enable twitter share for blog posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 01:34:22 +05:30
Harsh Shandilya 7c53b37373 Use FA icons on homepage
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 01:33:41 +05:30
Harsh Shandilya 6c42b5fa1f Fork hugo-coder-portfolio
Bring in some additional features from the parent theme

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 01:25:36 +05:30
Harsh Shandilya 473e2849b7 Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 00:55:07 +05:30
Harsh Shandilya 13e01cddab Blog post: How to get involved in OSS
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 00:37:27 +05:30
Harsh Shandilya 3d32b0e7ad Add script to generate skeleton files for blog posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-31 23:53:08 +05:30
Harsh Shandilya 5a62fe7817 Add README
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 19:08:46 +05:30
Harsh Shandilya 39daab8290 Replace SpammedIn with Keybase
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 19:02:44 +05:30
Harsh Shandilya ff7a85aa37 Revert "Update config"
Centered items look pretty bad on mobile.

This reverts commit c358c68659.
2019-05-30 18:59:36 +05:30
Harsh Shandilya c358c68659 Update config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 18:57:27 +05:30
Harsh Shandilya d9f2dbecbe Init blog
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 18:51:43 +05:30
Harsh Shandilya 4ba29a3d60 Configure Netlify to use Hugo 0.55.6
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 04:19:31 +05:30
Harsh Shandilya ade8800251 Tweak menu item weight
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 04:08:47 +05:30
Harsh Shandilya c1e064f9fd Bump submodule
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 03:53:54 +05:30
Harsh Shandilya e8dfa28f90 Switch back to theme submodule
instant.page is not enough incentive to fork and make updating the theme
a chore.

This reverts commit ead9a4ee18.
2019-05-30 03:53:54 +05:30
Harsh Shandilya ead9a4ee18 Update to instant.page 1.2.2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-29 23:38:54 +05:30
Harsh Shandilya 10e0b45d4e Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-29 19:10:12 +05:30
Djordje Atlialp 9b4cdc2e56 Merge pull request #35 from gabrielferreirapro/fix-language-translation
Small fix on name of language
2019-05-27 23:35:44 +02:00
Gabriel Ferreira 1b2ba86a53 Small fix on name of language 2019-05-27 18:01:22 -03:00
Djordje Atlialp 702d7f1c64 Merge pull request #34 from andrealmeid/logo_monospaced
sass: make logo font monospaced
2019-05-26 00:10:29 +02:00
Djordje Atlialp 651a0aa149 Merge pull request #33 from andrealmeid/telegram_icon
icons: add Telegram icon
2019-05-26 00:09:34 +02:00
Harsh Shandilya 905e5e4b8a Check in my Keybase proof
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-24 17:04:22 +05:30
André Almeida 0db6cfc9dd sass: make logo font monospaced
Since the logo text wants to have the look and feel of a terminal, make
the font monospaced.

The monospace word is used twice because of this hack:
https://stackoverflow.com/questions/38781089/font-family-monospace-monospace

Signed-off-by: André Almeida <andrealmeid@riseup.net>
2019-05-23 00:01:27 -03:00
André Almeida 59e11088e4 icons: add Telegram icon
Add a Telegram Icon to be displayed at social section. Although Feather
icons doesn't have any Telegram icon, I believe this is a good
replacement.

Signed-off-by: André Almeida <andrealmeid@riseup.net>
2019-05-22 20:45:57 -03:00
Djordje Atlialp de326c5911 Merge pull request #21 from codgician/master
Better multilingual support
2019-05-23 01:44:59 +02:00
Djordje Atlialp fd6c0a27cc Merge pull request #32 from andrealmeid/h1_flex
sass: fix h1 position
2019-05-23 01:41:49 +02:00
André Almeida 804956b175 sass: fix h1 position
Signed-off-by: André Almeida <andrealmeid@riseup.net>
2019-05-22 20:29:32 -03:00
Djordje Atlialp e47c5b42f2 Merge pull request #23 from gabrielferreirapro/master
Add translations and support for pt-br.
2019-05-16 11:12:41 +02:00
Karan Sharma 9705651472 fix: inline style for list 2019-05-09 01:07:21 +05:30
Gabriel Ferreira c49d9906fe Add translations and support for pt-br. 2019-05-05 13:38:55 -03:00
z0li aac8e52817 Removed deprecated .Hugo and .RSSLink 2019-04-27 20:02:51 +02:00
Jimmy Zhang afeec1d7f2 Set correct theme color after page is loaded 2019-04-24 20:55:03 +08:00
Jimmy Zhang ffcb30ab07 Better multilingual support: absURL -> absLangURL 2019-04-24 20:52:53 +08:00
Djordje Atlialp dc3d661560 Fix menu items are not clickable on smart devices sometimes 2019-04-22 21:04:37 +02:00
Djordje Atlialp 2d34328795 Merge pull request #17 from DuncanmaMSFT/original
Adding reduced motion media query to turn off the cursor based on user preference
2019-04-22 20:18:43 +02:00
Djordje Atlialp e5ea23725b Merge pull request #19 from eli-rodriguezperez/feature/spanish-support
Added spanish support for flag and translation
2019-04-22 20:16:57 +02:00
Eli Rodriguez 524378bdc9 Added spanish support for flag and translation 2019-04-22 15:55:28 +02:00
Duncan Mackenzie c10530bcaf switching to RelPermalink instead of Permalink for JS and CSS files 2019-04-20 13:40:30 -07:00
Duncan Mackenzie 3fd97a789b Adding media query for reduced motion to turn off animation in that case 2019-04-20 13:19:52 -07:00
Duncan Mackenzie c972e5035a Merge pull request #1 from rhazdon/master
Pull in latest from upstream master
2019-04-20 12:58:19 -07:00
Vivek R 6fe7eb3a2f fix: show 10 recent posts for exampleSite 2019-04-20 19:50:32 +05:30
Vivek R 40aa3ca133 fix: minor theme.toml update and add images for hugo themes submission 2019-04-20 19:48:13 +05:30
Vivek R 5ce0fb9f4d chore: updare credits in README 2019-04-20 14:31:13 +05:30
Vivek R 7ed95013e2 chore: add demo url to README 2019-04-20 14:29:27 +05:30
Vivek R 774b94b895 fix: fix screenshot markdown 2019-04-20 14:25:44 +05:30
Vivek R 74e9ee7758 chore: add screenshot to README 2019-04-20 14:19:04 +05:30
Vivek R 6c755e82df chore: update README 2019-04-20 14:12:20 +05:30
Vivek R 6b00ac4d91 feat: add rss link to header 2019-04-20 14:12:08 +05:30
Vivek R 7d249c573f fix: allow disqus field in content to onveride site params 2019-04-20 14:11:54 +05:30
Vivek R 80353300b3 fix: remove public generated files in exampleSite 2019-04-20 14:09:28 +05:30
Vivek R e890d56aff feat: add netlify build config 2019-04-20 00:47:22 +05:30
Vivek R 3e2648b386 feat: add exampleSite 2019-04-20 00:46:01 +05:30
Vivek R dbd1ca021e fix: use hugo menu instead of custom params 2019-04-20 00:45:43 +05:30
Vivek R b89ed755ef feat: add social icons and template bug fixes 2019-04-20 00:22:50 +05:30
Chris d1639c4f54 Ensure spaces around span tag (#3) 2019-04-19 18:00:57 +02:00
Nicolas Martignoni ad5c047cd5 Add parameter to display a text instead of the e-mail address
- See issue #1.
- Credits goes to @chris-79 for the idea.
2019-04-18 22:10:06 +02:00
Djordje Atlialp 617a430d32 Add main tag in homepage 2019-04-16 01:39:18 +02:00
Djordje Atlialp c47aa71e4a Rename css in pipeline 2019-04-16 01:39:00 +02:00
Djordje Atlialp 20e9e3cf40 Fix assets generation path
Assets were generated into  `resources/_gen/js/js/*` and `resources/_gen/scss/scss/*`. Now the files are in the correct folder --> no double nesting anymore.
2019-04-16 00:29:02 +02:00
Djordje Atlialp f37c98a411 Minify assets 2019-04-15 23:14:06 +02:00
Djordje Atlialp b95a8ffa3e Remove `resources` dir 2019-04-15 23:13:21 +02:00
Djordje Atlialp 3a6bc0755c Remove unused css 2019-04-15 23:11:21 +02:00
Djordje Atlialp 927044d00b Fix RSS deprecation warning
https://github.com/rhazdon/hugo-theme-hello-friend-ng/issues/12
2019-04-15 22:23:27 +02:00
Harsh Shandilya 62463bee72 Sync theme changes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-04-14 17:49:19 +05:30
Vivek R e9b2b8f64d feat: add syntax highlight, Google analytics, Disqus and responseive view 2019-04-11 18:09:27 +05:30
Vivek R 0acbe2865d feat: initial implementation 2019-04-10 02:29:17 +05:30
Nicolas Martignoni 7cfc7f3688 Update usage documentation 2019-04-06 14:15:08 +02:00
Nicolas Martignoni 9118c82c70 Add "class" parameter 2019-04-06 14:03:04 +02:00
Nicolas Martignoni 27689eccb0 Fix protocol scheme 2019-04-03 18:54:36 +02:00
Nicolas Martignoni d64666ce19 Backport ideas by @mxmehl
- Parameters can be positional or named.
- Arbitrary protocols can be given.
- Fingerprint Javascript code to make it unique.
2019-04-03 17:08:05 +02:00
Djordje Atlialp c2d78a290c Minify js 2019-03-30 19:45:07 +01:00
Djordje Atlialp 05d8b2fd5e Include prism.js again 2019-03-30 19:44:49 +01:00
Djordje Atlialp fa50c076ad Merge pull request #9 from metawave/master
remove unused source code pro font
2019-03-30 18:20:31 +01:00
Djordje Atlialp 3e5f111ef7 Merge pull request #8 from DuncanmaMSFT/patch-1
Updating to make post title it's H1 on single page
2019-03-30 18:14:53 +01:00
Marcel Ryser bf98f33f80 remove unused source code pro font 2019-03-25 14:02:43 +01:00
Duncan Mackenzie 3e9c550e99 Updating to make post title it's H1 on single page
Right now there wasn't an H1 at all, and the title was written out as a H2. Ideally we'd have the H1 be the main subject of the page (the post title seems appropriate for that), the first heading and there would be only the one H1.
2019-03-22 15:20:01 -07:00
Djordje Atlialp f11d0dc45c Merge pull request #6 from Reijnn/Remove-Prism.js
Remove Prism.js
2019-03-16 00:57:45 +01:00
Reijnn 86972ec610 Remove Prism.js 2019-03-12 20:53:04 +01:00
Djordje Atlialp cf9126f617 Merge pull request #3 from Reijnn/master
Added theme-color param for mobile devices
2019-03-05 18:50:58 +01:00
Reijnn e1ba150129 Fix empty description meta tag 2019-03-05 13:26:06 +01:00
Niels Reijn 9c1a3c9a87 Merge branch 'master' into master 2019-03-05 13:19:33 +01:00
Reijnn d139f30bc1 theme-color now changes with site theme 2019-03-05 13:16:59 +01:00
Djordje Atlialp d0132e8abd Merge pull request #4 from johnletey/pr/add-custom-css-js
Add ability to add custom css and js
2019-02-28 22:17:08 +01:00
John Letey 9a7e917524 feat: add ability to add custom css and js 2019-02-27 14:41:56 +00:00
Reijnn 4768579635 Update README.md to generate favicons 2019-02-27 12:54:16 +01:00
Reijnn 359c3a6723 Added theme-color param for mobile devices 2019-02-27 12:46:39 +01:00
Djordje Atlialp b757aae312 Merge pull request #2 from Reijnn/master
Support for dutch language flag
2019-02-27 11:03:59 +01:00
Reijnn 00c2825ed8 Support for dutch language flag 2019-02-27 10:56:19 +01:00
Djordje Atlialp c8af7937b0 Merge pull request #1 from johnletey/pr/remove-extra-bracket
Remove extra bracket
2019-02-27 08:45:52 +01:00
John Letey a2c82d1ecd refactor(GitInfo): remove extra bracket 2019-02-27 07:02:08 +00:00
Djordje Atlialp f2272ed843 Delete about-in-footer.md 2019-02-25 23:28:34 +01:00
Djordje Atlialp 2b3d377245 Exclude javascript parts into own file 2019-02-25 23:28:30 +01:00
Djordje Atlialp e8e96b0f69 Remove [menu.footer] 2019-02-25 23:27:44 +01:00
Djordje Atlialp 0de6fa2f50 Add exampleSite 2019-02-25 10:31:15 +01:00
Djordje Atlialp afe817a5ab Add resources to theme 2019-02-22 19:21:59 +01:00
Djordje Atlialp b6a1a3881b Update footer.html 2019-02-22 16:42:33 +01:00
Djordje Atlialp 549fc22edf Add defaults for date things 2019-02-22 16:41:01 +01:00
Djordje Atlialp 08de3f8420 Add images 2019-02-22 16:40:34 +01:00
Djordje Atlialp ddfb866150 Update footer.html 2019-02-22 16:11:46 +01:00
Djordje Atlialp 2940e2c053 Update theme.toml 2019-02-22 16:11:42 +01:00
Djordje Atlialp 49087093c6 Update LICENSE.md 2019-02-22 15:53:47 +01:00
Djordje Atlialp 35636d523c Update head.html 2019-02-22 15:45:43 +01:00
Djordje Atlialp 54d303e774 Update README.md 2019-02-22 15:24:17 +01:00
Djordje Atlialp 521781d809 Update package.json 2019-02-22 15:22:22 +01:00
Djordje Atlialp 7b439b373e Delete webpack.config.js 2019-02-22 15:22:14 +01:00
Djordje Atlialp 41dbe33ecb Use js generation from hugo instead of webpack 2019-02-22 15:22:10 +01:00
Djordje Atlialp 770c3bb397 Delete hello.jpg 2019-02-22 15:21:50 +01:00
Djordje Atlialp 13afe84750 Remove dir static/assets 2019-02-22 15:21:44 +01:00
Djordje Atlialp 132fa36fc7 Move javascript files from dir source to assets 2019-02-22 15:21:13 +01:00
Djordje Atlialp 60ee365a8c Move fonts from dir source to static 2019-02-22 15:20:41 +01:00
Djordje Atlialp 8b8c1d23d1 Use the scss generation from hugo 2019-02-22 15:19:42 +01:00
Djordje Atlialp 484980e920 Move SCSS files from dir source to assets 2019-02-22 15:19:21 +01:00
Harsh Shandilya 0579d62a96 Add instant.page support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-02-20 14:14:41 +05:30
Harsh Shandilya e85c2fbdac Switch theme from submodule to in-tree squash
Easier to make changes to the base theme.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-02-20 14:12:14 +05:30
Nicolas Martignoni 492d616cf0 Update README.md 2019-02-07 19:17:05 +01:00
Nicolas Martignoni 3c0d3c5b3e Fix link 2019-02-06 08:27:27 +01:00
Nicolas Martignoni 782a73e806 Added Awesome badge
- Thanks goes to @budparr for his curated list of Hugo resources.
2019-02-06 08:26:53 +01:00
Nicolas Martignoni 791451bc0d Create .gitignore file 2019-02-05 21:38:57 +01:00
Nicolas Martignoni 27c95eedd6 Add files to repository 2019-02-05 21:36:47 +01:00
Nicolas Martignoni baa75498aa Initial commit 2019-02-05 21:35:37 +01:00
Djordje Atlialp 45847e2796 Don not load prism.js/.css from cdn anymore 2019-02-04 14:44:49 +01:00
Djordje Atlialp 462cc40aa6 Add prism 2019-02-04 14:31:32 +01:00
Djordje Atlialp e5c342661c Default single page also displays language flags 2019-02-03 01:36:24 +01:00
Djordje Atlialp c43a743241 Update README.md 2019-02-02 21:03:48 +01:00
Djordje Atlialp bee9cb92db Edit css 2019-02-02 21:02:26 +01:00
Djordje Atlialp da080da8dd Add better support multi languages in menu 2019-02-02 21:02:02 +01:00
Djordje Atlialp 0980dc952d Add flag-icon.css 2019-02-02 21:00:56 +01:00
Djordje Atlialp 54566c7f64 Add meta author tag 2019-02-02 21:00:40 +01:00
Djordje Atlialp 4a294e6af0 Create langFlags.yaml 2019-02-02 21:00:19 +01:00
Djordje Atlialp 94ff3740ff Remove pagination and reading infos from normal single pages 2019-02-02 21:00:12 +01:00
Djordje Atlialp 552953a0e7 Add extra single.html page for posts 2019-02-02 20:59:39 +01:00
Djordje Atlialp 050b696219 Add translations and support for fr 2019-02-02 20:58:44 +01:00
Harsh Shandilya 6e1e1085dc WireGuard-KT is now Viscerion
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-02-03 00:49:21 +05:30
Djordje Atlialp 9445da9e90 Edit README.md 2019-01-28 02:12:43 +01:00
Djordje Atlialp 2adbaf57e7 Add comments flag to enable/disable comments per page 2019-01-28 02:12:09 +01:00
Djordje Atlialp bffaf0150b Remove exampleSite 2019-01-28 02:11:38 +01:00
Djordje Atlialp df93ce7ae4 Upload production ready js 2019-01-27 23:17:53 +01:00
Djordje Atlialp 4b527fb8bd Edit theme.toml 2019-01-27 23:17:37 +01:00
Djordje Atlialp d8036a9993 Edit README.md 2019-01-27 23:17:21 +01:00
Djordje Atlialp 7aad132ff7 The graat customizing ... 2019-01-27 23:02:55 +01:00
panr 89e144b4e8 Fix Head meta 2019-01-25 18:54:07 +01:00
panr 91d762f17c Change theme config 2019-01-25 18:30:24 +01:00
panr e25cfe7977 Update meta for Hugo themes base 2019-01-25 16:49:30 +01:00
panr c9f7c5b4d2 Add contentTypeName to config 2019-01-25 10:21:14 +01:00
Harsh Shandilya 83d01645ef Copy GPG key into website source
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-01-21 19:09:48 +05:30
Radek Kozieł cbc1b8f545 Update README.md 2019-01-21 08:54:54 +01:00
panr edd271f026 Add multilanguage support 2019-01-20 17:55:51 +01:00
Harsh Shandilya a864577ec7 Add wahoo Caesium
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-01-14 11:57:58 +05:30
panr 8718cf5992 Update README 2019-01-06 17:41:44 +01:00
panr d8a5cbb8a6 Update README 2019-01-06 17:26:27 +01:00
panr 47a13ddafe Update readme 2019-01-06 12:01:12 +01:00
panr b5a13c9d53 Update screens 2019-01-06 11:59:15 +01:00
panr e96ddf719e Rebuild theme 2019-01-06 11:45:48 +01:00
panr a673e71372 Update and customize prism 2019-01-06 11:44:38 +01:00
panr c2ba4be129 Update theme for 2019 2019-01-06 11:23:25 +01:00
panr fcdf026e96 Fix theme config 2019-01-06 10:25:03 +01:00
panr 0062797a0a Add bash/shell, toml and actionscript to highlighter 2018-12-29 17:05:55 +01:00
Radek Kozieł f3c4c5f24d Update README.md 2018-12-22 09:49:54 +01:00
panr 729f947681 Set default theme in config toml 2018-12-21 19:07:58 +01:00
Radek Kozieł 5ee3aaf6c4 Update README.md 2018-12-13 16:18:29 +01:00
panr 9466cf6ee9 Add figure shortcode 2018-12-13 08:37:46 +01:00
panr 61c6406ac3 Update font 2018-12-12 19:56:24 +01:00
panr 8e2e37eece Add image shortcode 2018-12-12 19:55:37 +01:00
Harsh Shandilya 610bee5184 Add wireguard-kt privacy policy
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-12-03 11:43:47 +05:30
panr c9f720e77d Update Inter UI font to version 3.0 2018-11-16 12:39:16 +01:00
Radek Kozieł b7bbbe8e35 Merge pull request #10 from manuhortet/patch-1
Fix bug in apple touch icon path
2018-11-12 16:35:46 +01:00
Harsh Shandilya f991857d8e Link caesium to github
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-11-12 11:02:05 +05:30
Harsh Shandilya cf0c3d9537 Add GPG key
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-11-12 11:00:29 +05:30
Harsh Shandilya 84989be92d Update projects.md
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-10-19 10:24:38 +05:30
Sebastian Engels 0d3454f8d3 Add Quick Start Forestry Button to Readme.md 2018-10-18 16:35:12 +02:00
Harsh Shandilya eef2401fe7 Re-do contact page
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-10-16 23:05:13 +05:30
Harsh Shandilya 76e256f4c3 Remove unused theme
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-10-16 22:55:52 +05:30
Harsh Shandilya c04d8809ca Switch to hugo-coder-portfolio
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-10-16 22:55:40 +05:30
Manu Hortet 8171ebd182 Fix bug in apple touch icon path
Same correction was already done for the favicon.png path
2018-10-02 12:09:38 +02:00
Radek Kozieł 35cf3f4579 Merge pull request #9 from juicemia/fix-favicon-path
Fix bug in favicon path
2018-09-18 00:44:37 +02:00
Hugo Torres 1be8f56980 Fix bug in favicon path 2018-09-09 19:56:43 -04:00
panr b9b768da2a Add Haskel and other languages & fix menu item margin 2018-09-07 23:05:49 +02:00
panr f233e4231b Merge 2018-09-04 09:18:53 +02:00
panr 4ba37d7f3f Fix code copy button styling 2018-09-04 09:16:52 +02:00
Radek Kozieł 61cf53b83f Merge pull request #8 from marioblokland/fix_code_uppercase
Prevent uppercase transformation of code
2018-09-04 09:05:00 +02:00
Mario Blokland da87503eb0 Prevent code with Ubuntu or Ubuntu Mono font from being uppercased
* Ubuntu or Ubuntu Mono fonts were being uppercased when in combination
  with a font-feature-setting called 'case'.

* Set the font feature settings to for <code> tags to 'normal' so
  that the Ubuntu Mono font is not being uppercased

* Put back in the 'case' font-feature setting for the body
2018-09-04 08:51:27 +02:00
Mario Blokland 0ef2d6ca89 Prevent uppercase transformation of code 2018-09-03 21:14:57 +02:00
panr ccbbbf1eaa Fix logoText variable & prevent code text transform 2018-09-03 09:10:12 +02:00
Radek Kozieł de66e56ef5 Update README.md 2018-09-02 11:49:36 +02:00
panr 7235118034 Fix code highlighting & allow to edit hello-friend logo text fron config file 2018-08-30 23:28:52 +02:00
Sorin Davidoi 72f4fa344a fix(layouts/single): Use <time> 2018-08-29 19:37:49 +02:00
Sorin Davidoi 0035acac13 fix(layouts/index): Use <time> and <article> 2018-08-29 19:37:35 +02:00
Sorin Davidoi 13f4ea3c02 fix(layouts/list): Add datetime attribute to <time> 2018-08-29 19:37:17 +02:00
Sorin Davidoi a53c1525c3 fix(partials/head): Allow zooming
Disabling zooming is problematic for people with low vision (https://dequeuniversity.com/rules/axe/3.0/meta-viewport).
2018-08-27 21:56:45 +02:00
Sorin Davidoi 3074818ed5 fix(partials/sidebar): Use more semantic elements 2018-08-27 21:56:32 +02:00
Sorin Davidoi 50b5ddfd64 fix(_default/baseof): Use main tag
https://dequeuniversity.com/rules/axe/3.0/landmark-one-main
2018-08-27 21:56:09 +02:00
panr 40c64a679d Add compiled files 2018-08-24 09:42:15 +02:00
panr 9f68618996 New Version - 1.0.1 — Set dark theme as default & fix eslint 2018-08-24 09:37:55 +02:00
panr 259f86abb2 Fix examplePage config.toml and edit Readme 2018-08-23 23:58:22 +02:00
panr 1e0f22f6ea Fix margin in pre code 2018-08-21 13:28:58 +02:00
Harsh Shandilya 4c482f9862 Fix typo in G+ link
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-08-11 02:30:24 +05:30
Matt Smith 28b671ab04 Fix for mixed insecure content 2018-08-07 22:14:33 +02:00
panr 9b99d7db73 Update date format 2018-07-30 19:03:01 +02:00
panr eba407aa32 Update styles 2018-07-30 18:56:21 +02:00
panr 2023708f73 Fix footer credentials and date format 2018-07-30 18:55:26 +02:00
Harsh Shandilya b8e825a692 Update FontAwesome
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-27 20:55:11 +05:30
panr 6557571b80 Update Webpack config 2018-07-25 16:31:54 +02:00
panr 975f8adbf5 Fix menu trigger appearance 2018-07-25 00:37:54 +02:00
panr 12f857fae7 Fix menu script 2018-07-25 00:35:03 +02:00
panr 1ca7b86e6c Add possibility to set up your own logotype in config 2018-07-25 00:28:34 +02:00
panr a4a62f2eff Add assets 2018-07-24 23:40:26 +02:00
panr 98343f3d39 Add minor fixes (buttons, headers) 2018-07-24 23:35:46 +02:00
panr 923bfe45c5 Upload assets 2018-07-24 19:52:45 +02:00
panr b568cfb85b Fix README.md 2018-07-24 19:37:10 +02:00
panr 69735a90a7 Fix post meta 2018-07-24 19:35:24 +02:00
panr 664354e500 Change and move browserlist settings to package.json 2018-07-24 01:05:31 +02:00
panr c659774bef Fix Webpack, PostCSS and related configs 2018-07-23 20:55:40 +02:00
Radek Kozieł 340a26cc67 Update README.md 2018-07-20 19:19:43 +02:00
panr 4a11b51ba5 Update README 2018-07-20 19:18:16 +02:00
panr 4e67004628 Init 1 2018-07-20 19:14:22 +02:00
Harsh Shandilya 23a5c0282f Caddyfile: Set git pull internal to 10 minutes
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 16:44:30 +05:30
Harsh Shandilya edccd66b47 Add a fresh 404 page
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 16:43:29 +05:30
Harsh Shandilya c85e59a7bb Caddyfile: Fix hugo plugin
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 10:45:08 +00:00
Harsh Shandilya 4c4b9c1d48 Switch to https
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 10:33:19 +00:00
Harsh Shandilya b1fb58a0b2 Add Caddyfile
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 10:33:10 +00:00
Harsh Shandilya 58f635c404 Rename publish script to deploy.sh
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-17 03:43:19 +05:30
Harsh Shandilya 45154366bb Update
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-17 03:42:53 +05:30
Harsh Shandilya 9bc4919919 vec: Hide /home/{user} text on smaller screens
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-17 03:31:25 +05:30
Harsh Shandilya 1c3dc743f2 Fix typo
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-16 22:40:03 +05:30
Harsh Shandilya 612d120f13 content: Fixup wording
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 18:26:20 +05:30
Harsh Shandilya 7e2525dd6f src: Add publish script
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:49:00 +05:30
Harsh Shandilya 51247ec7f5 src: Add downloads link
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:44:16 +05:30
Harsh Shandilya 2bb30b76c5 src: Add projects page
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:42:04 +05:30
Harsh Shandilya 7e99bf9e4e src: Use a separate param for header username
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:28:55 +05:30
Harsh Shandilya 7b20e86b27 src: Remove unused theme
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:26:50 +05:30
Harsh Shandilya be2b33099b Update
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:22:54 +05:30
Bjørn Erik Pedersen b9530c3d7f Update head.html
Fixes #49
2018-03-17 09:43:15 +01:00
Kevin Wiliarty 155f263d2f Fix #47: adds hook_head_end partial 2018-02-27 01:08:00 +01:00
Harsh Shandilya 7e8f1b8aa0 config: Fall back to old intro
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-02-07 01:45:12 +05:30
Harsh Shandilya 2a39d88d0a Update
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-02-07 01:41:50 +05:30
digitalcraftsman 5814b3e80c Implement Content Summaries / Split on index page 2017-10-01 11:23:48 +02:00
JinGen Lim b469743f16 Implement Content Summaries / Split on index page
Posts in the index page will be automatically summarized to its first 70
words, or until a user-defined <!--more--> divider. When summarized, the
"Read More" button also appears with a RelPermalink to the full post.

https://gohugo.io/content-management/summaries/
2017-10-01 11:26:37 +08:00
digitalcraftsman dae01e12f7 Bump required Hugo version to v0.21 2017-09-07 22:07:11 +02:00
digitalcraftsman 76efde8ee2 Add CHANGELOG 2017-09-07 22:06:50 +02:00
digitalcraftsman e91b1383ee Fix url for Google fonts 2017-09-07 22:01:10 +02:00
digitalcraftsman 804cee4561 Add YAML example for Disqus in README 2017-09-07 21:57:31 +02:00
digitalcraftsman 7cf2943ef4 Add Google Analytics support
Closes #44
2017-09-07 21:56:31 +02:00
digitalcraftsman eab1974019 Switch to Hugo's built-in Disqus template 2017-09-07 21:52:10 +02:00
digitalcraftsman 8349cf1aa1 Remove custom Disqus template 2017-09-07 21:45:12 +02:00
digitalcraftsman fe56862a53 Trim more whitespace in template logic 2017-09-07 21:43:11 +02:00
digitalcraftsman 82832c1244 Make use of the base template 2017-09-07 21:41:16 +02:00
digitalcraftsman 50fec3e32d Update link to Hugo site 2017-09-01 13:56:28 +02:00
Alexander Ivanov 01dd84d129 Update link to Hugo site
The http://hugo.spf13.com is unreachable. By the context, the https://gohugo.io will be appropriate.
2017-09-01 14:30:25 +03:00
digitalcraftsman c336c33527 Use .Site.BaseURL to generate sidebar "Home" link 2017-07-25 19:03:24 +02:00
Vivek Ghaisas 5aab5b03ab Fix indentation in layouts
- Change indentation to 2 spaces to match convention
- Don't indent <body> and <head> as per convention
2017-07-25 19:02:27 +02:00
Mohammed El-Dahash 561c22d401 Print CSS to fix printing problems
No more sidebar filling half of the printed pages, or unnecessary blank pages.
2017-07-25 18:29:32 +02:00
Mohammed El-Dahash b155b334bd Add print css link 2017-07-25 18:29:32 +02:00
Mohammed El-Dahash b35d6d2d6b Add print css link 2017-07-25 18:29:32 +02:00
Bjørn Erik Pedersen 80695973ac Fix disqusShortname conditional
Fixes #43
2017-07-25 10:18:25 +02:00
Vivek Ghaisas e199c3b532 Use .Site.BaseURL to generate sidebar "Home" link 2017-05-26 23:17:53 +03:00
digitalcraftsman daead1a8b0 Bump required Hugo version to v0.19+ 2017-04-08 18:25:09 +02:00
Oliver Schneider 6404f691fa Replacing deprecated function call with now preferred version (#39)
Using the old call was producing the following Warning:

WARNING: Page's Now is deprecated and will be removed in a future
release. Use now (the template func).
2017-03-25 12:09:32 +01:00
Harsh Shandilya 565b880fab 404 : Remove footer 2017-01-26 15:36:33 +05:30
Harsh Shandilya 57aa3f722f Add in a cheeky 404 page :') 2017-01-26 15:07:05 +05:30
Harsh Shandilya 1e39ef0d29 Optimise SEO 2017-01-15 20:08:24 +05:30
Harsh Shandilya a4d828fc8e unminify css, improve icon sizes and color schemas 2017-01-15 19:59:27 +05:30
Harsh Shandilya 2881e84ad5 cleanup 2017-01-15 03:35:44 +05:30
Harsh Shandilya 5bd9426fec new theme 2017-01-15 03:32:31 +05:30
Harsh Shandilya 02b9f86721 Fix OCD padding 2017-01-15 02:49:23 +05:30
Harsh Shandilya 4068a8b7ae Keep avatar image hosted within the site 2016-12-11 01:42:54 +05:30
Harsh Shandilya 08055d40f0 Remove old theme and nix example site
Also added some SEO stuff
2016-12-09 10:06:17 +05:30
Harsh Shandilya 6ab179dcd5 Let's Linux, eh? 2016-12-08 00:25:39 -06:00
Harsh Shandilya 6814adf52e wtf is a mobile build engineer? 2016-12-07 21:03:02 -08:00
digitalcraftsman d34cfef927 Rename RSSlink to RSSLink 2016-11-17 20:11:20 +01:00
Bjørn Erik Pedersen 99a6d2a372 Rename RSSlink to RSSLink
The former will be deprecated and eventually removed from Hugo.

Note: Currently both of them exist in Hugo, which is the reason for the cleanup.
2016-11-17 09:18:55 +01:00
Harsh Shandilya 5f047bc141 Some Google specific tuning
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-11-11 22:54:34 +05:30
Harsh Shandilya 876c0a8d0d Woops 2016-11-09 13:12:38 +05:30
Harsh Shandilya 91c9f0eb70 Try out netlify's form submissions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-11-08 18:09:43 +05:30
Harsh Shandilya 75a3736b1e Add gitignore
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-10-15 21:38:48 +05:30
Harsh Shandilya de3b56952e Update avatar 2016-10-06 08:43:52 +05:30
Harsh Shandilya 5b8aad352a Stretch out the Twitter feed even more 2016-10-04 09:19:57 +05:30
Jason Yee dbf82dbcff Add layout-reverse body class code to single and list templates. 2016-08-19 19:20:33 +02:00
Jakub Kucharski 61243733ec Don't repeat title in <title> tag on the home page 2016-08-19 19:17:17 +02:00
Harsh Shandilya 9c31c7f913 Increase width of the Twitter feed 2016-07-29 01:24:02 +05:30
Pedro Melo fff9d5b21f Add installation section 2016-07-26 14:27:07 +02:00
Harsh Shandilya 0269d8fe68 Merge branch 'master' of https://github.com/MSF-Jarvis/msfjarvis.me 2016-07-23 13:02:16 -05:00
Harsh Shandilya eb24365aba Cleanup config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-07-23 13:02:14 -05:00
Harsh Shandilya aa824da21f Add Twitter feed
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-07-23 23:30:56 +05:30
Harsh Shandilya dfba8bf5ec Add link to blog 2016-07-14 15:38:42 +05:30
Harsh Shandilya 8cff99c06d Add some possibly unneeded SEO shiz 2016-07-10 21:10:28 +05:30
MSF Jarvis a129275ae6 Fix url
Signed-off-by: MSF Jarvis <msfjarvis@gmail.com>
2016-07-08 18:42:47 +05:30
MSF Jarvis 989ec79061 Initial commit
Signed-off-by: MSF Jarvis <msfjarvis@gmail.com>
2016-07-08 18:27:17 +05:30
Ján Koščo a04b9e1574 Add configuration to Reverse layout 2016-03-08 23:16:04 +01:00
Matthew Buckett d06d24a0a3 Use language from configuration.
The header should use the language supplied in the configuration rather than hardcoding to english (US).
2016-01-02 12:42:18 +00:00
digitalcraftsman bf6f0a4426 Merge pull request #26 from bigwhite/master
fix #25: make 404 page use Site.Params.themeColor
2015-09-22 12:34:03 +02:00
Tony Bai 1d6e11a374 make 404 page use Site.Params.themeColor 2015-09-22 17:28:15 +08:00
Bjørn Erik Pedersen 1bb0a5b332 Merge pull request #23 from philgs/double-slash
Remove double-slashes in stylesheet URLs
2015-08-13 18:27:09 +02:00
philgs ca2ed0b862 Remove double-slashes in stylesheet URLs 2015-08-13 11:19:02 -04:00
digitalcraftsman 52c5552a43 Fixes #22 2015-08-01 13:21:28 +02:00
digitalcraftsman 4124bae9ce Updated theme.toml 2015-07-17 12:38:13 +02:00
digitalcraftsman 6fdb7f9d4b Removed non-working link from README 2015-07-17 12:28:12 +02:00
digitalcraftsman 62ef2ef06f Added Disqus support 2015-07-17 12:23:59 +02:00
digitalcraftsman a874cebd98 Updated README 2015-07-15 12:19:53 +02:00
digitalcraftsman cd672f87b7 Merge pull request #15 from digitalcraftsman/change-theme-in-configs-globally
Added an option change the theme globally in the configs
2015-07-15 12:08:39 +02:00
digitalcraftsman 75ea79ab8b Merge pull request #11 from marc-jones/patch-1
Corrected link to favicon image
2015-07-14 00:07:57 +02:00
digitalcraftsman 48ee248670 Set min_version to 0.14 2015-07-13 23:53:44 +02:00
digitalcraftsman 2bec57881b Merge pull request #14 from digitalcraftsman/sidebar-link-to-home
Linking the title in the sidebar to home
2015-07-13 23:48:38 +02:00
digitalcraftsman c87ec5559f Linking the title in the sidebar to home 2015-07-13 23:45:26 +02:00
digitalcraftsman 2d0f48c7f8 Merge pull request #16 from digitalcraftsman/404-page
Added a 404 page
2015-07-13 23:42:56 +02:00
digitalcraftsman 11adcd3d14 Added .BaseURL to link in 404 page 2015-07-13 23:42:18 +02:00
digitalcraftsman 5b9efdbc1f Added a 404 page
This addition implements the design of the original 404 page.
2015-07-13 23:42:18 +02:00
digitalcraftsman d84c5080b6 Merge pull request #17 from kwo/master
change .BaseUrl to .BaseURL
2015-07-13 23:24:51 +02:00
digitalcraftsman bb47bd018b Merge pull request #19 from digitalcraftsman/fix-url-variable
Replaced .Url with .URL in sidebar.html
2015-07-13 23:24:26 +02:00
digitalcraftsman fb2045b770 Merge pull request #18 from anthonyfok/add-hugo-generator
Add {{ .Hugo.Generator }}
2015-07-13 23:24:18 +02:00
digitalcraftsman 884e8edcd9 Replaced .Url with .URL in sidebar.html 2015-06-25 21:54:21 +02:00
Anthony Fok 4e4c359b9a Add {{ .Hugo.Generator }} 2015-06-18 13:50:55 -06:00
Karl Ostendorf b8dbb20793 change .BaseUrl to .BaseURL 2015-06-10 15:21:13 +02:00
digitalcraftsman 6f6a0a7feb Added missing change in index.html 2015-06-02 19:22:45 +02:00
digitalcraftsman 00eb7169f6 Added an option change the theme globally in the configs 2015-06-02 19:14:54 +02:00
Marc Jones 13774d8035 Corrected link to favicon image
The original reference was to favicon.ico, when the provided image is .png
2015-05-18 17:21:07 +01:00
Steve Francia 1a7140a4d7 Merge pull request #10 from EitZei/master
Convert rem's to em's in breakpoints
2015-05-01 17:10:52 -04:00
Steve Francia d89bc2905e Merge pull request #9 from giodamelio/master
Fetch Google fonts over https to avoid mixed contents warnings
2015-05-01 17:10:43 -04:00
Steve Francia 717a8f0133 Merge pull request #8 from philgs/patch-1
Lowercase variables for .Site.Params
2015-05-01 17:10:32 -04:00
Antti Järvinen 6d6546011f Convert rem's to em's in breakpoints to fix layout jerking issue in e.g. iPad and when resizing viewport. 2015-04-08 21:59:45 +03:00
Gio d'Amelio 4ce7ab945a Fetch google fonts over https 2015-02-23 20:02:12 -08:00
philgs 9ea795e148 Lowercase variables for .Site.Params
Variables under .Site.Params are accessed with all lower-case identifiers. Hugo won't find them with an upper-case first letter, regardless of how they're formatted in the site `config` file.
2015-01-05 06:22:06 -05:00
spf13 47f2ba81ad removing old screenshot 2014-10-08 19:17:58 -04:00
spf13 af1c2e3729 bringing theme up to date for inclusion in the gallery 2014-10-08 19:05:40 -04:00
Anthony Fok e1a4df05e8 Use `partial` call to include partial templates
Replace `template` call with the `partial` call (new in Hugo v0.12)
for including partial templates
2014-09-08 12:13:10 -04:00
Glen Baker 9bd0f367e2 Removed extra unused html tags from list template, h4 and unused span
Conflicts:
	layouts/_default/list.html
2014-09-08 12:11:25 -04:00
Alan Pearce 17a69ee630 Add missing div closing tag 2014-09-08 12:05:34 -04:00
spf13 a1b20a1747 adding images 2014-05-23 18:38:03 -04:00
spf13 9989bda110 renaming chrome to partials 2014-05-23 16:44:37 -04:00
spf13 7e7e3ff3ab adding archetypes to the existing themes 2014-05-23 15:45:21 -04:00
Dato Simó 0576ec066d Hyde theme: sync with upstream to v2.0.0.
CSS is now split into poole.css and hyde.css; chrome/sidebar.html updated.

Also cherry-pick:

  * poole/hyde@48b9d1f - Set a max-width for images
2014-05-15 00:34:40 +01:00
spf13 5a4a5b1862 small tweak to hyde read me 2014-04-26 16:41:16 -06:00
spf13 da66ac1983 Adding the hyde theme 2014-04-26 16:25:13 -06:00
230 changed files with 6586 additions and 3648 deletions

2
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1,2 @@
# The great Page Bundles migration
83c1a03b3c018384ec3bef83cd1b030507998aae

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
static/pretty-feed-v3.xsl linguist-vendored

36
.github/renovate.json5 vendored Normal file
View File

@ -0,0 +1,36 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base",
"helpers:pinGitHubActionDigests",
"github>msfjarvis/shared-workflows//renovate/automerge"
],
"packageRules": [
{
"packageNames": ["gohugoio/hugo"],
"extractVersion": "^v(?<version>\\d+\\.\\d+\\.\\d+)"
}
],
"regexManagers": [
{
"description": "Update Hugo version in Actions workflows",
"fileMatch": [".yml$", ".toml$"],
"matchStrings": [
"hugo-version: '(?<currentValue>.*?)'",
"HUGO_VERSION = \"(?<currentValue>.*?)\""
],
"depNameTemplate": "gohugoio/hugo",
"datasourceTemplate": "github-releases"
},
{
"description": "Update Decap CMS",
"fileMatch": ["static/admin/index.html"],
"matchStrings": [
"\/decap-cms@(?<currentValue>.*?)\/dist"
],
"depNameTemplate": "decap-cms",
"datasourceTemplate": "npm"
}
],
"commitMessageSuffix": "[staging]"
}

29
.github/workflows/build-test.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: Build website
on:
push:
branches:
- renovate/**
jobs:
deploy-main:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
- name: Setup Latest Version of Hugo
uses: peaceiris/actions-hugo@16361eb4acea8698b220b76c0d4e84e1fd22c61d # tag=v2
with:
hugo-version: '0.124.1'
extended: true
- uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5
with:
go-version-file: 'go.mod'
- name: Build
shell: bash
run: |
hugo --minify --gc

View File

@ -0,0 +1,14 @@
name: Update flake.lock
on:
workflow_dispatch:
schedule:
- cron: '0 6 * * 0'
permissions:
contents: write
jobs:
update-flake-lock:
uses: msfjarvis/shared-workflows/.github/workflows/update-flake-lock.yml@main
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}

18
.gitignore vendored
View File

@ -1,8 +1,12 @@
# OS
.DS_Store
Thumbs.db
# IDEs
.vscode
# Hugo
public/
resources/
dist/
node_modules/
transpiled/
worker/
.hugo_build.lock
_vendor/
# Local Netlify folder
.netlify

View File

@ -1,2 +0,0 @@
content
layouts

10
.vscode/figure.code-snippets vendored Normal file
View File

@ -0,0 +1,10 @@
{
"Hugo figure": {
"scope": "markdown",
"prefix": "",
"body": [
"{{<figure src=\"\" alt=\"\" title=\"Date taken: \" loading=\"lazy\">}}",
],
"description": "Add a Hugo figure shortcode",
},
}

6
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"deno.enable": true,
"deno.unstable": true,
"deno.lint": false,
"nixEnvSelector.nixFile": "${workspaceRoot}/flake.nix"
}

View File

@ -1,20 +0,0 @@
The MIT License (MIT)
Copyright (c) 2020 YOUR_NAME_HERE
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,44 +1,3 @@
## Codex
# msfjarvis.dev [![Netlify Status](https://api.netlify.com/api/v1/badges/881b0cec-43c2-4712-baf8-ce648993e0b8/deploy-status)](https://app.netlify.com/sites/msfjarvis-dev/deploys)
A minimal blog theme built for [Hugo](https://gohugo.io/) 🍜
## What this theme is
- An about page and a blog. No more. No less.
- Blog posts can be tagged
- You can view all blog posts that a specific tag by going to /tags/:tag-name
## Archetypes
You can create a new blog post page by going to the root of your project and typing:
```
hugo new blog/post.md
```
Where `post.md` is the name of your new post.
## Configuration
There are a few configuration parameters you can add in your `config.toml` to customize the theme:
```toml
# config.toml
# values listed here are default values
[params]
name = "Codex"
description = "A minimal blog theme for hugo."
twitter = "hugo-theme-codex"
github = "jakewies/hugo-theme-codex"
```
1. `name`: This is the heading on the `/about` page
2. `description`: This is the subheading on the `/about` page
3. `twitter`: Your Twitter handle without the @ symbol (optional)
4. `github`: Your GitHub handle without the @ symbol (optional)
## Overriding / Customizing
Right now the way to customize the theme is not very user-friendly. That is the first thing to work on. If you get curious just hop into the theme directory and go exploring through the code. It's not too complicated what's going on.
Source code for my website at [msfjarvis.dev](https://msfjarvis.dev). It's built with [Hugo](https://github.com/gohugoio/hugo), deployed continuously to Netlify.

View File

@ -1,10 +0,0 @@
---
title: "{{ replace .TranslationBaseName "-" " " | title }}"
date: {{ .Date }}
slug: ""
description: ""
keywords: []
draft: true
tags: []
stylesheet: "post.css"
---

View File

@ -1,7 +1,5 @@
---
title: "{{ replace .TranslationBaseName "-" " " | title }}"
description: ""
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
keywords: []
draft: true
---

86
assets/syntax.css Normal file
View File

@ -0,0 +1,86 @@
/* Background */ .bg { color: #f8f8f2; background-color: #282a36; }
/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #282a36; }
/* Other */ .chroma .x { }
/* Error */ .chroma .err { }
/* CodeLine */ .chroma .cl { }
/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit }
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
/* LineHighlight */ .chroma .hl { background-color: #ffffcc }
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
/* Line */ .chroma .line { display: flex; }
/* Keyword */ .chroma .k { color: #ff79c6 }
/* KeywordConstant */ .chroma .kc { color: #ff79c6 }
/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic }
/* KeywordNamespace */ .chroma .kn { color: #ff79c6 }
/* KeywordPseudo */ .chroma .kp { color: #ff79c6 }
/* KeywordReserved */ .chroma .kr { color: #ff79c6 }
/* KeywordType */ .chroma .kt { color: #8be9fd }
/* Name */ .chroma .n { }
/* NameAttribute */ .chroma .na { color: #50fa7b }
/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic }
/* NameBuiltinPseudo */ .chroma .bp { }
/* NameClass */ .chroma .nc { color: #50fa7b }
/* NameConstant */ .chroma .no { }
/* NameDecorator */ .chroma .nd { }
/* NameEntity */ .chroma .ni { }
/* NameException */ .chroma .ne { }
/* NameFunction */ .chroma .nf { color: #50fa7b }
/* NameFunctionMagic */ .chroma .fm { }
/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic }
/* NameNamespace */ .chroma .nn { }
/* NameOther */ .chroma .nx { }
/* NameProperty */ .chroma .py { }
/* NameTag */ .chroma .nt { color: #ff79c6 }
/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic }
/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic }
/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic }
/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic }
/* NameVariableMagic */ .chroma .vm { }
/* Literal */ .chroma .l { }
/* LiteralDate */ .chroma .ld { }
/* LiteralString */ .chroma .s { color: #f1fa8c }
/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c }
/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c }
/* LiteralStringChar */ .chroma .sc { color: #f1fa8c }
/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c }
/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c }
/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c }
/* LiteralStringEscape */ .chroma .se { color: #f1fa8c }
/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c }
/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c }
/* LiteralStringOther */ .chroma .sx { color: #f1fa8c }
/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c }
/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c }
/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c }
/* LiteralNumber */ .chroma .m { color: #bd93f9 }
/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 }
/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 }
/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 }
/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 }
/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 }
/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 }
/* Operator */ .chroma .o { color: #ff79c6 }
/* OperatorWord */ .chroma .ow { color: #ff79c6 }
/* Punctuation */ .chroma .p { }
/* Comment */ .chroma .c { color: #6272a4 }
/* CommentHashbang */ .chroma .ch { color: #6272a4 }
/* CommentMultiline */ .chroma .cm { color: #6272a4 }
/* CommentSingle */ .chroma .c1 { color: #6272a4 }
/* CommentSpecial */ .chroma .cs { color: #6272a4 }
/* CommentPreproc */ .chroma .cp { color: #ff79c6 }
/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 }
/* Generic */ .chroma .g { }
/* GenericDeleted */ .chroma .gd { color: #ff5555 }
/* GenericEmph */ .chroma .ge { text-decoration: underline }
/* GenericError */ .chroma .gr { }
/* GenericHeading */ .chroma .gh { font-weight: bold }
/* GenericInserted */ .chroma .gi { color: #50fa7b; font-weight: bold }
/* GenericOutput */ .chroma .go { color: #44475a }
/* GenericPrompt */ .chroma .gp { }
/* GenericStrong */ .chroma .gs { }
/* GenericSubheading */ .chroma .gu { font-weight: bold }
/* GenericTraceback */ .chroma .gt { }
/* GenericUnderline */ .chroma .gl { text-decoration: underline }
/* TextWhitespace */ .chroma .w { }

View File

@ -1,29 +1,104 @@
# OVERRIDE #
baseURL = "https://msfjarvis.dev/"
title = "Harsh Shandilya"
paginate = 5
theme = ["github.com/msfjarvis/hugo-social-metadata", "github.com/adityatelange/hugo-PaperMod"]
languageCode = "en-us"
title = "Codex"
baseURL = "https://example.org/"
copyright = "© {year}"
enableInlineShortcodes = true
enableRobotsTXT = true
buildDrafts = false
buildFuture = false
buildExpired = false
enableEmoji = true
[params]
name = "Codex"
description = "A minimal blog theme for hugo."
twitter = "hugo-theme-codex"
github = "jakewies/hugo-theme-codex"
# OVERRIDE #
# DONT OVERRIDE #
preserveTaxonomyNames = true
[markup]
[markup.highlight]
anchorLineNos = false
codeFences = true
guessSyntax = false
hl_Lines = ''
hl_inline = false
lineAnchors = ''
lineNoStart = 1
lineNos = false
lineNumbersInTable = true
noClasses = false
noHl = false
tabWidth = 4
[[menu.main]]
identifier = "about"
name = "about"
url = "/"
name = "About"
url = "/about"
weight = 5
[[menu.main]]
name = "Blog"
url = "/posts"
weight = 10
[[menu.main]]
name = "Uses"
url = "/uses"
weight = 15
[minify]
disableXML = true
[params]
defaultTheme = "auto"
description = "Recovering Android and Kotlin developer, amateur Rustacean"
socialImage = "android-chrome-512x512.webp"
comments = true
utterancesRepo = "msfjarvis/msfjarvis.dev"
showShareButtons = true
shareButtons = ["linkedin", "reddit", "telegram"]
showReadingTime = true
showPostNavLinks = true
showBreadCrumbs = true
showCodeCopyButtons = true
showRssButtonInSectionTermList = true
ShowFullTextinRSS = true
showToc = true
[params.editPost]
url = "https://github.com/msfjarvis/msfjarvis.dev/edit/main/content/"
text = "Suggest Changes"
appendFilePath = true
[params.assets]
disableHLJS = true
favicon = "favicon.ico"
favicon16x16 = "favicon-16x16.webp"
favicon32x32 = "favicon-32x32.webp"
apple_touch_icon = "apple-touch-icon.png"
safari_pinned_tab = "mask-icon.svg"
[params.homeInfoParams]
title = "Hi 👋, I am Harsh"
content = "Recovering Android and Kotlin developer, amateur Rustacean"
[[params.socialIcons]]
name = "GitHub"
icon = "github"
url = "https://github.com/msfjarvis"
[[params.socialIcons]]
name = "Mastodon"
icon = "mastodon"
url = "https://androiddev.social/@msfjarvis"
[[params.socialIcons]]
name = "Gitea"
icon = "gitea"
url = "https://git.msfjarvis.dev/"
[[params.socialIcons]]
name = "RSS"
icon = "rss"
url = "/index.xml"
# Enable tags.
[taxonomies]
tag = "tags"
# DONT OVERRIDE #
category = "categories"

View File

@ -1,5 +0,0 @@
---
title: "About"
linktitle: "about"
keywords: []
---

47
content/about.md Normal file
View File

@ -0,0 +1,47 @@
+++
title = "About Me"
id = "about"
type = "page"
aliases = [
"/about",
"/contact",
]
ShowReadingTime = false
ShowToc = false
+++
I'm an Android and Kotlin developer with over 5 years of experience building apps that have scaled up to hundreds of thousands daily active users and design systems for some of the largest startups in India.
### Work
I currently work at [Dyte] as an SDK Tooling engineer, primarily focusing on developer experience for the mobile team.
You can find the latest version of [my resume here].
### Projects
A few ideas that I've gone ahead and built in my spare time. You can support them if you like by [donating here].
- [Android Password Store]: A password manager for Android aiming to be fully compatible with the [pass] format.
- [Claw]: A read-only Android client for [lobste.rs], written entirely in [Jetpack Compose].
- [healthchecks-rs]: A Rust library for interacting with [healthchecks.io] and a couple CLI tools that utilise it.
- [linkleaner]: Telegram bot to automatically improve link previews.
### Contact
You can find me on [Mastodon], I have a Twitter but I no longer use it for well understood reasons. I'd be happy to write back if you'd like to send me an [email]!
[dyte]: https://dyte.io
[my resume here]: https://msfjarvis.dev/resume.pdf
[donating here]: https://github.com/sponsors/msfjarvis
[android password store]: https://passwordstore.app
[pass]: https://passwordstore.org
[claw]: https://msfjarvis.dev/g/compose-lobsters
[lobste.rs]: https://lobste.rs
[healthchecks-rs]: https://msfjarvis.dev/g/healthchecks-rs
[healthchecks.io]: https://healthchecks.io
[email]: mailto:me@msfjarvis.dev
[mastodon]: https://androiddev.social/@msfjarvis
[github]: https://msfjarvis.dev/g
[jetpack compose]: https://developer.android.com/jetpack/compose/
[linkleaner]: https://github.com/msfjarvis/linkleaner

45
content/aps-privacy.md Normal file
View File

@ -0,0 +1,45 @@
+++
title = "Android Password Store Privacy Policy"
id = "aps-privacy"
type = "page"
ShowReadingTime = false
ShowToc = false
+++
## Privacy Policy
The Android Password Store Authors built the Android Password Store app as an Open Source app. This application is provided by The Android Password Store Authors at no cost and is intended for use as is.
This page is used to inform visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our Service.
The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Android Password Store unless otherwise defined in this Privacy Policy.
## Information Collection and Use
We collect absolutely no information about users through Android Password Store. Your privacy is respected and enforced.
## Log Data
We want to inform you that whenever you use our Service, in a case of an error in the app We collect data and information (through the Google Play Store, if available on your device) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing our Service, the time and date of your use of the Service, and other statistics.
## Cookies
Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.
This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.
## Service Providers
We do not employ any third-party services that will collect your data, all operations on Android Password Store are offline and completely anonymous.
## Links to Other Sites
This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, We strongly advise you to review the Privacy Policy of these websites. We have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.
## Changes to This Privacy Policy
We may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page.
## Contact Us
If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us.

View File

@ -1,6 +0,0 @@
---
title: "Blog"
description: "This is a blog description"
linktitle: "blog"
menu: "main"
---

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

View File

@ -0,0 +1,116 @@
+++
categories = ["april-cools"]
date = 2024-04-01
summary = "The history of my Minecraft adventures as told by my screenshots folder"
slug = "a-tour-of-my-screenshots-folder"
tags = ["april-cools", "minecraft"]
title = "A tour of my screenshots folder"
+++
## Preface
> This is a post for the [April Cools Club](https://aprilcools.club) which encourages people to break away from the typical cringiness of April Fools and do things you don't normally do.
To set the stage, every screenshot you will see going forward is gonna be Minecraft. I just love the game and I have had such fun with it for the past 5 years that it feels remiss to not share every so often (which I do these days at [@msfjarvis@mstdn.games](https://mstdn.games/@msfjarvis)). These are gonna be in order from oldest to newest, and I'll try to annotate each screenshot with dates, alt text and the relevant anecdote as I remember them but honestly a bunch of this is just goofy shit I happened to capture.
## Just a bridge, really
{{<figure src="starter-base-bridge.webp" alt="A cinematic shot of a tiny wooden bridge spanning two cliff sides on either side of the frame. The bridge has evenly spaced poles on either side of it with a shroomlight to illuminate the entire thing. The scene is set in the night time and the Aurora Borealis is visible in the background." title="Date taken: August 2, 2022" loading="lazy">}}
This bridge is in a Minecraft world that [Sasikanth](https://sasikanth.dev/me/) and I started in the second half of 2022, and built entirely by him next to our starter base. After Sasi kinda moved on from playing on the server (as Minecraft players inevitably do, myself included) I copied the world and started using it as my singleplayer world and I still play on it to this day.
## An unlikely friendship
{{<figure src="an-unlikely-friendship.webp" alt="A blacksmith villager and a creeper standing right next to each other in the night. The villager is facing the creeper while it looks off into the distance, towards the right side of the camera." title="Date taken: August 13, 2022" loading="lazy">}}
I don't think I really remember where this is from, but if I had to guess it was the village I and Sasikanth discovered and promptly lay ruin to which today happens to be my full time base.
## The start of the storage room
{{<figure src="the-start-of-the-storage-room.webp" alt="An incomplete rectangular arrangement of double chests with item frames on them, with a mess of shulker boxes in between and me standing on top of them" title="Date taken: August 20, 2022" loading="lazy">}}
After commandeering the aforemention village I decided to lay roots next door, and this is basically the start of my storage room. The basic design is still the same but it has like, walls and stuff now.
## I am a dwarf, and I'm digging a hole
{{<figure src="diggy-diggy-hole.webp" alt="A top down shot of my Minecraft character standing next to a one chunk big hole straight down to bedrock" title="Date taken: December 29, 2022" loading="lazy">}}
Honestly not much to say, I was in a bit of a slump with my mental health and decided the best use of my mushy brain was to dig down a whole chunk to eventually build a slime farm.
## Did I drain this Ocean Monument or did it drain me?
{{<figure src="draining-ocean-monument-part-1.webp" alt="Cinematic night time shot of my character standing on a wall of sand on the close left side of the screen while an Ocean Monument takes up the rest of the bottom half" title="Date taken: February 27, 2023" loading="lazy" >}}
I didn't play much for a month or two so I decided to pick up a somewhat involved project to get me back in the swing of things, which happened to be a Guardian farm for the prismarine family of blocks. I'll let the other screenshots paint the picture, but suffice to say I had under-estimated the scope of this 😬
{{<figure src="draining-ocean-monument-part-2.webp" alt="Overhead world map shot of the Ocean monument with approximately 30% of it drained. There is a perimeter of sand around it as well as some evenly spaced walls running across the screen to section off slices to be drained." title="Date taken: March 7, 2023" loading="lazy" >}}
{{<figure src="draining-ocean-monument-part-3.webp" alt="The same setup described before but with about 55% of the structure drained." title="Date taken: March 12, 2023" loading="lazy" >}}
{{<figure src="draining-ocean-monument-part-4.webp" alt="The entire structure is now drained, with just the sand perimeter remaining around it" title="Date taken: March 15, 2023" loading="lazy" >}}
{{<figure src="draining-ocean-monument-part-5.webp" alt="Me standing on top of one of the sand walls, looking inwards to the now completed Guardian farm. It's comprimised of two glass tanks full of water that funnel guardians into a central chamber where they fall and have their drops collected underground" title="Date taken: March 20, 2023" loading="lazy" >}}
When this was finally done I genuinely used it like 4 times total, turns out I'm not really a prismarine guy so that's a couple weeks I am not getting back.
## Getting real personal with a Warden
{{<figure src="meeting-a-warden.webp" alt="A very close over the shoulder shot of me mere inches from a Warden which is staring right into my soul" title="Date taken: March 12, 2023" loading="lazy">}}
To break up the monotony of placing sand for the Guardian farm I paid a visit to a near by Ancient City and ended up a little too close to a Warden, which did eventually kill me.
## The sea shanty era
{{<figure src="tragic-lovers.webp" alt="Two players in a bamboo raft that is positioned on the bow of a shipwreck which is poking out of water" title="Date taken: June 27, 2023" loading="lazy">}}
I took another couple months off and then set up a small server with a handful of friends to mess around on a fresh world with relative newbies to the game. A lot of chaos ensued, but a large chunk of the time I spent on the server ended up being me and [Yash](https://yashgarg.dev/) just boating across oceans looking for anything mildly interesting while in a voice call with our friends. It was fun times, but as always people's interest dwindled down and I shut the server down a couple weeks later.
## Excavating the Nether
{{<figure src="nether-mining-pre-boom.webp" alt="A map of the Nether at elevation Y=0, showing parallel one block wide tunnels going across chunk borders and filled with unevenly spaced blocks of TNT" title="Date taken: July 11, 2023" loading="lazy">}}
I wanted Ancient Debris for a project and decided to just get a whole load of it at once, which resulted in this set of TNT-filled tunnels. Here's the damage all the TNT did:
{{<figure src="nether-mining-post-boom.webp" alt="The same tunnels from above after all the TNT in them was lit. They are now wider, more jagged and a lot more lava-filled" title="Date taken: July 11, 2023" loading="lazy">}}
## My first Sniffers
{{<figure src="first-sniffers.webp" alt="A fenced off patch of moss with me standing in the middle and one Sniffer egg on each side" title="Date taken: July 12, 2023" loading="lazy">}}
When the Sniffers were added to the game I just had to get them, and obviously then I created a farm for the seeds they "sniff" up.
{{<figure src="sniffer-for-a-sniffer-farm.webp" alt="Elevated shot of a large Sniffer build, the back of it is built with colored glass and you can see some 10 Sniffers inside on a floor of mud blocks" title="Date taken: September 13, 2023" loading="lazy">}}
## The End Ring Project
{{<figure src="incomplete-end-island-ring.webp" alt="Top down shot of the main End island, showing a Prismarine ring going through all the end gateways which are illuminated by Prismarine Lights" title="Date taken: March 28, 2024" loading="lazy">}}
I envisioned a continous ring of Prismarine walkways around all the End gateways to be a cool way to get to them rather than just pillaring up but I biffed the "circle" so many times that it's kinda stalled at the moment.
## All Trimmed Up
{{<figure src="obtaining-every-armor-trim.webp" alt="A short hallway of Spruce planks showcasing every single Armor Trim as of Minecraft 1.20.4" title="Date taken: March 16, 2024" loading="lazy">}}
I went on a quest to obtain every single armor trim and enough Netherite to create armor to put them on, which in total probably took 20-odd hours including all the Diamond and Ancient Debris mining as well as actually locating all the trims. My Minecraft closet has more variety than my IRL one which feels like cause for concern.
## Bonus randomness
### The Minecraft x FaZe collab
For some reason Minecraft likes to spawn Nether Fossils that look way too much like the [FaZe Clan] logo and I apparently have a bunch of them screenshotted, so here they are:
{{<figure src="fazeup-1.webp" alt="The FaZe Fossil in a soul sand valley" loading="lazy">}}
{{<figure src="fazeup-2.webp" alt="Another FaZe Fossil in a soul sand valley" loading="lazy">}}
{{<figure src="fazeup-3.webp" alt="Yet Another FaZe Fossil in a soul sand valley" loading="lazy">}}
{{<figure src="fazeup-4.webp" alt="Would you believe it? Another FaZe logo in a soul sand valley" loading="lazy">}}
{{<figure src="fazeup-5.webp" alt="To break up the monotony, this FaZe logo was in a 'Quartz Flats' custom biome from the Incendium datapack" loading="lazy">}}
### The impossible portal
{{<figure src="chunk-pruned-portal.webp" alt="A Nether portal with its left side of Obsidian blocks missing but the portal is still intact" title="Date taken: June 12, 2023" loading="lazy">}}
I manually prune unused chunks before Minecraft updates in order to let them regenerate with the updated terrain and accidentally sliced off this portal as it happened to be on a chunk boundary. It's all the way back at my starter base so it does not see much use, but it's there.
## The end...?
I don't know why I picked this to do of all the things I could have for April Cools. However, reliving all the memories of fun times I had with my friends and even by myself were worth the pain it was to go through 800 odd screenshots and find moderately interesting things :)
Hopefully I have something cooler for next year and that I actually give myself more than 4 hours to write it up.

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 KiB

View File

@ -0,0 +1,71 @@
+++
categories = ["hugo", "webdev"]
date = 2020-02-03
summary = "Optimize social media exposure with the right metadata for your site"
slug = "adding-social-metadata-to-your-hugo-sites"
tags = ["static sites"]
title = "Adding social metadata to your Hugo sites"
socialImage = "uploads/hugo_metadata_social.webp"
+++
Metadata is data (information) about data.
The `<meta>` tag provides metadata about the HTML document. Metadata will not be displayed on the page, but will be machine parsable.
This metadata can be used by browsers (how to display content or reload page), search engines (keywords), or other web services.
Here's how your website will look like on Twitter with and without metadata.
![No metadata](/uploads/hugo_metadata_no_meta.webp)
![Correct metadata](/uploads/hugo_metadata_correct_meta.webp)
You be the judge of what you like better :)
## Automatically adding social metadata to Hugo sites
After coming across [this list](https://github.com/budparr/awesome-hugo#theme-components) I realized theme components was a thing so I've extracted my [social metadata commit](https://github.com/msfjarvis/msfjarvis.dev/commit/cc08039a6b4a6b649bdd8710295383d2388c9955) into a separate component for re-use by the community. It's available on GitHub at [msfjarvis/hugo-social-metadata](https://github.com/msfjarvis/hugo-social-metadata). The README goes through the installation steps so here I will simply cover what the component is actually adding. Here's the generated metadata for this very post.
```html
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@msfjarvis" />
<meta
name="description"
content="Optimize social media exposure with the right metadata for your site"
/>
<meta name="keywords" content="hugo,webdev,static sites," />
<meta
property="og:url"
content="https://msfjarvis.dev/posts/adding-social-metadata-to-your-hugo-sites/"
/>
<meta
property="og:title"
content="Adding social metadata to your Hugo sites &middot; Harsh Shandilya"
/>
<meta
name="twitter:title"
content="Adding social metadata to your Hugo sites &middot; Harsh Shandilya"
/>
<meta
name="og:description"
content="Optimize social media exposure with the right metadata for your site"
/>
<meta
name="twitter:description"
content="Optimize social media exposure with the right metadata for your site"
/>
<meta
name="twitter:url"
content="https://msfjarvis.dev/posts/adding-social-metadata-to-your-hugo-sites/"
/>
<meta name="twitter:image:src" content="android-chrome-512x512.webp" />
```
- `og:type` - Allowed values are specified at the OpenGraph protocol's documentation [here](https://ogp.me/#types). I use `website` to reflect the content I serve.
- `twitter:card` - One of `summary`, `summary_large_image`, `app`, or `player`. `summary_large_image` indicates that I want to see a social image as well as the description I provide when this is rendered on Twitter.
- `twitter:site` - Twitter username of the owner of this website.
- `description` - HTML5 tag that describes the content of this page. The content of this can be replicated in `og:description` and `twitter:description` to satisfy Facebook and Twitter respectively.
- `og:url` and `twitter:url` - Permalink to the content that this page is for. You can use this to provide a link with tracking related metadata to track social origins.
- `og:title` and `twitter:title` - Title of the page as you want it to be shown on social media.
- `twitter:image:src` - Absolute link to an image that will be used in your Twitter card.

View File

@ -0,0 +1,21 @@
+++
categories = ["aps"]
date = 2020-07-23
summary = "Long form release notes for the Android Password Store v1.10.1 patch release"
slug = "aps-1.10.1-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store 1.10.1 patch release"
+++
Hot on the heels of the [v1.10.0](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.10.0) release we have an incremental bugfix update ready to go!
As mentioned in the [previous release notes](/posts/aps-july-release), the algorithm for handling GPG keys was significantly overhauled and thus had the potential to cause some breakage. Well, it did.
This release includes 3 separate fixes for different bugs around GPG.
- [#959](https://msfjarvis.dev/aps/pr/959) ensures long key IDs are correctly parsed as hex numbers.
- [#960](https://msfjarvis.dev/aps/pr/960) fixes a type problem where we incorrectly used a `Array<Long>` that gets interpreted as a `Serializable` as opposed to the `Long[]` expected by OpenKeychain.
- [#958](https://msfjarvis.dev/aps/pr/958) reintroduces the key selection flow, adding it as a fallback for when no key has been entered into the `.gpg-id` file. This notably helps users who generate stores within the app.
The release is going up on the [Play Store](https://play.google.com/store/apps/details?id=dev.msfjarvis.aps) over the next few hours, [F-Droid](https://f-droid.org/packages/dev.msfjarvis.aps/) builds will be delayed until our patch [shifting F-Droid to the free flavor](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7141) is not merged.

View File

@ -0,0 +1,19 @@
+++
categories = ["aps"]
date = 2020-07-30
summary = "Long form release notes for the Android Password Store v1.10.2 patch release"
slug = "aps-1.10.2-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store 1.10.2 patch release"
+++
Exactly one week after the [previous patch release](/posts/aps-1.10.1-release), we have another small release fixing a few bugs that were deemed too high-priority for our usual release cadence.
List of the patches included in this release:
- [#985](https://github.com/android-password-store/Android-Password-Store/pull/985) fixes a couple of crashes originating in the new SMS OTP autofill feature that completely broke it.
- [#982](https://github.com/android-password-store/Android-Password-Store/pull/982) ensures that the 'Add TOTP' button only shows when its needed to.
- [#969](https://github.com/android-password-store/Android-Password-Store/pull/969) improves support for pass entries that only contain TOTP URIs, and no password.
This release has been uploaded to the Play Store and should reach users in a few hours. F-Droid is [yet to merge](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7141) our MR to support the free flavor we've created for them so just like the previous two release in the 1.10.x generation, this too shall not be available on their store just yet.

View File

@ -0,0 +1,75 @@
+++
categories = ["aps"]
date = 2020-08-18
summary = "Long form release notes for the Android Password Store August release"
slug = "aps-august-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store August release"
+++
Continuing this new tradition, here are the detailed release notes for the [v1.11.0](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.11.0) build of of Android Password Store that is going out right now on the Play Store and to F-Droid in the coming days. The overall focus of this release has been to improve UX and resolve bugs. Regular feature development has already resumed for next month's release where we'll be bringing [Android Keystore](https://source.android.com/security/keystore) backed SSH key generation as well as a rewritten OpenKeychain integration for SSH connections.
# New features
## One URL field to rule them all
Previously you'd have to set the URL to your repository across multiple fields like username, server, repository name and what not. Annoying! These things make sense to us as developers, but users should not have to be dealing with all that complexity when all they want to do is enter a single URL. We've received numerous bug reports over time as a result of people misunderstanding and ultimately misconfiguring things when exposed to this hellscape. Thanks to some _amazing_ work from Fabian, we now have a single URL field for users to fill into.
![Single URL field in repository information](/uploads/aps-august-release-single-url-field.webp)
## Custom branch support
A long-requested feature ([from 2017](https://msfjarvis.dev/aps/issue/298)!) has been the ability to change the default branch that APS uses. It was previously hard-coded to `master`, which was an issue for people who don't use that term or who keep separate stores on separate branches of their repository and would like to be able to switch easily. Now you can set the branch while cloning or make the change by setting it in the git server config screen, then using the 'Hard reset to remote branch' option in Git utils to switch to it.
## XkPasswd generator improvements
We made a number of UI improvements in this area for the last series, and for this release the original contributor [glowinthedark](https://github.com/glowinthedark) has returned to add the ability to append extra symbols and numbers to the password. Sometimes you'll see sites that require that each password have at least 1 symbol and 1 number to agree with some arbitrary logic's idea of a 'secure' password, and while it can be done manually, automatic is just better :)
![XkPasswd generator with the new symbol/number append option](/uploads/aps-august-release-xkpasswd.webp)
To add 1 symbol and 1 number to the end of a password, input `sd` and press generate. Each instance of `s` means one symbol, and `d` means one digit. Together these can be put together in any order and in any amount to create passwords conforming to any arbitrary snake-oil check. Remember, in passwords, length is king!
## Improved subdirectory key support
In the last major release we added support for [per-directory keys](/posts/aps-july-release/#proper-support-for-per-directory-keys). Building upon this, we now have support for also setting the key for a subdirectory when creating it.
![Create folder dialog but key selection checkbox](/uploads/aps-august-release-subdir-key-support.webp)
When selected, you will be prompted to select a key from OpenKeychain that will then be written into `your-new-directory/.gpg-id` which makes it compatible with all `pass` compliant apps.
# Bugfixes
## Detect missing OpenKeychain properly instead of crashing
Many, many people reported being unable to edit/create passwords and the app abruptly crashing. This is pretty bad UX, and we've now fixed it. Users will be prompted to install OpenKeychain and once you install and return to Password Store, the app will pick up from where you left and continue the operation. Pretty neat, even if I say so myself :)
![OpenKeychain installation prompt](/uploads/aps-august-release-missing-openkeychain.webp)
## External storage fixes
A couple of regressions resulted in cloning to external storage being completely broken. This has now been fixed alongwith a workaround for a possible freezing scenario during deletion of existing files from the selected directory. We've also improved the UX around cloning to external to be more straightforward and reliable.
## Creating nested directories
Previously, attempting to create directories like `directory1/subdirectory` would fail if `directory1` didn't already exist. This has now been fixed.
# Misc changes
## UI/UX tweaks
We're constantly working towards a better UI for APS, and to that end we've made some more improvements in this release. The password list now has dividers between individual items, and the parent path that was previously only shown on files now also does on directories. We hope this will help reduce ambiguity in results when searching, for example when you have a `github.com` subdirectory in both `work` and `personal` categories and need to find the right one quickly.
A longstanding to-do has been addressed as well, where the user will now be notified after a push operation if there was nothing to be pushed. Previously this would just do nothing which wasn't very intuitive.
We've completely rewritten the Git operation code to use a simpler progress UI and cleaner patterns which made a lot of these improvements possible.
## Disabling keyboard copy by default
The default behaviour of automatically copying to clipboard was both a bit insecure on most devices (w.r.t. unfettered clipboard access before Q) as well as counterproductive for some use-cases. In light of these, we've flipped the default for clipboard copy to off. Existing users will not have their settings changed.
# Conclusion
There are more smaller improvements peppered around. We're constantly making improvements and adding new features, and welcome all constructive feedback through [Gitter](https://gitter.im/android-password-store/public) or [GitHub issues](https://github.com/android-password-store/Android-Password-Store/issues).
Lastly, Android Password Store development thrives on your donations. You can sponsor the project on [Open Collective](https://opencollective.com/Android-Password-Store), or me directly through GitHub Sponsors by clicking [here](https://github.com/sponsors/msfjarvis?o=esc). GitHub Sponsors on Tier 2 and above get expedited triage times and priority on issues. You can now also buy features, faster support with issues as well as quicker bugfixes through our [xs:code](https://xscode.com/msfjarvis/Android-Password-Store) page.

View File

@ -0,0 +1,86 @@
+++
categories = ["aps"]
date = 2020-07-22
summary = "Long form release notes for the Android Password Store July release"
slug = "aps-july-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store July release"
toc = true
+++
As promised, here are detailed release notes for the [v1.10.0](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.10.0) build of Android Password Store that is going out right now on the Play Store and to F-Droid in the coming days. This is a massive one even compared to our previous v1.9.0 major release, which was our largest release when it went out. Let's dive into the changes!
## New features
### TOTP support
I [removed support for HOTP and TOTP secrets](https://msfjarvis.dev/aps/pr/806) back in v1.9.0 due to multiple reasons, a) it was blocking important refactoring efforts, b) it had zero test coverage, and c) none of the maintainers used it. Play Store reviews swiftly reminded us that people did use the feature even in its wonky state, and demanded its return. I stuck to our decision as maintainers for a while, but active members of the pass community like [erayd](https://github.com/erayd) (who happens to be the maintainer for [browserpass](https://github.com/browserpass)!) were able to convince us otherwise and provided good, actionable feedback allowing us to [bring back TOTP](https://msfjarvis.dev/aps/pr/890) support into APS, better than ever before.
The new implementation is backed by a solid suite of tests and contains new features like the ability to import TOTP URIs using QR codes, being able to Autofill them into webpages as well as extracting OTPs from SMSes (not available on F-Droid due to GMS dependencies for SMS monitoring).
### Support for ED25519/ECDSA keys
With our ongoing efforts to switch over from the dated [Jsch](http://www.jcraft.com/jsch/) SSH library to the more up-to-date and maintained [SSHJ](https://github.com/hierynomus/sshj), we now fully support ED25519 and ECDSA keys! You no longer need to rely on RSA to authenticate from your phone to your Git host :)
In a future release, we'll be bringing more improvements to this area including generating and storing SSH keys in the [Android Keystore](https://source.android.com/security/keystore/) for enhanced security as well as support for fallback authentication.
### Proper support for per-directory keys
[pass](https://www.passwordstore.org/) has a neat feature where it allows you to use a separate GPG key for a subdirectory, such as for sharing passwords across a team. It achieves this by looking for a `.gpg-id` file starting from the current directory, up to the root of the store. The first file it finds is what it uses as the key for the GPG operations.
```shell
$ tree -a store
store
├── .gpg-id <-- contains the key ABCDE01234
└── subdirectory1
└── .gpg-id <-- contains the key FGHIJ56789
```
In this directory structure, `pass generate subdirectory1/example.com` will use the `FGHIJ56789` key, and `pass generate example.com` will use `ABCDE12345`.
Previously, Password Store would only correctly handle decryption in this situation, and fail to select the right key for encrypting. The workaround for this was to manually select the key from settings that you wished to use, before creating a password. That's pretty stupid, and we're sorry you had to do that earlier. Now, Password Store uses an algorithm similar to the `pass` CLI to find the correct `.gpg-id` file and read the key from it. GnuPG is more 'forgiving', if you will, in what type of key values it can work with so there's a slim chance that your current workflow might now be broken. If this happens, please immediately either file an issue over on the [GitHub repository](https://msfjarvis.dev/aps) or email us at [aps@msfjarvis.dev](mailto:aps@msfjarvis.dev) with as much detail as you can and we'll resolve it ASAP.
## Bugfixes
### Better protection against invalid filename changes
Over the past few releases we've been hard at work improving the password edit flow, making it more accessible and 'obvious' to users and simultaneously prevent any hidden footguns from souring the experience. We received a bug report about [file renaming](https://msfjarvis.dev/aps/issue/928) having unexpected behavior that caused destructive actions in the store, and in response we [now have better safeguards against this](https://msfjarvis.dev/aps/pr/929) and have improved the UI to make things more clear to users.
### Export passwords asynchronously
Previously the password export would run on the main thread and potentially cause the app to completely freeze and throw a 'Password Store is not responding error'. This has been rectified, and the export now occurs in an entirely separate process.
### UI fixes
A bunch of UI feedback was provided to us after the last major release and we've worked to address it in this one. Long file/folder names now correctly wrap across lines, and the error UI for wrong password/passphrase is now aesthetically correct [[PR](https://msfjarvis.dev/aps/pr/892)].
### QoL improvements
We've been aggressively refactoring the codebase to use modern APIs like [ActivityResultContracts](https://msfjarvis.dev/aps/pr/910) and making large scale architectural changes to our old code in efforts to improve maintainability in the future. We also have work-in-progress rewrites of the [Git commands pipeline](https://msfjarvis.dev/aps/pr/865) and incoming support for [fallback authentication](https://msfjarvis.dev/aps/pr/825).
## General changes and improvements
### New icon and color scheme
Right off the bat, you will notice a brand new icon for Password Store. This was created for us by [Radek Błędowski](https://twitter.com/RKBDI), go check him out!
![New icon](/uploads/aps_banner.webp)
To complement the new icon, we've also updated our color scheme to better suit this new branding.
### Simplified XkPasswd implementation
While revisiting our UI during the icon change, we realised that the alternate XkPasswd password generator option we introduced back in v1.6.0 was a tad too complicated to use with a lot more knobs and switches than necessary. This has been fixed, and we hope that it's now at a level of accessibility that allows more users to try it out.
### Improvements to biometric lock transition and password list UI
The biometric authentication UI flow has been updated to show the authentication dialog over a transparent screen, before starting the app upon success. We've also retouched the password list to remove the leading icons, as we have been consistently receiving numerous comments about them being unnecessary and a bit ugly. In v1.4.0 we introduced child counts and iconographic hints to directories, and we feel they are more than sufficient to communicate the difference between them and password files. We welcome all feedback about these changes at [me@msfjarvis.dev](mailto:me@msfjarvis.dev).
## In conclusion
There are a lot more changes in this release than those included in this post, which you can check out [here](https://github.com/android-password-store/Android-Password-Store/milestone/10). We're constantly at work improving APS and all constructive feedback helps us create a better experience for users and ourselves, so please keep it coming (over email, if it's a suggestion. Play Store reviews are not good for back-and-forth communication).
Lastly, Android Password Store development thrives on your donations. You can sponsor the project on [Open Collective](https://opencollective.com/Android-Password-Store), or me directly through GitHub Sponsors by clicking [here](https://github.com/sponsors/msfjarvis?o=esc). GitHub Sponsors on Tier 2 and above get expedited triage times and priority on issues :)
See you next month!

View File

@ -0,0 +1,57 @@
+++
categories = ["aps"]
date = 2020-10-22
summary = "Long form release notes for the Android Password Store October release"
slug = "aps-october-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store October release"
toc = true
+++
We're back with yet another release! As I shared earlier this month, this is going to our last release for a while. There's a lot of work left to be done, and we're simply not big enough a team to have these larger changes be done separately from our main development. We'll still be doing bugfix releases if and when required, so please do file bug reports as and when you encounter issues.
## New features
### GPG key selection added to onboarding
Creating a new store from the app previously created an unusable store, because we never configured a GPG key in the `.gpg-id` file. This has now been remedied in two ways: empty `.gpg-id` files are correctly handled as invalid and included in our quickfix solution, and creating a new store will now request you to select a key and then write it into the `.gpg-id` file. Here's what the key selection screen looks like:
![GPG key selection screen from the APS October release](/uploads/aps-october-release-gpg-key-selection.webp)
### Allow configuring an HTTPS proxy
Before we close the gates on our regularly scheduled releases, our focus has been to address most longstanding issues and one of the major ones there has been [Proxy support](https://github.com/android-password-store/Android-Password-Store/issues/163). This has now been added, and can be accessed from the settings screen. Unfortunately, there are still a few caveats with this current implementation that may or may not change in a future patch release:
- No SOCKS5 support
- Relatively unhelpful error messages when proxy connection fails
### Add option to automatically sync repository
~~This too, has been a [consistent request](https://github.com/android-password-store/Android-Password-Store/issues/277) in the past. While our implementation does not exactly match what was requested, we feel it's good enough to be shipped. You now have the option to sync your repository on every launch to ensure things are always up-to-date when you get in the app.~~
Due to multiple bugs, this feature has been rolled back in [v1.13.1](https://github.com/android-password-store/Android-Password-Store/releases/tag/v1.13.1).
<!--![App launch screen showing the repository being synced](/uploads/aps-october-release-syncing-repository.webp)-->
## Fixes
### Improved error messaging
For a large set of connection related errors, the failure message would simply be 'Invalid remote: origin'. That is exactly as unhelpful as one might think, and now we try harder to extract the actual, more meaningful error message.
### Use Git's default user and email when none are configured
We don't force users to set a name and email before they make any changes requiring Git commits, but somewhere in the last couple releases we regressed our behavior around this. Rather than the `root <root@localhost>` committer, we were incorrectly using empty strings resulting in all commits being authored by ` <>`. This has now been resolved, and your commit history will now be adorned by `root@localhost` once more (but seriously, just set your name and email already).
### Improvements around phishing detection UX
APS has had comprehensive phishing detection built into our Autofill since day one. Our phishing-resistant search will not show your `google.com` passwords when you try to fill into `goggle.com`, and if the signature of an application changes after you first filled a password into it, we will warn you about the change. There were a couple issues with the way this was happening.
First, the phishing detection UI was a bit complicated, and also had some unreadable, black-on-dark text. Since this was never reported to us, I believe none of our users are being phished by their apps which is great news :) Regardless, it is now fixed.
Secondly, some complexity with how Android's Autofill APIs work resulted in the "no I'm not being phished, accept this new signature" case to not work correctly. This caused the user to be continually shown the phishing detection prompt until they force closed the target app and started it again. That's cumbersome, so we've fixed it now. Cheers to Fabian for his stellar work as always!
### Conclusion
As you can notice, this is a bit of a small release by our standards. Fabian's been busy with his Ph.D. (!!) and the new job he's starting at soon (!!), and me and Aditya have been busy with our day jobs as well. This doesn't spell doom for the project (yet), but your financial contributions over on [GitHub Sponsors](https://github.com/sponsors/msfjarvis) and [OpenCollective](https://opencollective.com/Android-Password-Store) are now much more important than ever to sustain the project during this time via bountied issues and simply compensating the current crop of developers for their time.

View File

@ -0,0 +1,80 @@
+++
categories = ["aps"]
date = 2020-09-21
summary = "Long form release notes for the Android Password Store September release"
slug = "aps-september-release"
socialImage = "uploads/aps_banner.webp"
tags = ["relnotes", "oss", "android-password-store"]
title = "Android Password Store September release"
toc = true
+++
Continuing with this new-ish tradition we have going, here are the detailed release notes for the [v1.12.0](https://github.com/Android-Password-Store/android-password-store/releases/tag/v1.12.0) release.
> Multiple important announcements at the end of the page, make sure to read the whole thing!
## New features
### Extend Autofill support to more browsers
[Devin J. Pohly](https://github.com/djpohly) and [Rounak Dutta](https://github.com/rounakdatta) collectively contributed support for 3 new Chromium-based browsers: [Bromite](https://www.bromite.org/), [Ungoogled Chromium](https://git.droidware.info/wchen342/ungoogled-chromium-android) and [Kiwi](https://kiwibrowser.com/).
### Allow sorting by recently used
This feature was requested [a while ago](https://msfjarvis.dev/aps/issue/535) and was [implemented by Alex Molinares](https://msfjarvis.dev/aps/pr/1031) early in the cycle. The database that keeps track of the recently used passwords is always active, so if and when you switch to this sorting mode you'll see everything already sorted based on your old usage patterns. Neat!
### Add ability to view Git commit log
Another, [even older](https://msfjarvis.dev/aps/issue/284) feature request has finally been addressed. This too, [came from an external contributor](https://msfjarvis.dev/aps/pr/1056) and was one of the best pull requests I have ever seen. It's a great feature, and I thoroughly enjoyed the entire process of its inclusion.
### SSH key generation and handling improvements
The old SSH key generation has been [scrapped and rewritten](https://msfjarvis.dev/aps/pr/1070) to use a set of safer cryptographic curve options that span the distance between widely supported and very secure. The [wiki page](https://github.com/android-password-store/Android-Password-Store/wiki/Generate-SSH-Key) has been updated for these changes with information on how we're securing access to the actual SSH keys, like storing the key file in the Android Keystore and requiring screen lock authentication before the key can be used.
### Fallback authentication for SSH
SSH servers are often configured to have multiple authentication methods, where you first attempt to authenticate with private keys and if that fails, fall back to passwords. This wasn't previously supported in APS, which would quit after the first failure. We've changed that to now offer the option of entering a password if the server is configured to fall back to it.
### Rewritten and redesigned onboarding flow
In a multi-step refactoring process, the initial flow of setting up the app has been completely revamped. The internals were completely overhauled to improve stability, weed out some gnarly hacks, and make the whole thing easier to test and understand. Maintainer [Aditya Wasan](https://github.com/Skrilltrax) did a fabulous job giving the [UI a facelift](https://msfjarvis.dev/aps/pr/1099). It's real pretty now ✨
### Show hidden folders now also shows hidden directories
Our old 'Show hidden folders' feature has now been simplified to show _all_ hidden files and folders in the repository. It is intended to make it easier to perform trivial maintenance tasks that would normally require access to a PC.
## Bugfixes
### SSH connection problems with Bitbucket
In our last major release, we included a change to [re-use SSH connections](https://msfjarvis.dev/aps/pr/1012) to speed up Git operations. This had an unfortunate side effect: Bitbucket users were unable to use SSH to connect to their repositories. Atlassian has been [aware of this problem](https://community.atlassian.com/t5/Bitbucket-questions/Can-t-repo-sync-anymore/qaq-p/354231) for quite some time now and did nothing about it, so we now include a [helpful message and an internal workaround](https://msfjarvis.dev/aps/pr/1093) when this particular type of error is encountered.
### Symlink support
While still potentially finicky, we're now confident that this is ready to be shipped to all users without the risk of crashes.
### Assorted UX improvements
As always, there are a handful of Quality of Life changes to make the app more enjoyable to use:
- When retrying password authentication, the option to see what you're typing would be obscured by the error icon for wrong password. This has been remedied, and the error state will now be cleared as soon as you enter anything into the password field.
- Authentication modes will now be dynamically hidden and shown based on the URL's schema so you're aware of what methods you have for authentication for any given remote repository.
- Since decryption can sometimes take a couple seconds due to how OpenKeychain works, we now hide the action buttons at the top of the screen until the decrypt operation has completed since using the buttons before that can leave the app in an odd state.
- Users will be prompted if they need to provide a username in their URLs. For example, if your repository is at `https://github.com/john.doe/passwords`, you will have to change the URL to `https://john.doe@github.com/john.doe/passwords` for HTTPS authentication to work.
- If it appears that an SSH URL contains a custom port but does not specify the `ssh://` schema, the user will be prompted to accept a quickfix that does it for them.
- Pressing the save button is no longer necessary to save changes to authentication mode.
- TOTP values might sometimes be outdated because we always wait 30 seconds to generate a new one. Now the app will calculate the time left before the first generated value goes stale, generate a new one once it does, and then resume the 30 second cycle.
There's definitely more fixes here, but we ended up rewriting, breaking and fixing so many things for this release that it's hard to tell what was actually broken in the previous release and what is just us fixing regressions during refactoring. We've been busy :)
## Important announcements
### Autofill parser is now a standalone library!
Our excellent Autofill capabilities are now bundled as a separate Android library and can be used by other password managers to improve their Autofill experiences. Detailed documentation will be coming over the next few days, keep an eye out [here](https://github.com/android-password-store/Android-Password-Store/tree/develop/autofill-parser) if it's something you're interested in.
### RFC for removal of Git support in external repos
Based on the issues raised in the repository and the support emails I've received, the maintainers have come to the conclusion that nearly all users who choose to store their pass repositories in their device storage or external SD card as opposed to the app's private, hidden directory are not users of Git and rely on solutions like Syncthing and Nextcloud to keep the repository in sync with their other devices.
As such, we are now in the process of removing Git support from these repositories. We've carefully evaluated how we want to do this, and have started with removing the ability to clone repositories to public storage in this release. If this doesn't blow up in our faces, we will be completing the transition in v1.13.0. If you believe the change adversely affects your usage of the app, we wanna know! Drop a comment on [GitHub](https://msfjarvis.dev/aps/issue/1118) and we will do our best to either propose an alternative for your use case or entirely scrap our plans if we discover that our initial inferences were misguided.

View File

@ -0,0 +1,101 @@
+++
categories = ["how-to"]
date = 2022-04-04
summary = "Putting your media into Google Photos is easy, taking it out, not as much."
slug = "backing-up-your-content-from-google-photos"
socialImage = "/uploads/google-photos-backup.webp"
tags = ["backup", "google photos", "gphotos-cdp"]
title = "Backing up your content from Google Photos"
+++
Google Photos has established itself as one of the most popular photo storage services, and like a typical Google service, it makes it impressively difficult to get your data back out of it :D
There are many good reasons why you'd want to archive your pictures outside of Google Photos, having an extra backup never hurts, maybe you want an offline copy for reasons, or you just want to get your stuff out so you can switch away from Google Photos entirely.
### How to archive your images from Google Photos
1. You can use [Takeout], except it **always** strips the EXIF metadata of your images, and often generates incomplete archives. Losing EXIF metadata is a deal-breaker, because you can no longer organize images automatically based on properties like date, location, and camera type.
2. You can download directly from [photos.google.com] which preserves metadata, but is embarassingly manual and basically impossible to use if you're trying archive a few years of history.
So, what's the solution?
### gphotos-cdp
[gphotos-cdp] is a tool that uses the nearly-perfect method number 2 and makes it automated. It does so by using the [Chrome DevTools Protocol] to drive an instance of the Google Chrome browser, and emulates all the manual actions you'd take as a human to ensure you get copies of your pictures with all the EXIF metadata retained.
### Setting up gphotos-cdp
> Disclaimer: I've only tested this on Linux. This _should_ be doable on other platforms, but it's not relevant to my needs so I will not be investigating that.
Ideally you'd want to run this tool on a schedule on a NAS or a server to keep archiving images automatically as they get added to your Google Photos. I personally run this inside a hosted VM on a daily schedule.
For gphotos-cdp to run in a non-interactive manner, it requires your browser data directory with your Google login cookies. You can easily create this with the following command:
```bash
google-chrome \
--user-data-dir=gphotos-cdp \
--no-first-run \
--password-store=basic \
--use-mock-keychain \
https://photos.google.com/
```
This will launch Google Chrome with a brand new profile. Login to Photos, and then close the browser. Optionally, re-run the command to ensure that you do not need to login again.
> The flags passed to google-chrome are extracted from the default set of parameters used by gphotos-cdp. I wish I could explain why each flag is necessary, but all I know is that it does the trick. I got them from [this GitHub comment] on the issue tracker for gphotos-cdp.
Once done, you'll have a `gphotos-cdp` directory that you'll need to move to the `/tmp` directory of whichever machine you wish to run gphotos-cdp on.
gphotos-cdp is written in [Golang] so you'll need to install it first. Once done, run the following command to install the latest version of gphotos-cdp
```bash
go install github.com/perkeep/gphotos-cdp@latest
```
Then you can go ahead and start using gphotos-cdp, as given below
```bash
~/go/bin/gphotos-cdp \ # go install puts things in ~/go/bin by default
-v \ # Enable verbose logging
-dev \ # Enable dev mode which always uses /tmp/gphotos-cdp as the profile directory
-headless \ # Run Chrome in headless mode so it works on servers and such
-dldir ~/photos # Download everything to ~/photos
```
The automation techniques used are not completely reliable and can often fail. You'll want to implement some kind of retry-on-failure logic to ensure this is run a few times every day.
### Monitoring
With anything built on such a brittle foundation, it's useful to be able to constantly monitor that things are working as they should.
Using [healthchecks.io] you can easily set up alerts that notify you of failures running the tool or unintentional gaps in the schedule you run the gphotos-cdp on. I use my [healthchecks-monitor] CLI in a [cron] job to run gphotos-cdp every day, and healthchecks.io notifies me via Telegram when it fails. The script running in cron looks like this
```bash
#!/usr/bin/env bash
HEALTHCHECKS_CHECK_ID=<UUID for check as given on healthchecks> \
HEALTHCHECKS_USERAGENT=crontab \
~/bin/healthchecks-monitor --retries 3 \ # Try running the command thrice before giving up
--timer \ # Start off a server-side timer on healthchecks
--logs \ # Record execution logs on healthchecks in case of failure, to help with debugging
--exec "~/go/bin/gphotos-cdp -v -dev -headless -dldir ~/photos"
```
### Conclusion
As evident, it's not an easy task to automatically archive your pictures from Google Photos. The setup is tedious and prone to breakage when any authentication related change happens, such as you accidentally logging out the "device" being used by gphotos-cdp or changing your password, in which case you will need to create the `gphotos-cdp` directory with Chrome again.
Also, the technique in this post could easily stop working at any time if Google chooses to break it. That being said, gphotos-cdp was last updated in 2020 and still continues to function as-is so there is some degree of hope that it can be used for quite a bit more.
Hopefully this setup causes you minimal grief and allows you to back up your precious memories without relying only on Google :)
[takeout]: https://takeout.google.com/
[photos.google.com]: https://photos.google.com/
[gphotos-cdp]: https://github.com/perkeep/gphotos-cdp
[chrome devtools protocol]: https://chromedevtools.github.io/devtools-protocol/
[this github comment]: https://github.com/perkeep/gphotos-cdp/issues/1#issuecomment-567378082
[golang]: https://go.dev
[healthchecks.io]: https://healthchecks.io
[healthchecks-monitor]: https://msfjarvis.dev/g/healthchecks-rs
[cron]: https://man7.org/linux/man-pages/man5/crontab.5.html

View File

@ -0,0 +1,57 @@
+++
categories = ["rust"]
date = 2021-10-17
summary = "Some tips on building static binaries of Rust projects targeting Linux"
slug = "building-static-rust-binaries-for-linux"
tags = ["rust static linking", "rust static binary", "rust build static binary"]
title = "Building static Rust binaries for Linux"
socialImage = "uploads/rust_social.webp"
+++
Rust has supported producing statically linked binaries since [RFC #1721] which proposed the `target-feature=+crt-static` flag to statically link the platform C library into the final binary. This was initially only supported for Windows MSVC and the MUSL C library. While MUSL works for _most_ people, it
has many problems by virtue of being a work-in-progress such as [unpredictable performance] and many unimplemented features which programs tend to assume are present due to glibc being ubiquitous. In lieu of these concerns, support was added to Rust in 2019 to be able to [statically link against glibc].
Unfortunately, if you try to directly use it with `RUSTFLAGS='-C target-feature=+crt-static' cargo build` there is a good chance you'll run into an error similar to this:
```
cannot produce proc-macro for `async-trait v0.1.51` as the target `x86_64-unknown-linux-gnu` does not support these crate types
```
This is a bit of a head scratcher, because the target (your host machine) _definitely_ supports proc-macro crates. Turns out, even Rust contributors [were confused by this]. The "fix" for this is apparently to pass in the `--target` explicitly. The reason behind this seems to be a bug with cargo, where the `RUSTFLAGS` are applied to the target platform only when `--target` is explicitly provided. Without it, `RUSTFLAGS` values are set for the host only which results in the errors we see. More details are available [Rust issue #78210]
Therefore, the correct way to build a statically linked glibc executable for an x86_64 machine is this:
```shell
RUSTFLAGS='-C target-feature=+crt-static' cargo build --release --target x86_64-unknown-linux-gnu
```
## Other potential problems
You may be unable to statically link your binary even after all this, due to dependencies that _mandate_ dynamic linking. In some cases this is avoidable, such as using [rustls] in place of OpenSSL for cryptography, and [hyper] in place of bindings to cURL for HTTP, not so much in others. Thanks to the convention of native-linking crates using the `-sys` suffix in their name it is fairly simple to find if your build has dependencies that dynamically link to libraries. Using `cargo`'s native `tree` subcommand and `grep`ing (or [ripgrep]ing for me), you can locate native dependencies. Running `cargo tree | rg -- -sys` against [androidx-release-watcher]'s `v4.1.0` release gives us this:
```bash
$ cargo tree | rg -- -sys
│ │ │ │ ├── curl-sys v0.4.45+curl-7.78.0
│ │ │ │ │ ├── libnghttp2-sys v0.1.6+1.43.0
│ │ │ │ │ ├── libz-sys v1.1.3
│ │ │ │ │ └── openssl-sys v0.9.66
│ │ │ │ ├── openssl-sys v0.9.66 (*)
│ │ │ ├── curl-sys v0.4.45+curl-7.78.0 (*)
│ └── web-sys v0.3.53
│ ├── js-sys v0.3.53
```
This indicates curl, zlib, openssl, and libnghttp2 as well as a bunch of WASM-related things are being dynamically linked into my executable. To resolve this, I looked at the build features exposed by [surf] and found that it selects the `"curl_client"` feature by default, which can be turned off and replaced with `"h1-client-rustls"` which uses an HTTP client backed by [rustls] and [async-std] and no dynamically linked libraries. Enabling [this build feature] removed all `-sys` dependencies from [androidx-release-watcher], allowing me to build static executables of it.
[rfc #1721]: https://github.com/rust-lang/rfcs/pull/1721
[unpredictable performance]: https://www.reddit.com/r/rust/comments/a6pna3/why_rust_uses_glibc_and_not_musl_by_default_for/ebzpzld/
[statically link against glibc]: https://github.com/rust-lang/rust/issues/65447
[were confused by this]: https://github.com/rust-lang/rust/issues/78210
[rust issue #78210]: https://github.com/rust-lang/rust/issues/78210#issuecomment-714776007
[rustls]: https://github.com/rustls/rustls
[hyper]: https://hyper.rs
[ripgrep]: https://github.com/BurntSushi/ripgrep
[androidx-release-watcher]: https://msfjarvis.dev/g/androidx-release-watcher
[surf]: https://github.com/http-rs/surf
[async-std]: https://github.com/async-rs/async-std
[this build feature]: https://msfjarvis.dev/g/androidx-release-watcher/b67a212106d8

View File

@ -0,0 +1,185 @@
+++
categories = ["gradle"]
date = 2022-04-17
summary = "Gradle's convention plugins are a fantastic way to share common build configuration, why not take them a step further?"
slug = "converting-gradle-convention-plugins-to-binary-plugins"
tags = ["convention plugins", "gradle"]
title = "Converting Gradle convention plugins to binary plugins"
socialImage = "uploads/gradle-social.webp"
+++
### Introduction
Gradle's [convention plugins] are a powerful feature that allow creating simple, reusable Gradle plugins that can be used across your multi-module projects to ensure all modules of a certain type are configured the same way. As an example, if you want to enforce that none of your Android library projects contain a `BuildConfig` class then the convention plugin for it could look something like this:
> `com.example.android-library.gradle.kts`
>
> ```groovy
> plugins {
> id("com.android.library")
> }
>
> android {
> buildFeatures {
> buildConfig = false
> }
> }
> ```
Then in your modules, you can use this plugin like so:
> `library-module/build.gradle.kts`
>
> ```groovy
> plugins {
> id ("com.example.android-library")
> }
> ```
## Setting up convention plugins in your project
Gradle's official sample linked above mentions `buildSrc` as the location for your convention plugins. I'm inclined to disagree, `buildSrc` has historically had issues with IDE support and it's special status within Gradle's project handling means any change within `buildSrc` invalidates caches for your **entire** project resulting in incredible amounts of time lost during incremental builds.
The solution to all of these problems is [composite builds], and [Josef Raska has a fantastic article] that thoroughly explains the shortcomings of `buildSrc` and how composite builds solve them.
A full explainer on the topic is slightly out of scope for this post, but I can wholeheartedly endorse Jendrik Johannes' [idiomatic-gradle] repository as an example of setting up the Gradle build of a real-world project while leveraging features introduced in recent versions of Gradle. I highly recommend also checking out their 'Understanding Gradle' [video series].
## Why would you want to make binary plugins out of convention plugins
First, let's answer this: what is a binary plugin?
A Gradle plugin that is resolved as a dependency rather than compiled from source is a binary plugin. Binary plugins are cool because the next best thing after a cached compilation task is one that doesn't exist in the first place.
For most use cases, convention plugins will need to be updated very infrequently. This means that having each developer execute the plugin build as part of their development process is needlessly wasteful, and we can instead just distribute them as maven dependencies.
This also makes it significantly easier to share convention plugins between projects without resorting to historically painful solutions like Git submodules or just straight up copy-pasting.
## Publishing your convention plugins
To their credit, Gradle supports this ability very well and you can actually publish all plugins within a build/project with minimal configuration. The changes required to publish [Android Password Store]'s convention plugins for Android are:
> `build-logic/android-plugins/build.gradle.kts`
>
> ```diff
> -plugins { `kotlin-dsl` }
> +plugins {
> + `kotlin-dsl`
> + id("maven-publish")
> +}
> +
> +group = "com.github.android-password-store"
> +
> +version = "1.0.0"
> ```
After that you can run `gradle -p build-logic publishToMavenLocal` and it will Just Work:tm:. You can configure additional publishing repositories in similar fashion to how you'd do it for a library project.
If like me you need to publish these to [Maven Central], you'll need slightly more setup since it enforces multiple security and publishing related best practices. Here's how I use [gradle-maven-publish-plugin] to configure the same (`gradle.properties` changes omitted for brevity, the GitHub repository explains what you need):
> `build-logic/settings.gradle.kts`
>
> ```diff
> +pluginManagement {
> + repositories {
> + mavenCentral()
> + gradlePluginPortal()
> + }
> + plugins {
> + id("com.vanniktech.maven.publish.base") version "0.19.0"
> + }
> +}
> +
> ```
> `build-logic/android-plugins/build.gradle.kts`
>
> ```diff
> +import com.vanniktech.maven.publish.JavadocJar
> +import com.vanniktech.maven.publish.JavaLibrary
> +import com.vanniktech.maven.publish.MavenPublishBaseExtension
> +import com.vanniktech.maven.publish.SonatypeHost
> +import org.gradle.kotlin.dsl.provideDelegate
> +
> -plugins { `kotlin-dsl` }
> +plugins {
> + `kotlin-dsl`
> + id("com.vanniktech.maven.publish.base")
> + id("signing")
> +}
> +
> +configure<MavenPublishBaseExtension> {
> + group = requireNotNull(project.findProperty("GROUP"))
> + version = requireNotNull(project.findProperty("VERSION_NAME"))
> + publishToMavenCentral(SonatypeHost.DEFAULT)
> + signAllPublications()
> + configure(JavaLibrary(JavadocJar.Empty()))
> + pomFromGradleProperties()
> +}
> +
> + afterEvaluate {
> + signing {
> + val signingKey: String? by project
> + val signingPassword: String? by project
> + useInMemoryPgpKeys(signingKey, signingPassword)
> + }
> + }
> ```
This will populate your POM files with the properties required by Maven Central and sign all artifacts with PGP.
## Consuming your new binary plugins
With your convention plugins converted to shiny new binary plugins, you might be inclined to start using them like so:
> `autofill-parser/build.gradle.kts`
>
> ```diff
> plugins {
> - id("com.github.android-password-store.published-android-library")
> - id("com.github.android-password-store.kotlin-android")
> - id("com.github.android-password-store.kotlin-library")
> - id("com.github.android-password-store.psl-plugin")
> + id("com.github.android-password-store.published-android-library") version "1.0.0"
> + id("com.github.android-password-store.kotlin-android") version "1.0.0"
> + id("com.github.android-password-store.kotlin-library") version "1.0.0"
> + id("com.github.android-password-store.psl-plugin") version "1.0.0"
> }
> ```
However, this fails because `kotlin-android` and `kotlin-library` plugins resolve to the same binary JAR that encompasses all plugins from the `build-logic/kotlin-plugins` module and results in a classpath conflict. To better understand how this resolution works, check out the docs on [plugin markers].
The way to resolve this problem is to define the plugin versions in your `settings.gradle.kts` file, where these classpath conflicts will be resolved automatically by Gradle:
> `settings.gradle.kts`
>
> ```diff
> @@ -14,6 +14,25 @@ pluginManagement {
> mavenCentral()
> gradlePluginPortal()
> }
> + plugins {
> + id("com.github.android-password-store.kotlin-android") version "1.0.0"
> + id("com.github.android-password-store.kotlin-library") version "1.0.0"
> + id("com.github.android-password-store.psl-plugin") version "1.0.0"
> + id("com.github.android-password-store.published-android-library") version "1.0.0"
> + }
> }
> ```
And you're off to the races!
## Closing notes
This post was motivated by my goal of sharing a common set of Gradle configurations across my projects such as [Android Password Store] and [Claw], which maintain a nearly identical set of convention plugins shared between the projects that I manually copy-paste back and forth. I've extracted the `build-logic` subproject of APS to a separate [aps-build-logic] repository, set it up for standalone development and configured publishing support. My goal is to supplement this with a continuous deployment workflow where an automatic version bump + release happens after each commit to the main, after which I can migrate my projects to it.
[convention plugins]: https://docs.gradle.org/current/samples/sample_convention_plugins.html
[composite builds]: https://docs.gradle.org/current/userguide/composite_builds.html
[josef raska has a fantastic article]: https://proandroiddev.com/stop-using-gradle-buildsrc-use-composite-builds-instead-3c38ac7a2ab3
[idiomatic-gradle]: https://github.com/jjohannes/idiomatic-gradle
[video series]: https://github.com/jjohannes/understanding-gradle#readme
[android password store]: https://msfjarvis.dev/aps
[maven central]: https://search.maven.org/
[gradle-maven-publish-plugin]: https://github.com/vanniktech/gradle-maven-publish-plugin
[plugin markers]: https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_markers
[claw]: https://msfjarvis.dev/g/compose-lobsters
[aps-build-logic]: https://msfjarvis.dev/g/aps-build-logic

View File

@ -0,0 +1,81 @@
+++
categories = ["webdev", "github-actions"]
date = 2020-02-05
summary = "GitHub Actions paired with GitHub Pages provides an excellent CD platform for a status page. Here's how I used it to create mine."
devLink = "https://dev.to/msfjarvis/creating-a-continuously-deploying-static-statuspage-with-github-3ol2"
slug = "creating-a-continuously-deploying-static-statuspage-with-github"
socialImage = "uploads/statuspage_social.webp"
tags = ["github pages"]
title = "Creating a continuously deploying static statuspage with GitHub"
+++
A status page is essentially a web page that reports the health and uptime of an organization's various online services. [GitHub](https://www.githubstatus.com/) has one and so does [Cloudflare](https://www.cloudflarestatus.com/). Most of these are powered by an [Atlassian](https://www.atlassian.com/) product called [Statuspage](https://www.statuspage.io/) but it's not always the [cheapest solution](https://www.statuspage.io/pricing?tab=public).
For hobbyist projects without any real budget (like this site and the couple others I run), Statuspage pricing is often too steep. To this effect, many open source projects exist to let you generate your own status page through an application that handles continuous updates of it. That works too! But what if you don't have a separate server to run the status page service on? Hosting on a server with other applications that its supposed to track is obviously not an option. Enter [static_status](https://github.com/Cyclenerd/static_status).
[static_status](https://github.com/Cyclenerd/static_status) is a bash script that as its name suggests, generates a fully static webpage that functions as a status page for the services you ask it to monitor. You can check out how it looks at [status.msfjarvis.dev](https://status.msfjarvis.dev). Pretty neat, right?
[status.msfjarvis.dev](https://status.msfjarvis.dev) is powered by a GitHub Action running every 30 minutes to deploy the generated static page to GitHub Pages and barely takes any time to set up. Here's how it works.
- First thing that you want to do is to setup the `CNAME` record that will let GitHub Pages service your status page to a subdomain of your website. Head to your domain registrar (Cloudflare for me) and add a CNAME record for `<your github username>.github.io`
![CNAME record for status.msfjarvis.dev at Cloudflare](/uploads/statuspage_cname_record.webp)
- Next, create a GitHub repository that will hold the Actions workflow for generating your status page as well as the actual status page itself. This repo can be private, as the generated sites are always publicly available.
![GitHub repository for our status page](/uploads/statuspage_github_repo.webp)
- Clone this empty repository. Now create a file with the name of `CNAME` and enter your custom domain into it. This lets GitHub Pages know where to redirect users if they ever access the site through your `.github.io` subdomain. Commit this file.
![CNAME file in repository](/uploads/statuspage_cname_file.webp)
- A quick glance at the static_status README will inform you about the `config` file that it uses to configure itself, and status_hostname_list.txt which has a list of all services it needs to check. `config` is easy to understand and modify, so I'll skip it (you can diff [mine](https://github.com/msfjarvis/status.msfjarvis.dev/blob/master/config) with upstream and use the changes to educate yourself should the need arise). This part should be very straightforward, though I did encounter a problem where using `ping` as the detection mechanism caused sites to falsely report as down. Switching to `curl` resolved the issue.
- Finally, time to add the automation to this whole thing. Any CI solution with a cron/schedule option will work, I used GitHub Actions, you don't have to. I set a schedule of once every 30 minutes, depending on what platform you're using for CD and what services you're hosting, you might want to choose a shorter period. Here's my GitHub Actions workflow.
```yaml
name: "Update status page"
on:
schedule:
- cron: "*/30 * * * *"
push:
jobs:
update-status-page:
runs-on: ubuntu-latest
steps:
- name: Install traceroute
run: sudo apt-get install traceroute -y
- name: Checkout config
uses: actions/checkout@v2
- name: Checkout static_status
uses: actions/checkout@v2
with:
repository: Cyclenerd/static_status
path: static_status
clean: false
- name: Generate status page
run: |
mkdir -p static_status/status/
cp config static_status/
cp status_hostname_list.txt static_status/
cp CNAME static_status/status/
cd static_status/
rm status_maintenance_text.txt
./status.sh
- name: Deploy
uses: peaceiris/actions-gh-pages@v2
env:
PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
PUBLISH_BRANCH: gh-pages
PUBLISH_DIR: ./static_status/status
SCRIPT_MODE: true
with:
username: "MSF-Jarvis"
useremail: "msfjarvis+github_alt@gmail.com"
```
This installs `traceroute` which is needed by static_status, checks out my repository, clones static_status to the static_status directory, copies over config and hostname list to that folder, places the `CNAME` file in the static_status/status directory, runs the script to generate the status page, and finally publishes the static_status/status folder to the `gh-pages` branch, as my bot account.
The result of this is a simple and fast statuspage that can be hosted anywhere by simply coping the single `index.html` over. If you have a separate server to run this off, you can get away with replacing this entire process with a single crontab command. Being a bash script lets static_status run on essentially any Linux-based platform so you can actually deploy this from a Raspberry Pi with no effort. Hope this helps you to create your own status pages!

View File

@ -0,0 +1,161 @@
+++
categories = ["android"]
date = 2020-01-20
summary = "Dagger is universally intimidating to beginners and I want to change it."
devLink = "https://dev.to/msfjarvis/dagger-the-easy-way-part-1-3l7b"
slug = "dagger-the-easy-way--part-1"
socialImage = "uploads/dagger_made_easy_social.webp"
tags = ["dagger", "tutorial"]
title = "Dagger the easy way - Part 1"
+++
> Updated on 22 Jan 2020 with some additional comments from [@arunkumar_9t2](https://twitter.com/arunkumar_9t2). Look out for them as block quotes similar to this one.
This is not your average coding tutorial. I'm going to show you how to write actual Dagger code and skip all the scary and off-putting parts about the implementation details of the things we're using and how Dagger does everything under the hood.
With that out of the way, onwards to the actual content. We're going to be building a very simple app that does just one thing, show a Toast with some text depending on whether it was the first run or not. Nothing super fancy here, but with some overkill abstraction I'll hopefully be able to demonstrate a straightforward and understandable use of Dagger.
I've setup a repository at [msfjarvis/dagger-the-easy-way](https://github.com/msfjarvis/dagger-the-easy-way) that shows every logical collection of changes in its own separate commit, and also a PR to go from no DI to Dagger so you can browse changes in bulk as well.
## The mandatory theory
I know what I said, but this is just necessary. Bear with me.
### `Component`
A Component defines an interface that Dagger constructs to know the entry points where dependencies can be injected. It can also hold the component factory that instructs Dagger how to construct said component. A Component _also_ holds the list of modules.
### `Module`
A Module is any logical unit that contributes to Dagger's object graph. In simpler terms, any `class` or `object` that has declarations which tell Dagger how to construct a particular dependency, is annotated with `@Module`.
> _Arun's notes_
>
> Modules should be mentioned first here, as they're the smallest units of a Dagger setup, and Components build upon them. An alternate definition for a module can also be this: if we draw a graph, methods in @Module classes become the nodes and @Component is the holder of those nodes.
## Getting Started
To get started, clone the repository which contains all the useless grunt work already done for you. Use `git clone https://github.com/msfjarvis/dagger-the-easy-way` if you're unfamiliar with branch selection during clone.
The repo in this stage is very bare - it has the usual boilerplate and just one class, `MainActivity`. We're going to make this a bit more interesting shortly.
Switch to the `part-1` branch, which has a bit more in terms of commit history and code. This is what we're going to work with.
## Setting up the object graph
Remember `Component` and `Module`? It's gonna come in handy here.
Start off with [adding the Dagger dependencies](https://github.com/msfjarvis/dagger-the-easy-way/commit/f86208b89cee2c05becd4341e1b209dc2479aa2f), then add an **empty** Component and Module, which we did [here](https://github.com/msfjarvis/dagger-the-easy-way/commit/f1604adb4e99f342b213cefa9fada21efb6f49a2).
```kotlin
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
}
@Module
object AppModule {
}
```
What we're doing here, is marking our `AppComponent` as a 'singleton', to indicate that it needs to only be constructed _once_ for the lifecycle of the application. We're also annotating it with `@Component` for obvious reasons, and adding our module to it to indicate that they're going together. This is empty right now but that's going to change soon.
> _Arun's notes_
>
> Annotating with @Singleton is only effective when configured properly. For this to be a singleton, you need to ensure you're creating this only once and that's your responsibility to fulfill. This is part of scoping and is a great topic to be covered in part 2.
If you check `MainActivity`, you'll notice that we're using [SharedPreferences](https://developer.android.com/reference/android/content/SharedPreferences.html). To demonstrate the use of Dagger, I'm going to replace that usage with one provided through Dagger. For that to happen though, Dagger needs to know how to create a `SharedPreferences`. Let's get that going!
```kotlin
@Module
object AppModule {
@Provides
@Reusable
fun provideSharedPrefs(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
}
```
Breaking this down: `Provides` tells Dagger to bind the return value of the method to the object graph, and `Reusable` tells Dagger that you want to use one copy of this as many times as you can, but it's _okay_ to create a new instance if that's not possible.
If you pay attention to the [commit](https://github.com/msfjarvis/dagger-the-easy-way/commit/f1a60ffaf6f07f8654bde27fbd65bef08c248f4e) for this step, you'll see that we're also adding preferences to the `AppComponent`. This is just one of the many different patterns one can use with Dagger, and I'm using it just for the simplicity. We'll look into another way of doing this for the next part.
## Initializing our component
Now for Dagger to know when to create this graph, it needs to be able to know how to initialize the `Component` we wrote earlier. For this, we'll be adding a factory that constructs the `AppComponent`. Since we need a Context to be able to create `SharedPreferences`, we'll make our factory accept a context parameter.
> _Arun's notes_
>
> Worth nothing that the reason we create a factory method accepting Context instead of letting Dagger provide is because we don't have hold of Context during compile time. The instance is created by Android system and given to us which we then use Factory to give it to dagger.
Here's how the finished `AppComponent` looks like with the factory method.
```kotlin
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance applicationContext: Context): AppComponent
}
val preferences: SharedPreferences
}
```
The `BindsInstance` annotation tells Dagger that we'll be providing our own Context and that it does not have to know how to create one.
As the parameter name suggests, we'll be using an application-scoped Context for this, so let's initialize the Component in an Application class. We'll be accessing our dependencies through this initialized component, and the Application class is always initialized first so that let's us avoid any situation where we try to refer to the component and find that it's null.
Create an Application class, make it extend `android.app.Application`, and add it to the manifest ( [Reference commit](https://github.com/msfjarvis/dagger-the-easy-way/commit/25d4dc223bfafd40ac9801e23ca9b09526ed9362)).
Now we'll be adding our component here. Since we'll be accessing it from other classes, we'll make it static. The Application class lives as long as our process does, so we're safe from a life-cycle perspective. Here's the finished `ExampleApplication` class.
```kotlin
class ExampleApplication : Application() {
override fun onCreate() {
super.onCreate()
component = DaggerAppComponent.factory().create(this)
}
companion object {
lateinit var component: AppComponent
}
}
```
> _Arun's notes_
>
> Nit: I like to do something like [this](https://github.com/arunkumar9t2/scabbard/blob/004116cf6a548022982c7869d7758725c18991f8/scabbard-sample/src/main/java/dev/arunkumar/scabbard/App.kt#L10). The reason is, since it is a val, it will not be editable and also lazy being lazy means it will cached.
Notice the `DaggerAppComponent` class that did not exist before. This is a Dagger generated version of our `AppComponent` interface that is suitable for instantiation. This class holds the factory method we created before, and returns an instance of `AppComponent` that let's us access the dependencies we installed into the component. When we initialize our component, Dagger also intelligently creates all the dependencies in our graph. Now all that's left for us is to use the dependencies we declared in our app.
## Injecting dependencies
Head on over to `MainActivity` now. Notice that we initialize a `SharedPreferences` object there, which can be replaced with the one we asked Dagger to create for us. Let's do that!
```diff
class MainActivity : AppCompatActivity() {
+ private val prefs = ExampleApplication.component.preferences
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
if (prefs.getBoolean("first_start", true)) {
Toast.makeText(this, "First start!", Toast.LENGTH_LONG).show()
prefs.edit().putBoolean("first_start", false).apply()
```
And that's it. Really. Now you're using Dagger to provide a dependency. It's that simple!
## Conclusion
As you've seen here, using Dagger does not always have to involve complexity. Dagger can be used in projects of any size, of any complexity, and in any fashion that you deem fit. The example above is a very simple use of Dagger, and has scope for further improvement which we'll be looking into.
This is my first time writing about using Dagger, having only [recently started using and liking it](/posts/my-dagger-story/). Please let me know about any parts that were too complex, factually incorrect or just lacking in any way, and I will be more than glad to improve this.
In the next part, we'll be looking into constructor injection, why it's generally better, and how to inject dependencies into classes that we don't own (like activities and fragments) with the help of the `@Inject` annotation. Thanks for reading this far!

View File

@ -0,0 +1,313 @@
+++
categories = ["android"]
date = 2020-03-06
summary = "Let's extend the \"scope\" of these tutorials :)"
devLink = "https://dev.to/msfjarvis/dagger-the-easy-way-part-2-4p4m"
slug = "dagger-the-easy-way--part-2"
socialImage = "uploads/dagger_made_easy_social.webp"
tags = ["dagger", "tutorial"]
title = "Dagger the easy way - Part 2"
+++
Welcome back! In this post I'm taking a bit of detour from my planned schedule to write about **scoping**. We'll _definitely_ cover constructor injection in the next part :)
> All the code from this post is available on GitHub: [msfjarvis/dagger-the-easy-way](https://github.com/msfjarvis/dagger-the-easy-way/commits/part-2)
Dagger 2 provides `@Scope` as a mechanism to handle scoping. Scoping allows you to keep an object instance for the duration of your scope. This means that no matter how many times the object is requested from Dagger, it returns the same instance.
## Default scopes
In the previous tutorial, we looked at _two_ scopes, namely `@Singleton` and `@Reusable`. Singleton does what its name suggests, and "caches" the dependency instance for the lifecycle of the `@Component`, and Reusable tells Dagger that while we'd prefer that a cached instance be used, we're fine if Dagger needs to create another one. The new Dagger 2 [user guide](https://dagger.dev/users-guide) does a pretty good job differentiating between Singleton, Reusable and unscoped dependencies which I'll reproduce here.
```java
// It doesn't matter how many scoopers we use, but don't waste them.
@Reusable
class CoffeeScooper {
@Inject CoffeeScooper() {}
}
@Module
class CashRegisterModule {
@Provides
// DON'T DO THIS! You do care which register you put your cash in.
// Use a specific scope instead.
@Reusable
static CashRegister badIdeaCashRegister() {
return new CashRegister();
}
}
// DON'T DO THIS! You really do want a new filter each time, so this
// should be unscoped.
@Reusable
class CoffeeFilter {
@Inject CoffeeFilter() {}
}
```
## Why do we need scopes
I'll do a small demo to show the difference between unscoped and singleton dependencies, then we'll move on to defining our own scopes.
```kotlin
// AppComponent.kt
data class Counter(val name: String)
@Component(modules = [AppModule::class])
interface AppComponent {
fun getCounter(): Counter
}
@Module
class AppModule {
private var index = 0
@Provides
fun provideCounter(): Counter {
index++
return Counter("Counter $index")
}
}
```
These dependencies are all unscoped, along with the `AppComponent`. Knowing what we do about unscoped elements in a Dagger graph, predict the output of the following code:
```kotlin
class CounterApplication : Application() {
private val TAG = "CounterApplication"
override fun onCreate() {
super.onCreate()
val appComponent = DaggerAppComponent.builder()
.appModule(AppModule())
.build()
Log.d(TAG, appComponent.getCounter().name)
Log.d(TAG, appComponent.getCounter().name)
}
}
```
Running this on a device will print the following in your logcat
```kotlin
D/CounterApplication: Counter 1
D/CounterApplication: Counter 2
```
Totally expected, because unscoped dependencies have no lifecycle in the component, and hence are created every time you ask for one. Let's make them all into Singletons and see how that changes things.
```diff
data class Counter(val name: String)
+@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun getCounter(): Counter
@@ -12,6 +13,7 @@ class AppModule {
private var index = 0
@Provides
+ @Singleton
fun provideCounter(): Counter {
index++
return Counter("Counter $index")
```
Running the same code again, we get
```kotlin
D/CounterApplication: Counter 1
D/CounterApplication: Counter 1
```
Notice that we were handed the same instance. This is the power of scoping. It lets us have singletons within the defined scope.
Like Arun mentioned in the [additional notes](/posts/dagger-the-easy-way--part-1/#setting-up-the-object-graph) for the previous article, ensuring a singleton Component stays that way is the user's job. If you initialize the component again within the same scope, the new component instance will have a new set of instances. That is part of why we store our component in the [Application](https://developer.android.com/reference/android/app/Application.html) class, because it is the singleton for our apps.
## Creating our own scopes
In its most basic form, a scope is an annotation class that itself has two annotations, `@Scope` and `@Retention`. Assuming we follow an MVP architecture (purely for nomenclature purposes, scoping is not necessarily tied to your architecture), let's create a scope for our `CounterPresenter`.
```kotlin
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class CounterScreenScope
```
Putting this annotation together with our presenter and our component, we finally get this:
```kotlin
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class CounterScreenScope
data class Counter(val name: String)
class CounterPresenter(val counter: Counter)
@Module
class CounterScreenModule {
@Provides
@CounterScreenScope
fun provideCounterPresenter(counter: Counter): CounterPresenter {
return CounterPresenter(counter)
}
}
@CounterScreenScope
@Subcomponent(modules = [CounterScreenModule::class])
interface CounterScreenComponent {
fun inject(counterActivity: MainActivity)
}
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun counterScreenComponent(counterScreenModule: CounterScreenModule): CounterScreenComponent
}
@Module
class AppModule {
private var index = 0
@Provides
fun getCounter(): Counter {
index++
return Counter("Counter $index")
}
}
```
Phew, a lot happened there. Let's break it down.
```kotlin
class CounterPresenter(val counter: Counter)
```
This is simply a class that represents our presenter. We don't care much for implementation details here, so the class does nothing.
```kotlin
@Module
class CounterScreenModule {
@Provides
@CounterScreenScope
fun provideCounterPresenter(counter: Counter): CounterPresenter {
return CounterPresenter(counter)
}
}
```
`CounterScreenModule` holds the provider method for our presenter. The method is annotated with `@CounterScreenScope` to indicate that we want to scope its lifetime to our screen. Rather than being an `object` like our `AppModule`, it's a `class` because we need to instantiate it manually later.
```kotlin
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
fun counterScreenComponent(counterScreenModule: CounterScreenModule): CounterScreenComponent
}
```
To our `AppComponent`, we've simply added a method to provide the `CounterScreenComponent`.
```kotlin
@CounterScreenScope
@Subcomponent(modules = [CounterScreenModule::class])
interface CounterScreenComponent {
fun inject(counterActivity: MainActivity)
}
```
`CounterScreenComponent` is a [Subcomponent](https://dagger.dev/api/latest/dagger/Subcomponent.html). In simple, OOP terms, it's a Component that inherits from another Component. A Subcomponent can only have one parent, and the Subcomponent doesn't get to pick who, much like real life :P
The parent Component is responsible for ensuring that all the dependencies of a Subcomponent are available, other than modules.
## Putting it all together
After setting up our Dagger graph, instantiating everything becomes pretty easy.
```kotlin
class MainActivity : AppCompatActivity() {
@Inject
lateinit var presenter: CounterPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appComponent = DaggerAppComponent.builder()
.appModule(AppModule())
.build()
val counterScreenComponent = appComponent
.counterScreenComponent(CounterScreenModule())
counterScreenComponent.inject(this)
Log.d(TAG, presenter.counter.name)
}
companion object {
private const val TAG = "MainActivity"
}
}
```
Thanks to how our graph is laid out, it is very easy to get subcomponent instances from our parent components.
## Alternative initialization
We can also use a `@Subcomponent.Factory` for `CounterScreenComponent` to initialize it in a fashion similar to our `AppComponent` from the previous part. The diff from this change goes something like this:
```diff
diff --git app/src/main/java/dev/msfjarvis/daggertutorial/MainActivity.kt app/src/main/java/dev/msfjarvis/daggertutorial/MainActivity.kt
index 4271d151da6e..425e8358902c 100644
--- app/src/main/java/dev/msfjarvis/daggertutorial/MainActivity.kt
+++ app/src/main/java/dev/msfjarvis/daggertutorial/MainActivity.kt
@@ -23,7 +23,8 @@ class MainActivity : AppCompatActivity() {
.build()
val counterScreenComponent = appComponent
- .counterScreenComponent(CounterScreenModule())
+ .counterScreenComponentFactory
+ .create(CounterScreenModule())
counterScreenComponent.inject(this)
Log.d(TAG, presenter.counter.name)
}
diff --git app/src/main/java/dev/msfjarvis/daggertutorial/di/AppComponent.kt app/src/main/java/dev/msfjarvis/daggertutorial/di/AppComponent.kt
index 2fb831771ee8..72acea6f6f43 100644
--- app/src/main/java/dev/msfjarvis/daggertutorial/di/AppComponent.kt
+++ app/src/main/java/dev/msfjarvis/daggertutorial/di/AppComponent.kt
@@ -1,5 +1,6 @@
package dev.msfjarvis.daggertutorial.di
+import dagger.BindsInstance
import dagger.Component
import dagger.Module
import dagger.Provides
@@ -28,12 +29,16 @@ class CounterScreenModule {
@Subcomponent(modules = [CounterScreenModule::class])
interface CounterScreenComponent {
fun inject(counterActivity: MainActivity)
+ @Subcomponent.Factory
+ interface Factory {
+ fun create(@BindsInstance counterScreenModule: CounterScreenModule): CounterScreenComponent
+ }
}
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
- fun counterScreenComponent(counterScreenModule: CounterScreenModule): CounterScreenComponent
+ val counterScreenComponentFactory: CounterScreenComponent.Factory
}
@Module
```
## Closing Notes
That's it for this tutorial! Scoping is a rather complex concept, and it took me a long (really, really long) time to grasp its concepts and put this together. Its perfectly fine to not understand it immediately, take your time, and refer to one of the reference articles that I used (listed below) to see if maybe their explanations work better for you. Dagger away!
### References
- [Dagger 2: Scopes and Subcomponents](https://medium.com/tompee/dagger-2-scopes-and-subcomponents-d54d58511781)
- [Dagger User's Guide](https://dagger.dev/users-guide)
- [Dependency injection with Dagger 2 - Custom scopes](https://mirekstanek.online/dependency-injection-with-dagger-2-custom-scopes/)

View File

@ -0,0 +1,57 @@
+++
categories = ["hugo", "github-actions"]
date = 2019-12-04
summary = "GitHub Actions are awesome! Learn how to use it for continuous delivery of your static sites."
slug = "deploying-hugo-sites-with-github-actions"
socialImage = "uploads/actions_social.webp"
tags = ["static sites"]
title = "Deploying Hugo sites with GitHub Actions"
+++
For the longest time, I have used the [caddy-git] middleware for [caddyserver](https://caddyserver.com) to constantly deploy my [Hugo](https://gohugo.io) site from [GitHub](https://github.com/msfjarvis/msfjarvis.dev).
But this approach had a few problems, notably force pushing (I know, shush) caused the repository to break because the plugin didn't support those. While not frequent, it was annoying enough to seek alternatives.
Enter [GitHub Actions](https://github.com/features/actions).
GitHub's in-built CI/CD solution is quite powerful and easily extensible. I decided to give it a shot and use it for automated deployments.
Now, my use case isn't the most straightforward. I maintain two sites out of the same source repository, one production site with all my published posts, and another with all my drafts enabled so I can check my WIP posts live to find any formatting mistakes I may have overlooked when writing through [Forestry](https://forestry.io) or a text editor. I am also in the habit of creating and fixing my own problems so I prefer self-hosted solutions as and when possible.
## Step 1 - Deployment
The first part of this endeavour involved finding a new way to move static assets to the server. I thought about emulating how [caddy-git] works and using `ssh` to do a pull-and-build on my server itself. Then I found [this](https://github.com/peaceiris/actions-hugo) action that allows me to install `hugo` in the container for the build. That's when I decided to do the building in the Actions pipeline and push built assets using `rsync`.
## Step 2 - Execution
To handle my two-sites-from-one-repo usecase, I setup a build staging -> publish staging -> build prod -> publish prod pipeline.
```yaml
- name: Build staging
run: hugo --minify -DEFb=https://staging.msfjarvis.dev
- name: Deploy to staging
run: source $GITHUB_WORKSPACE/ci/deploy.sh
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
SERVER_ADDRESS: ${{ secrets.SERVER_ADDRESS }}
SERVER_DESTINATION: ${{ secrets.SERVER_DESTINATION_STAGING }}
SSH_PORT: ${{ secrets.SSH_PORT }}
- name: Build prod
run: hugo --minify
- name: Deploy to prod
run: source $GITHUB_WORKSPACE/ci/deploy.sh
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
SSH_USERNAME: ${{ secrets.SSH_USERNAME }}
SERVER_ADDRESS: ${{ secrets.SERVER_ADDRESS }}
SERVER_DESTINATION: ${{ secrets.SERVER_DESTINATION_PROD }}
SSH_PORT: ${{ secrets.SSH_PORT }}
```
You can find the `ci/deploy.sh` script [here](https://github.com/msfjarvis/msfjarvis.dev/blob/src/ci/deploy.sh). It's a very basic script that sets up the SSH authentication and rsync's the built site over.
[caddy-git]: http://github.com/abiosoft/caddy-git

View File

@ -0,0 +1,74 @@
+++
categories = ["zig"]
date = 2021-05-14
summary = "I've decided to learn Zig, and here's how I'm preparing for it."
slug = "first-steps-with-zig"
tags = ["learn"]
title = "First steps with Zig"
+++
[Zig] is a systems programming language much akin to [Rust] and C, and has been showing up in my feeds a lot as of late. Many Zig programmers have [documented their experience with Zig] as much better than with Rust, which I have been programming in for the last year or so, citing simplicity and ease. I tend to agree that Rust can often be _complex_ to enforce the guarantee of being _correct_, so I set out to finally buy into the promise of Zig and give it a shot.
# Compiler and IDE setup
The [installing Zig] page recommends that while using the Zig stable releases is fine for evaluating it, their [stable release cadence] matches LLVM's ~6 months which means they are often rendered outdated by the fast pace of Zig development.
Since I wanted to stick with using [Nix] to manage my (currently) temporary Zig environment, I went with the stable 0.7.1 release available on nixpkgs.
A quick `nix-shell -p zig` later, I now had access to the Zig compiler.
```shell
➜ nix-shell -p zig
➜ zig version
0.7.1
```
To be able to use VSCode for writing Zig, I also installed the official [zls] language server for Zig. This did get me go-to-declaration support for the standard library, ~~but not syntax highlighting. I'm not sure if that's intended, or a bug with my local setup~~. Syntax highlighting is also present, thanks to Lewis Gaul for his suggestion of using the `tiehuis.zig` extension.
# Learning resources
The Zig team frankly admits that they do not yet have the resources to maintain extensive learning resources, but the Zig community has stepped forward to fill in those gaps. [ziglearn.org] is a great jumping off point for people who prefer to learn language basics directly, and there is a [rustlings] counterpart in [ziglings] for learning by looking at code.
On the official side of things, you get the [standard library reference] as one would expect, as well as a fairly detailed [language reference].
This is in contrast with Rust, which has an officially maintained [book] and maintains [rustlings] as a first-party learning resource. They do however are a significantly larger and older team, so maybe with sufficient funding we'll see Zig be able to devote effort towards this as well.
# Your first program
The `zig` CLI contains commands to generate new projects easily, so let's create a new binary project.
```
➜ zig init-exe
info: Created build.zig
info: Created src/main.zig
info: Next, try `zig build --help` or `zig build run`
```
The `build.zig` file appears to describe to the `zig` CLI how to build this program, and `src/main.zig` is our application code. Here's what `zig init-exe` gives you for a "hello world" program:
```zig
// src/main.zig
const std = @import("std");
pub fn main() anyerror!void {
std.log.info("All your codebase are belong to us.", .{});
}
```
Cheeky.
This post is just a brief overview of how I went about setting things up for learning Zig. I intend to post more detailed blogs as I progress :)
[zig]: https://ziglang.org
[rust]: https://rust-lang.org
[documented their experience with zig]: https://kevinlynagh.com/rust-zig/
[installing zig]: https://ziglang.org/learn/getting-started/#installing-zig
[stable release cadence]: https://ziglang.org/learn/getting-started/#tagged-release-or-nightly-build
[nix]: https://nixos.org/
[zls]: https://github.com/zigtools/zls
[ziglearn.org]: https://ziglearn.org/
[rustlings]: https://github.com/rust-lang/rustlings
[ziglings]: https://github.com/ratfactor/ziglings
[standard library reference]: https://ziglang.org/documentation/0.7.1/std/
[language reference]: https://ziglang.org/documentation/0.7.1/
[book]: https://doc.rust-lang.org/book/

View File

@ -0,0 +1,58 @@
+++
categories = ["webdev"]
date = 2020-05-08
summary = "Everybody probably understands how Cloudflare proxies A/AAAA records, but how it proxies CNAME records is also pretty interesting. Let's dive into how that happens and why it can often break other products that need you to set CNAME records."
slug = "how-cloudflare-proxies-cname-records"
socialImage = "uploads/cf_proxy_social.webp"
tags = ["cloudflare"]
title = "How Cloudflare proxies CNAME records"
+++
As people who've read my previous post would know, I recently started using [Purelymail](https://purelymail.com/) for my email needs (the how and why of it can be found [here](/posts/switching-my-email-to-purelymail/)). I also mentioned there, that Cloudflare's proxy-by-default nature caused Purelymail to not detect my CNAME settings and disabling the proxy did the job. I contacted Purelymail's Scott about this and he eventually pushed a fix out that \*should\* have fixed it, but since he did not have a Cloudflare account, he couldn't verify this exact case.
Well, the fix didn't work.
This made me wonder, _why?_ I trust that Scott is more aware of what he's doing than I am so the fix must have been legitimate and that something is special about Cloudflare's handling of this. So I did some testing! (yes I still use [dnscontrol](https://stackexchange.github.io/dnscontrol/))
```diff
diff --git a/dnsconfig.js b/dnsconfig.js
index f5fd1836f8ec..a53bab70de84 100644
--- a/dnsconfig.js
+++ b/dnsconfig.js
@@ -24,6 +24,8 @@ var DEV_RECORDS = [
CNAME('purelymail2._domainkey', 'key2._dkimroot.purelymail.com.', CF_PROXY_OFF),
CNAME('purelymail3._domainkey', 'key3._dkimroot.purelymail.com.', CF_PROXY_OFF),
CNAME('status', 'stats.uptimerobot.com.', CF_PROXY_OFF),
+ CNAME('test_domain_no_proxy', 'msfjarvis.github.io.', CF_PROXY_OFF),
+ CNAME('test_domain_with_proxy', 'msfjarvis.github.io.'),
MX('@', 50, 'mailserver.purelymail.com.'),
TXT('@', 'v=spf1 include:_spf.purelymail.com ~all'),
TXT('@', 'purelymail_ownership_proof=0xd34db33f'),
```
Running [dig](https://linux.die.net/man/1/dig) on both the subdomains, I spotted something interesting.
```bash
$ dig @1.1.1.1 test_domain_no_proxy.msfjarvis.dev
...
;; ANSWER SECTION:
test_domain_no_proxy.msfjarvis.dev. 289 IN CNAME msfjarvis.github.io.
msfjarvis.github.io. 3589 IN A 185.199.109.153
msfjarvis.github.io. 3589 IN A 185.199.111.153
msfjarvis.github.io. 3589 IN A 185.199.108.153
msfjarvis.github.io. 3589 IN A 185.199.110.153
...
```
```bash
$ dig @1.1.1.1 test_domain_with_proxy.msfjarvis.dev
...
;; ANSWER SECTION:
test_domain_with_proxy.msfjarvis.dev. 300 IN A 104.28.14.93
test_domain_with_proxy.msfjarvis.dev. 300 IN A 104.28.15.93
...
```
The proxied CNAME record isn't actually a CNAME after all! Cloudflare creates an A record for it and handles the redirection internally. This makes the CNAME aspect of the record opaque to DNS lookups which in turn trips software like Purelymail's backend. I've reported my findings to Scott and am awaiting his response.
And that's it! Nothing too fancy, just something I found kinda weird.

View File

@ -0,0 +1,117 @@
+++
categories = ["git"]
date = 2021-08-14
summary = "Everyone uses Git their way. This is how I do it."
draft = true
slug = "how-i-use-git"
tags = ["developer workflow"]
title = "How I use Git"
+++
Every developer ends up using Git in some way or another these days, whether through the good old CLI or various Git GUI clients or the integrated options in their favorite IDEs. Because there are a myriad ways to use Git, and practically infinite extensibility, everyone internalizes patterns around how they work with Git. A favorite way of merging, a preferred pull strategy, a bunch of shell aliases to save keystrokes, and so on and so forth.
Over time I have also developed habits and patterns, augmented by features present within Git itself as well as external tools that integrate with Git.
This post is going to be a overview of the tools I use with Git, and by extension GitHub, to make my daily workflow more productive.
## `.gitconfig`
The `.gitconfig` file is essentially the backbone of Git customisation. Any Git-specific setting will reside in one of these config files.
> I say _files_, because Git includes a hierarchy of how Git settings take effect. Within a repository, settings are first looked up in `.git/config`, and then in `$HOME/.gitconfig` which allows having per-repository settings as necessary.
My `.gitconfig` file can be found in my dotfiles [here][1]. Most of the settings keys are self-explanatory, the rest I'll go over below.
- `core.pager` / `interactive.difffilter` switch my `git diff` and `git add --patch` views to use [diff-so-fancy][2].
![diff-so-fancy rendering the diff of a commit][3]
- `pretty.fixes` adds a ['pretty'][10] format called `fixes` which lists commits in the style that is used by the Linux kernel developers to link to the commits which introduced the bug they're fixing in their current commit. It adds a chain of historical reference to identify common bug patterns that are repeatedly occurring, which can then allow teams to devise ways of avoiding them.
```
➜ git log --pretty=fixes
Fixes: 689a369a3a3d ("Upgrade ConstraintLayout, Material and Timber (#1484)")
Fixes: a82f8dda8607 ("Disable explicit API for tests (#1483)")
Fixes: 70137f31917b ("gradle: switch to our fork of preference testing library (#1481)")
Fixes: 1738364d2fdb ("Make password generator parameter changes reactive (#1480)")
```
- `alias.branches` defines a subcommand that lists all remote branches in order of their last updates. This provides an easy overview of the status of your project's branches.
```
➜ git branches
70 minutes ago fork/develop
70 minutes ago origin/HEAD
70 minutes ago origin/develop
3 days ago origin/release-1.13
5 days ago origin/compose-decrypt-screen
12 days ago fork/migrate-to-kotest
2 weeks ago origin/import-keys
4 weeks ago fork/storage-refactor
8 months ago origin/api_30_support
10 months ago origin/release
```
From this overview you can see that the `develop` branch of my fork is synced with the main APS repo, a release was made 3 days ago, and I was trying out Jetpack Compose 5 days ago for one of the app's screens.
- `log.follow` will track files through renames, relying on Git's [in-built rename detection][11] that it also uses for `git cherry-pick` and `git merge`.
```
# Without `log.follow`
➜ git log --stat 3.txt
commit 4f7bfdf35c1e544b1858e40fabfb26e33a91fde0 (HEAD -> main)
...
3.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
# With `log.follow`
➜ git log --stat 3.txt
commit 4f7bfdf35c1e544b1858e40fabfb26e33a91fde0 (HEAD -> main)
...
2.txt => 3.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
commit 62a050ddbbad87a0a8317db55dc1121679818825
...
1.txt => 2.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
commit 005e734a0018b2e8415d2be051c4e2b18e5feee3
...
1.txt | 1 +
1 file changed, 1 insertion(+)
```
## `hub`
Before GitHub had the [GitHub CLI][4], it had [hub][5]. `hub` wraps `git` and adds a bunch of extra niceties on top such as being able to do `git clone <repo>` to clone any of your own repositories. The one that I still use though, is `hub sync`, which fast-forwards all local checkouts of remote branches to the latest state on the remote.
{{< asciinema oHZZ68hPpZdcTmiyI9n9k2XRF >}}
## `git-absorb`
[`git-absorb`][6] is a Git extension that mimics Mercurial's [`hg absorb`][7] extension, which inspects the currently staged changes and tries to look through your recent commits to determine which of them should your changes be amended to. More information on this can be found [here][8]
// Add asciinema recording
## git-quickfix
[`git-quickfix`][9] is another Git extension, which allows moving commits to a new branch quickly. The most common use case for it is this: Imagine you're working on a feature branch, and notice a small problem that is unrelated to your current branch. `git-quickfix` would allow you to make a commit on your current branch, then _move it to a new branch_ in just one command.
// Add asciinema recording
## `gh`
[`gh`][4] is GitHub's very own CLI for interacting with their platform. Since my day-to-day work revolves around GitHub, `gh` is extremely helpful is being able to triage issues, raise PRs, view the status of CI jobs and much more. Definitely a must-have if you're a terminal fiend and use GitHub!
[1]: https://msfjarvis.dev/g/dotfiles
[2]: https://github.com/so-fancy/diff-so-fancy
[3]: /uploads/diff-so-fancy-screenshot.webp
[4]: https://cli.github.com/
[5]: https://hub.github.com/
[6]: https://github.com/tummychow/git-absorb
[7]: https://www.mercurial-scm.org/wiki/Release4.8
[8]: https://gregoryszorc.com/blog/2018/11/05/absorbing-commit-changes-in-mercurial-4.8/
[9]: https://github.com/siedentop/git-quickfix
[10]: https://git-scm.com/docs/pretty-formats
[11]: https://git-scm.com/docs/gitdiffcore#_diffcore_rename_for_detecting_renames_and_copies

View File

@ -0,0 +1,29 @@
+++
categories = ["open source"]
date = 2019-05-31
summary = "Starting with OSS can be daunting for many. Here's a recap of my experiences with OSS with some tips on how to get started yourself."
devLink = "https://dev.to/msfjarvis/how-to-get-involved-with-open-source-4h42"
tags = ["oss"]
title = "How to get involved in open source"
slug = "how-to-get-involved-in-open-source"
+++
The most common question I get when I recommend open source as a launching pad for budding developers is "Where do I start?".
The answer: _anywhere!_
There's a plethora of open source software out there, and not everybody needs to have an encyclopaedic knowledge of the codebase to contribute. You can contribute small things like [fixing dead links in the README](https://github.com/portainer/portainer/commit/173c673d37ea2e4bb82d159b601e60109a435601) to [resolving trivial compilation warnings](https://github.com/mozilla-mobile/fenix/commits/master?author=msfjarvis) to simply [tweaking an issue template](https://github.com/opengapps/opengapps/commits/master/.github/ISSUE_TEMPLATE.md).
The reason I'm linking my own commits is because I want to let people know that the guy helming a [theme engine](https://github.com/substratum) is also out of his element at times and there's no shame in admitting it :)
Thanks to the adoption of specs like [all-contributors](https://allcontributors.org), OSS is more friendly and welcoming than ever. Contribute literally **anything** to a project you use and scale up from there.
Remember: You _will_ make mistakes in the process. Don't give up! There's always a project looking for any kind of help it can get. Start your search at home -- See what apps and desktop software you use that's open source, and if that's something you'd like to give back to or even fix something in, even if it's driven by the need to enhance your experience than your goodwill. Linus Torvalds, the creator of Linux [famously said](https://www.bbc.com/news/technology-18419231) this:
> I do not see open source as some big goody-goody "let's all sing kumbaya around the campfire and make the world a better place". No, open source only really works if everybody is contributing for their own selfish reasons.
And it's true! Most apps I contribute to right now, like [AdAway](https://github.com/AdAway/AdAway) and [Android Password Store](https://github.com/zeapo/Android-Password-Store), began as a manifestation of personal annoyance. I found things to be lacking, and decided to address it. In the end that benefitted both me and the project.
In conclusion, I'd like to reiterate this -- Contributing **anything** is contributing!
P.S. It's okay to be nervous about it. I spent two weeks researching SSL before submitting a simple null check to Google's [conscrypt](https://github.com/google/conscrypt/pull/471) library :P

View File

@ -0,0 +1,9 @@
+++
categories = []
date = 2019-05-30
slug = "i-m-gonna-blog"
tags = []
title = "I'm gonna blog!"
+++
With all my involvement in OSS development around Android, I come across a lot of new things on the daily. This blog will hopefully serve as a index for those findings, and an excuse for me to properly research and document them for myself and others.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -0,0 +1,315 @@
---
title: Improving dependency sync speeds for your Gradle project
date: 2024-03-30T21:43:07.031Z
summary: Waiting for Gradle to download dependencies is so 2023.
socialImage: "uploads/gradle-social.webp"
categories:
- gradle
tags:
- gradle
- kotlin-multiplatform
- perf
---
Android developers are intimately familiar with the ritual of staring at your IDE for tens of minutes while Gradle imports a new project before they can start working on it. While not fully avoidable, there are many ways to improve the situation. For small to medium projects, the time spent on this import phase can be largely dominated by dependency downloads.
## Preface
This post is going to assume some things about you and your project, but you should be fine even if these aren't true for you.
- You're somewhat comfortable mucking around with Gradle
- Your project is using Gradle 8.7, the latest as of writing
If you're stuck on a lower version of Gradle, you will hit [this bug] with the code samples in the post. Replacing all calls to `includeGroupAndSubgroups` with `includeGroupByRegex` can let you work around it temporarily (Note the addition of the `.*` at the end):
```diff
- includeGroupAndSubgroups("com.example")
+ includeGroupByRegex("com.example.*")
```
## Obtaining a baseline
To get an idea for how long it actually takes your project to fetch its dependencies and to establish a baseline to compare improvements again, we can leverage Android Studio's relatively new [Downloads Info] view to see how many network requests are being made and how many of those are failing and contributing to our slower build. Gradle has a `--refresh-dependencies` flag which ignores its existing cache of downloaded dependencies and redownloads them from the remote repositories which will allow us to get consistent results, barring network and disk fluctuations.
In Android Studio, create a new run configuration for Gradle's in-built `dependencies` task that will resolve all configurations and give us a more representative number. The `--refresh-dependencies` flag will force a full re-download to ensure caches do not affect our benchmarks:
{{< figure src="run-configuration.webp" title="The Android Studio Run configuration window configured with the task ':android:dependencies --refresh-dependencies'" >}}
When you run this task, you'll see the Build tool window at the bottom get populated with logs of Gradle downloading dependencies and the Downloads info tab will start accumulating the statistics for it.
{{< figure src="download-info.webp" title="Download info window showing a list of network requests and their sources while the task is running" >}}
## How Gradle fetches your dependencies
The Gradle documentation for [dependency resolution] explains in some depth how the version conflict resolution and caching systems work, but that's pretty jargon-heavy and too much of a detour from what we're really here to do so I'll just Spark Notes™ it and move on to more fun stuff.
- Gradle requires declaring **repositories** where dependencies are fetched from.
- Dependencies are looked up in each repository, **in declaration order**, until they are found in one.
- Gradle makes a lot of network requests as part of this lookup, and it is in our interest to reduce them.
## A quick attempt at optimisation
In the previous section I started off by mentioning **repositories**, which define _where_ Gradle will look for dependencies. The repositories setup for a typical Android project might look something like this:
```kotlin
// settings.gradle.kts
pluginManagement {
repositories {
mavenCentral()
google()
}
}
dependencyResolutionManagement {
repositories {
maven("https://jitpack.io") { name = "JitPack" }
google()
mavenCentral()
maven("https://oss.sonatype.org/content/repositories/snapshots/") {
name = "Sonatype snapshots
}
}
}
```
This tells Gradle that you want plugin dependencies to be looked up from [Maven Central] and [gMaven], and for all other dependencies to come from [JitPack], [gMaven], [Maven Central], or the [Maven Central snapshots] repository; **in that order**. The first simple tweak you can make is to reorder these based on how many of your dependencies you expect to come from what repository.
For example, in a typical Android build most of your plugin classpath will be dominated by the Android Gradle Plugin (AGP), so you'd want gMaven to be come first so that Gradle does not waste time trying to find AGP on Maven Central.
```diff
pluginManagement {
repositories {
- mavenCentral()
google()
+ mavenCentral()
}
}
```
For the `dependencyResolutionManagement` block, JitPack is very likely to only host one or two of the dependencies you require, while most of them will be coming from gMaven and Maven Central, so shifting JitPack to the very end will significantly reduce the number of failed requests.
```diff
dependencyResolutionManagement {
repositories {
- maven("https://jitpack.io") { name = "JitPack" }
google()
mavenCentral()
+ maven("https://jitpack.io") { name = "JitPack" }
maven("https://oss.sonatype.org/content/repositories/snapshots/") {
name = "Sonatype snapshots
}
}
}
```
## Going for zero
With the minor changes made above we have already significantly improved on our failed requests metric, but why stop at good when we can have _perfect_.
Gradle's repositories APIs also support the notion of specifying the expected "contents" of individual repositories, which tells Gradle what groups of dependencies are supposed to be available in what repositories. This allows it to prevent redundant network requests and significantly boosts sync performance.
These filters can be of two types:
- Declaring that certain artifacts can _only_ be resolved from certain repositories: [`exclusiveContent`]
- Declaring that a repository _only_ contains certain artifacts: [`content`]
The difference is subtle, but should become clearer shortly as we start hacking on our setup.
For our plugins block, we want only gMaven to supply AGP and everything else can come from Maven Central. Here's how to achieve that:
```diff
// settings.gradle.kts
pluginManagement {
repositories {
- google()
+ exclusiveContent { // First type of filter
+ forRepository { google() } // Specify the repository this applies to
+ filter { // Start specifying what dependencies are *only* found in this repo
+ includeGroupAndSubgroups("androidx")
+ includeGroupAndSubgroups("com.android")
+ includeGroup("com.google.testing.platform")
+ }
+ }
mavenCentral()
}
}
```
For other dependencies that are governed by the `dependencyResolutionManagement` block, the setup is similar. To demonstrate the usage of the second kind of filter, we're introducing an additional constraint: assume the build relies on the [Jetpack Compose Compiler], and we go back and forth between stable and pre-release builds of it. The pre-release builds can only be obtained from [androidx.dev], while the stable builds only exist on [gMaven]. If we tried to use `exclusiveContent` here, it would make Gradle only check one of the declared repositories for the artifact and fail if it doesn't find it there. To allow this fallback, we instead use a `content` filter as follows.
```diff
dependencyResolutionManagement {
repositories {
- google()
+ google {
+ content {
+ includeGroupAndSubgroups("androidx")
+ includeGroupAndSubgroups("com.android")
+ includeGroupAndSubgroups("com.google")
+ }
+ }
+ maven("https://androidx.dev/storage/compose-compiler/repository") {
+ name = "Compose Compiler Snapshots"
+ content { includeGroup("androidx.compose.compiler") }
+ }
mavenCentral()
maven("https://jitpack.io") { name = "JitPack" }
maven("https://oss.sonatype.org/content/repositories/snapshots/") {
name = "Sonatype snapshots
}
}
}
```
This setup tells Gradle the specific artifacts present in these repositories but does not enforce any restrictions on which repository said artifacts can come from. Now, if I use a pre-release version of the Compose Compiler, Gradle will first try to look it up in [gMaven] and then fall back to the `androidx.dev` repository.
In the above example we also see [JitPack] being mentioned, which we only wish to use for a specific dependency that's unavailable elsewhere. The [`exclusiveContent`] filter is precisely for this use case:
```diff
dependencyResolutionManagement {
repositories {
google {
content {
includeGroupAndSubgroups("androidx")
includeGroupAndSubgroups("com.android")
includeGroupAndSubgroups("com.google")
}
}
maven("https://androidx.dev/storage/compose-compiler/repository") {
name = "Compose Compiler Snapshots"
content { includeGroup("androidx.compose.compiler") }
}
mavenCentral()
- maven("https://jitpack.io") { name = "JitPack" }
+ exclusiveContent {
+ forRepository { maven("https://jitpack.io") { name = "JitPack" } }
+ filter { includeGroup("com.github.requery") }
+ }
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
```
The Sonatype OSS snapshots repository is only intended to be used for snapshot releases of dependencies we'd otherwise source from Maven Central, so we can indicate to Gradle to only search for snapshots in there with a [`mavenContent`] directive:
```diff
dependencyResolutionManagement {
repositories {
google {
content {
includeGroupAndSubgroups("androidx")
includeGroupAndSubgroups("com.android")
includeGroupAndSubgroups("com.google")
}
}
maven("https://androidx.dev/storage/compose-compiler/repository") {
name = "Compose Compiler Snapshots"
content { includeGroup("androidx.compose.compiler") }
}
mavenCentral()
maven("https://jitpack.io")
exclusiveContent {
forRepository { maven("https://jitpack.io") { name = "JitPack" } }
filter { includeGroup("com.github.requery") }
}
maven("https://oss.sonatype.org/content/repositories/snapshots/") {
name = "Sonatype Snapshots"
+ mavenContent {
+ snapshotsOnly()
+ }
}
}
}
```
### Bonus section: Kotlin Multiplatform
If you're working with Kotlin Multiplatform, these directions will sadly not cover all the dependencies being fetched during your build. There's a YouTrack issue ([KT-51379]) that you can subscribe to for updates on this, but in the mean time here's the missing bits:
```kotlin
dependencyResolutionManagement {
repositories {
// workaround for https://youtrack.jetbrains.com/issue/KT-51379
exclusiveContent {
forRepository {
ivy("https://download.jetbrains.com/kotlin/native/builds") {
name = "Kotlin Native"
patternLayout {
listOf(
"macos-x86_64",
"macos-aarch64",
"osx-x86_64",
"osx-aarch64",
"linux-x86_64",
"windows-x86_64",
)
.forEach { os ->
listOf("dev", "releases").forEach { stage ->
artifact("$stage/[revision]/$os/[artifact]-[revision].[ext]")
}
}
}
metadataSources { artifact() }
}
}
filter { includeModuleByRegex(".*", ".*kotlin-native-prebuilt.*") }
}
exclusiveContent {
forRepository {
ivy("https://nodejs.org/dist/") {
name = "Node Distributions at $url"
patternLayout { artifact("v[revision]/[artifact](-v[revision]-[classifier]).[ext]") }
metadataSources { artifact() }
content { includeModule("org.nodejs", "node") }
}
}
filter { includeGroup("org.nodejs") }
}
exclusiveContent {
forRepository {
ivy("https://github.com/yarnpkg/yarn/releases/download") {
name = "Yarn Distributions at $url"
patternLayout { artifact("v[revision]/[artifact](-v[revision]).[ext]") }
metadataSources { artifact() }
content { includeModule("com.yarnpkg", "yarn") }
}
}
filter { includeGroup("com.yarnpkg") }
}
}
}
```
If you're not using a JavaScript target in your project, it should be safe to skip the NodeJS and Yarn repositories but it's probably easier to keep it configured ahead of time in case you adopt JavaScript in the future.
## Conclusion
The exact percentage improvement you can expect can vary depending on how many dependencies you have as well as how many repositories were previously declared and in what order, but you should most definitely see a noticeable difference consistently. These are the before and after numbers for a project I optimised for my day job.
### Before
{{< figure src="before-fixes.webp" title="The Android Studio Dependency Sync window, showing a total sync duration of 5 minutes and 56 seconds of which 1 minute and 30 seconds went into failed network requests" >}}
### After
{{< figure src="after-fixes.webp" title="The Android Studio Dependency Sync window, now showing the total sync taking only 3 minutes and 17 seconds with 0 failed requests" >}}
Like and subscribe, and hit that notification bell so you don't miss my next post some time within this decade (hopefully).
[downloads info]: https://developer.android.com/studio/releases/past-releases/as-giraffe-release-notes#download-info-sync
[pom]: https://maven.apache.org/pom.html
[gradle module metadata]: https://docs.gradle.org/current/userguide/publishing_gradle_module_metadata.html
[dependency resolution]: https://docs.gradle.org/current/userguide/dependency_resolution.html#sec:how-gradle-downloads-deps
[configurations]: https://docs.gradle.org/current/userguide/declaring_dependencies.html
[version catalog]: https://docs.gradle.org/current/userguide/platforms.html#sub:central-declaration-of-dependencies
[maven central]: https://repo1.maven.org/maven2/
[maven central snapshots]: https://oss.sonatype.org/content/repositories/snapshots/com/squareup/sqldelight/
[gMaven]: https://maven.google.com/web/index.html
[jitpack]: https://jitpack.io
[jetpack compose compiler]: https://developer.android.com/jetpack/androidx/releases/compose-compiler
[`content`]: https://docs.gradle.org/current/kotlin-dsl/gradle/org.gradle.api.artifacts.repositories/-artifact-repository/content.html?query=abstract%20fun%20content(configureAction:%20Action%3Cout%20Any%3E)
[`mavencontent`]: https://docs.gradle.org/current/kotlin-dsl/gradle/org.gradle.api.artifacts.repositories/-maven-artifact-repository/maven-content.html?query=abstract%20fun%20mavenContent(configureAction:%20Action%3Cout%20Any%3E)
[`exclusivecontent`]: https://docs.gradle.org/current/kotlin-dsl/gradle/org.gradle.api.artifacts.dsl/-repository-handler/exclusive-content.html?query=abstract%20fun%20exclusiveContent(action:%20Action%3Cout%20Any%3E)
[KT-51379]: https://youtrack.jetbrains.com/issue/KT-51379
[androidx.dev]: https://androidx.dev/storage/compose-compiler/repository
[this bug]: https://github.com/gradle/gradle/issues/26569

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,53 @@
+++
categories = ["hugo", "webdev"]
date = 2020-01-20
summary = "Adding additional comment backends to Hugo is actually rather simple!"
devLink = "https://dev.to/msfjarvis/integrating-comments-in-hugo-sites-with-commento-136f"
slug = "integrating-comments-in-hugo-sites-with-commento"
socialImage = "uploads/commento_social.webp"
tags = ["static sites", "comments", "commento.io"]
title = "Integrating comments in Hugo sites with commento"
+++
Disqus is unequivocally the leader when it comes to hosted comments, and it works rather swimmingly with sites of all kinds with minimal hassle. But this ease has a gnarly flipside: [annoying referral links](https://stiobhart.net/2017-02-21-disqusting/) and a [huge bundle size](https://victorzhou.com/blog/replacing-disqus/) that significantly affects page load speeds.
As I was considering adding comments to this blog, I went through these posts and realised that Disqus is not going to be satisfactory enough, especially after the time and effort I put into improving bundle sizes and page loading. I started looking into the alternatives, and shortlisted [Isso](https://posativ.org/isso) and [Commento](https://commento.io/). Going through Isso documentation and [this post](https://stiobhart.net/2017-02-24-isso-comments/) it was clear that setup was going to be a bit of a chore, and that was the end of it.
Commento is open source just like Isso, but has a cloud-hosted option. I was interested in self-hosting, though, and I was glad to find that Commento delivered very well on that front too. [docker-compose](https://docs.commento.io/installation/self-hosting/on-your-server/docker.html#with-docker-compose) is an officially supported deployment method and I was pleased to see that setup went forward without a problem.
## Integrating with Hugo
The interesting part! Hugo offers a Disqus template internally, but any other comment system's going to need some legwork done. Commento's integration code is just two lines, as you can see below.
```html
<div id="commento"></div>
<script defer src="https://commento.example.com/js/commento.js"></script>
```
Hugo offers a powerful tool called [partials](https://gohugo.io/templates/partials/#use-partials-in-your-templates) that allows injecting code into pages from another HTML file. I quickly created a partial with the integration code, scoped out the domain with a variable, and ended up with this.
```html
<div id="commento"></div>
<script defer src="{{ .Site.Params.CommentoURL }}/js/commento.js"></script>
<noscript>Please enable JavaScript to load the comments.</noscript>
```
With this saved as `layouts/partials/commento.html` and `CommentoURL` set in my `config.toml`, I set out to wire this into the posts. Because of a [pre-existing hack](https://github.com/msfjarvis/msfjarvis.dev/commit/5447bb36258934d6a5bc86be99ef91a9eeb9eb17) that I use for linkifying headings, I already had the `single.html` file from my theme copied into `layouts/_default/single.html`. If you don't, copy it over and open it. Add the following lines, removing any mention of Disqus if you find it.
```go
{{ if and .Site.Params.CommentoURL (and (not .Site.BuildDrafts) (not .Site.IsServer)) -}}
<h2>Comments</h2>
{{ partial "commento.html" . }}
{{- end }}
```
With this, the comments section is only loaded when CommentoURL is defined, and the site is not running in server mode. This allows me to exclude showing comments when using the preview server on [Forestry](https://forestry.io) (highly recommended CMS for Hugo, by far my personal favorite). Since I also have a copy of my site with drafts enabled hosted on a separate subdomain, I had to factor that into the partial as well. Here's what I deploy on my own website.
```go
{{ if and .Site.Params.CommentoURL (and (not .Site.BuildDrafts) (not .Site.IsServer)) -}}
<!-- Rest is identical to the previous -->
```
And that's it! Now you should have a fully functioning comment system on your static sites that does not bloat the bundle size unnecessarily.
P.S. If anybody's interested to have me cover the template language for Hugo (conditionals, loops and the like), put it down in the comments :P

View File

@ -0,0 +1,147 @@
+++
categories = ["zig"]
date = 2021-05-15
summary = "Onwards in our quest to learn Zig"
slug = "learning-zig--day-2"
tags = ["learn"]
title = "Learning Zig - Day 2"
+++
In the [previous post] I documented how I went about setting up my Zig environment, and it's now time to start learning things.
My preferred method of learning new languages is rebuilding an existing project in them, like I did when going from [Python] to [Kotlin] to [Rust]. For Zig, I've elected to rebuild my [healthchecks-rs] library. It's something I use on a day-to-day basis for keeping an eye on my backup jobs, and it would be a great addition to the [healthchecks.io ecosystem].
# Getting the basics down
Among the resources enlisted on the Zig [getting started] page, I opted to go with [ziglearn.org] for learning the ropes of the language. It is concise yet detailed, and the chapter-wise breakdown makes for great mental "checkpoints", much like the [Rust book].
For this post I'm going through [chapter 1].
# Thoughts™
I'm going to use this section to jot down my thoughts about Zig, broken down by the sections on ZigLearn. I'll skip the parts that I don't have anything to say on.
## Assignment
The presence of `undefined` is _very_ interesting to me. It appears to be functionally identical to Rust's [Default trait], as shown in this snippet (had to skip to structs for this since I was so curious about it).
```zig
const std = @import("std");
const Vec3 = struct {
x: f32,
y: f32,
z: f32,
};
pub fn main() void {
const inferred_constant: Vec3 = undefined;
std.debug.print("Hello, {d}!\n", .{inferred_constant});
}
```
which prints:
```
➜ zig build run
Hello, Vec3{ .x = 0, .y = 0, .z = 0 }!
```
I have clearly not gotten very far yet, but initial thoughts here: Rust's trait-based implementation means I can customize the "default" values for my structs, which I'm not seeing in this implicit coercion yet. Guess we'll find out soon whether or not this can be handled explicitly :D
## Arrays
The syntax for array declarations is quite clear and explicit, which I like. Notably, while you can do this:
```zig
const implicitly_sized_array = [_]u8{}; // _ means "infer the size"
```
you cannot have an inferred size reference as the type:
```zig
const implicitly_sized_array[_]u8 = {};
```
Rust also [disallows this](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=f27a1a0b20feebe3e6d0a3417f25ce45), but the error is surprisingly worse than with Zig. Rust's resident diagnostics magician Esteban [assures me](https://twitter.com/ekuber/status/1393566561005314048) this is a regression and is being tracked.
The only problem I encountered here was that I can't figure out how to print an array!
```zig
const implicitly_sized_array = [_]u8{0, 1, 2, 3};
std.debug.print("This is an array: {}\n", .{implicitly_sized_array});
// Outputs: "This is an array: "
```
I found a [PR that overhauls formatting] but nothing there gave me any pointers on why my code doesn't work. Hopefully this'll get cleared up later.
## If
Nothing special here, aside from the early introduction to testing, which is slightly more pleasant than with Rust. I do however have qualms about the test output, which is unnecessarily noisy:
```shell
Test [2/2] test "while with continue expression"... expected 2080, found 10
/nix/store/nhd75c4sr3l9wlaspilkwawx5ixkn74w-zig-0.7.1/lib/zig/std/testing.zig:74:32: 0x206f9a in std.testing.expectEqual (test)
std.debug.panic("expected {}, found {}", .{ expected, actual });
^
/home/msfjarvis/git-repos/zig-playground/src/main.zig:29:24: 0x205abd in test "while with continue expression" (test)
testing.expectEqual(sum, 10);
^
/nix/store/nhd75c4sr3l9wlaspilkwawx5ixkn74w-zig-0.7.1/lib/zig/std/special/test_runner.zig:61:28: 0x22e161 in std.special.main (test)
} else test_fn.func();
^
/nix/store/nhd75c4sr3l9wlaspilkwawx5ixkn74w-zig-0.7.1/lib/zig/std/start.zig:334:37: 0x20749d in std.start.posixCallMainAndExit (test)
const result = root.main() catch |err| {
^
/nix/store/nhd75c4sr3l9wlaspilkwawx5ixkn74w-zig-0.7.1/lib/zig/std/start.zig:162:5: 0x2071d2 in std.start._start (test)
@call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
^
error: the following test command crashed:
./src/zig-cache/o/5a647f3d3394214b30b3861a6b0ffbbb/test
```
## Defer
The `defer` language feature is something I've always been curious about since seeing it in Go, so I'm excited to discover use-cases for it when I finally have it available. Through ZigLearn I discovered that `defer` calls can be stacked to be executed in LIFO order, and Golang does it in the exact same fashion.
## Errors
I like how easy it is to define errors, but the syntax feels kinda icky. Having each error enum I declare 'magically' become a property on the `error` keyword doesn't sit right with me :(
```zig
const NumericError = error{};
fn mayError(shouldError: bool) anyerror!u32 {
return if (shouldError)
// This is different from what I'm accustomed to as a user of
// Either/Result type monads.
error.NumericError
else
10;
}
```
## Runtime Safety
Being able to turn off runtime safety features (like bounds checking) in specific blocks is pretty interesting! Not sure if I'll ever have a valid use for it though...
# Conclusion
I like most of what I've seen so far in Zig. Aside from the issues I mentioned above, the lack of string type is a very confusing thing for me. I've kinda come to expect it everywhere based on my previous experiences with Python, Java, Kotlin, and Rust; but maybe I'll now learn to appreciate how every character on my screen is just numbers :D.
I was very easily distracted today, so I only made it a third of the way in 3 hours for a chapter that is supposed to take 1 hour for the whole thing. Hoping to finish it tomorrow!
[previous post]: /posts/first-steps-with-zig
[python]: https://msfjarvis.dev/g/walls-manager
[kotlin]: https://msfjarvis.dev/g/walls-bot
[rust]: https://msfjarvis.dev/g/walls-bot-rs
[healthchecks-rs]: https://msfjarvis.dev/g/healthchecks-rs
[healthchecks.io ecosystem]: https://healthchecks.io/docs/resources/
[getting started]: https://ziglang.org/learn/getting-started/
[ziglearn.org]: https://ziglearn.org/
[rust book]: https://doc.rust-lang.org/book/
[chapter 1]: https://ziglearn.org/chapter-1/
[default trait]: https://doc.rust-lang.org/std/default/trait.Default.html
[pr that overhauls formatting]: https://github.com/ziglang/zig/pull/6870
[`unreachable`]: https://ziglearn.org/chapter-1/#unreachable

View File

@ -0,0 +1,117 @@
+++
categories = ["zig"]
date = 2021-05-16
summary = "Finishing up the basics"
slug = "learning-zig--day-3"
tags = ["learn"]
title = "Learning Zig - Day 3"
+++
[Yesterday's post] was a bit shorter than I planned, since I didn't manage to go through as much of the ZigLearn [chapter 1] as I thought I would. Today we'll be wrapping it up.
# Thoughts™
Same as yesterday, this section will be a brain dump of what I think of the things I learn today.
## Pointers
Rust made pointers a very friendly concept thanks to the borrow checker and amazing compiler diagnostics, and Zig seems to follow the same path with keeping them straightforward. I'm not the biggest fan of the `variable.*` syntax for dereferencing a pointer, since it breaks my existing muscle memory in a major way but I'm sure I'll get used to it in no time.
Just like Rust, mutable and immutable pointers are explicitly distinct which is a ✅ in my book.
There wasn't a lot of content on ZigLearn about [many-item pointers] so I'm still not sure I understand any of it. That's probably just me though.
I've known and used Rust's `usize` in my programs, but only after reading about [pointer-sized integers] on ZigLearn did I actually make the connection that the size of a `usize` is that of a pointer. 💡
## Enums
On a syntactic level, Zig enums are closer to Kotlin than to Rust w.r.t. declaring functions in them, which is very nice.
## Structs
The syntax note from enums applies here as well, with an additional nicety about pointers. Specifically, a struct function that accepts a pointer value will automatically dereference the value inside the function body. This only goes one level deep though, so keep that in mind.
```zig
const Rectangle = struct {
length: i32,
width: i32,
pub fn swap(self: *Rectangle) void {
// No explicit dereferencing needed!
const tmp = self.length;
self.length = self.width;
self.width = tmp;
}
};
```
## Unions
I have never worked with `union`s, but [tagged unions] gave me awful ideas about matching Kotlin's [sealed classes] functionality so I'm looking forward to writing some cursed code :D
## Integer rules and Floats
Zig's type coercion syntax is nicer than Rust's, though the lack of a runtime error concerned me initially. Rust's [TryInto] trait is explicit about the fact that the conversion is fallible, and thus returns a [Result]. Zig on the other hand attempts to validate these conversions at compile-time. Given this code:
```zig
fn returnsNum() u32 {
return 1_00_000;
}
test "typecast" {
testing.expect(@TypeOf(@as(u8, returnsNum())) == u8);
}
```
The build will fail with:
```
./src/main.zig:182:46: error: expected type 'u8', found 'u32'
testing.expect(@TypeOf(@as(u8, returnsNum())) == u8);
^
./src/main.zig:182:46: note: unsigned 8-bit int cannot represent all possible unsigned 32-bit values
testing.expect(@TypeOf(@as(u8, returnsNum())) == u8);
```
This is good, but I haven't yet found a way to force the conversion to go through in instances where I can confirm that the incoming u32 definitely fits in a u8.
## Optionals
Zig's [Optionals] are a very good parallel for Rust's [Option], though Zig provides a lot more syntactic niceties.
The fact that you can use a while loop to capture values until they become null is pretty damn sweet.
```zig
var numbers_left: u32 = 4;
fn eventuallyNullSequence() ?u32 {
if (numbers_left == 0) return null;
numbers_left -= 1;
return numbers_left;
}
test "while null capture" {
var sum: u32 = 0;
while (eventuallyNullSequence()) |value| {
sum += value;
}
expect(sum == 6); // 3 + 2 + 1
}
```
# Conclusion
Everything following optionals was either uncontroversial or too powerful/low level for my current interests, so I admittedly glossed over some of the gory details.
[Chapter 2] introduces JSON, which we'll need for our eventual healthchecks.io library, so I'm looking forward to it! I do have work tomorrow, so we'll have to see if I can keep up the daily streak :)
[yesterday's post]: /posts/learning-zig--day-2
[chapter 1]: https://ziglearn.org/chapter-1/
[many-item pointers]: https://ziglearn.org/chapter-1/#many-item-pointers
[pointer-sized integers]: https://ziglearn.org/chapter-1/#pointer-sized-integers
[sealed classes]: https://kotlinlang.org/docs/sealed-classes.html
[tagged unions]: https://ziglang.org/documentation/master/#Tagged-union
[tryinto]: https://doc.rust-lang.org/std/convert/trait.TryInto.html
[result]: https://doc.rust-lang.org/std/result/enum.Result.html
[optionals]: https://ziglang.org/documentation/master/#Optionals
[option]: https://doc.rust-lang.org/std/option/enum.Option.html
[chapter 2]: https://ziglearn.org/chapter-2/

View File

@ -0,0 +1,51 @@
+++
categories = ["zig"]
date = 2021-05-18
summary = "Brushing up on standards"
slug = "learning-zig--day-4"
tags = ["learn"]
title = "Learning Zig - Day 4"
+++
Today I'll be getting familiar with common patterns in Zig like providing explicit allocators and learn about more of the standard library. This is of course, [chapter 2] of the ZigLearn.org curriculum.
# Thoughts™
## Allocators
Rust's standard library performs allocations as and when necessary, automatically, and provides a separate `no_std` mode that eliminates the standard library from the build and only retains the [libcore] which is suitable for use in bare-metal deployments (more on that in [The Embedded Rust Book]). Zig takes an alternative approach, where the convention is that all functions in the the standard library that require allocations take in an explicit [Allocator] which can either be implemented by the user, or you can pick one of the many options available in the standard library itself.
I've never given an _extreme_ amount of thought to the allocations my programs perform, so I'm rather unopinionated on this. That being said, whenever I start working on the healthchecks library I'm definitely going to follow the ecosystem's practices and make allocations explicit for consumers.
## Filesystem
The FS APIs appear to be quite expansive, covering everything that I can think of, and I finally discovered a practical use-case for `defer`! I'm pretty sure I'll end up passing the incorrect [CreateFlags] on more than one occasion, but at least they're documented and discoverable, and I have _some_ memory of doing the same with Python back when I still believed in my country's education system :P
## Formatting
Finally an answer to my "how to format an array" mystery! It's fascinating that formatting also requires allocations, but then Rust does return an owned `String` rather than a `&str` when you format things so that should have been obvious in hindsight.
## JSON
The native JSON support looks pretty great, though I am left to wonder how much of [serde]'s flexibility is available here. Guess we'll find out soon enough :)
## Random numbers and crypto
Great to see native crypto in Zig! I'm not the target audience, but lack of crypto primitives in Rust seems to come up often so it's a nice plus for Zig.
## Formatting specifiers and Advanced Formatting
Zig's formatting system seems about as powerful as Rust's, _maybe more_, so it's definitely a plus for me since I've ended up debugging a lot of code with `println!("{:?}", $field)` in Rust 😅
# Conclusion
I skipped through the parts about HashMaps, Stacks, sorting and iterators since those are fairly straightforward concepts that Zig does not appear to reinvent in any way.
Overall, I'm liking everything I'm seeing. Very excited to start building things in Zig!
[chapter 2]: https://ziglearn.org/chapter-2/
[libcore]: https://doc.rust-lang.org/core/index.html
[the embedded rust book]: https://docs.rust-embedded.org/book/intro/no-std.html
[allocator]: https://ziglang.org/documentation/0.7.1/std/#std;mem.Allocator
[createflags]: https://ziglang.org/documentation/0.7.1/std/#std;fs.File.CreateFlags
[serde]: https://serde.rs/

View File

@ -0,0 +1,76 @@
+++
categories = ["linux"]
date = 2020-07-17
summary = "Getting a USB Bluetooth dongle to function properly on Linux proved to be somewhat of a trip, which I'm documenting here."
slug = "making-a-bluetooth-adapter-work-on-linux"
socialImage = "uploads/bluetooth_social.webp"
tags = ["bluetooth", "bt-audio"]
title = "Making a Bluetooth adapter work on Linux"
+++
I made a couple of purchases yesterday, including a Bluetooth speaker and a USB Bluetooth dongle to pair it to my computer. Now here's a couple things that you need to know about said computer:
- It runs Linux
- It runs a customized build of the Zen kernel with a very slimmed down config
- It has never had Bluetooth connectivity before
Thanks to this combination of factors, things got weird. I tried a bunch of things before getting it working, so it is entirely possible that I miss some steps that were important but I didn't think so while writing this. Let me know in the comments if I missed something.
### Getting the right packages
You're gonna need 1) a GUI to handle BT devices, b) the PulseAudio module for Bluetooth. For the GUI I used [blueberry](http://packages.linuxmint.com/search.php?release=ulyana&section=main&keyword=blueberry), and [pulseaudio-module-bluetooth](https://packages.ubuntu.com/focal/pulseaudio-module-bluetooth) for PulseAudio support.
I did `apt install -y blueberry pulseaudio-module-bluetooth` to get these on Linux Mint, you should use whatever your distro's preferred package management interface is.
### Fixing up the kernel (optional)
I mentioned earlier that I run a very slimmed down config, which means nothing that I didn't already use was enabled. This included Bluetooth, so I went ahead and enabled all the configs for it [here](https://msfjarvis.dev/g/linux/992c2d8bce8b), then installed the new kernel and rebooted into it. You shouldn't need to do this if you do not run a custom kernel. To be completely sure, check your dmesg for Bluetooth initialization logs:
```shell
$ dmesg | rg Bluetooth
[ 0.146115] Bluetooth: Core ver 2.22
[ 0.146118] Bluetooth: HCI device and connection manager initialized
[ 0.146119] Bluetooth: HCI socket layer initialized
[ 0.146119] Bluetooth: L2CAP socket layer initialized
[ 0.146120] Bluetooth: SCO socket layer initialized
[ 0.325395] Bluetooth: HCI UART driver ver 2.3
[ 0.327116] Bluetooth: RFCOMM socket layer initialized
[ 0.327117] Bluetooth: RFCOMM ver 1.11
[ 0.327117] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 0.327119] Bluetooth: BNEP socket layer initialized
[ 0.327119] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[ 0.327120] Bluetooth: HIDP socket layer initialized
```
### Wrapping up
If you're not a relatively up-to-date distro, you might need to make some more manual adjustments before everything works. Open up `/etc/pulse/default.pa` in any editor with root access (so you can write your changes back), then look for `module-bluetooth-discover`. In my version of the file, I have this:
```pa
.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif
```
It means that if the module is discovered, it will be loaded. On older versions this might just be `# load-module module-bluetooth-discover`. In that case, uncomment the line.
Next, open up `/usr/bin/start-pulseaudio-x11` in the same way. Look for this:
```bash
if [ x"$SESSION_MANAGER" != x ] ; then
/usr/bin/pactl load-module module-x11-xsmp "display=$DISPLAY xauthority=$XAUTHORITY session_manager=$SESSION_MANAGER" > /dev/null
fi
```
Below it, add `/usr/bin/pactl load-module module-bluetooth-discover` so the final result looks like this:
```bash
if [ x"$SESSION_MANAGER" != x ] ; then
/usr/bin/pactl load-module module-x11-xsmp "display=$DISPLAY xauthority=$XAUTHORITY session_manager=$SESSION_MANAGER" > /dev/null
fi
/usr/bin/pactl load-module module-bluetooth-discover
```
This will manually load the module when X11 triggers PulseAudio init. This should ideally not be required so you can try without this change, but it won't break anything if you add it anyway.
Once done, reboot your computer and you should be able to pair and connect to devices and play audio through them.

View File

@ -0,0 +1,380 @@
+++
categories = ["kotlin", "android"]
date = 2020-12-21
summary = "Moshi is a fast and powerful JSON parsing library for the JVM and Android. Today we look into manually parsing JSON to and from Java/Kotlin classes"
slug = "manually-parsing-json-with-moshi"
socialImage = "/uploads/moshi_social.webp"
tags = ["moshi", "json parsing", "moshi read json from file"]
title = "Manually parsing JSON with Moshi"
toc = true
+++
### What is Moshi?
[Moshi] is a fast and powerful JSON parsing library for the JVM and Android, built by the former creators of Google's Gson to address some of its shortcomings and to have an alternative that was actively maintained.
Unlike Gson, Moshi has excellent Kotlin support and supports both reflection based parsing and a kapt-backed codegen backend that eliminates the runtime performance cost in favor of generating adapters during build time. The `kotlin-reflect` dependency required for doing reflection-based parsing can add up to 1.8 mB to the final binary, so it's recommended to use the codegen method if possible.
### What is an adapter?
An adapter is Moshi-speak for a class that can convert JSON into an object and an instance of that object into JSON. There are multiple types of JSON adapters supported by Moshi. The first is the one demonstrated in their README which contains two methods annotated `@ToJson` and `@FromJson`. The former takes an instance of the object and returns a String, and the latter takes a String and returns an instance of the object. This is the simplest type, and should be used for non-complex types that typically can be represented in simpler forms. [Here's the example Moshi uses](https://github.com/square/moshi#custom-type-adapters), and should be all the introduction you need for this particular type.
The other type is similar to what Moshi generates for its kapt-generated adapters, but leverages the `@ToJson`/`@FromJson` annotations. The method signatures here are a bit verbose, and these are the ones we're going to try to build.
### Why write your own adapters?
Good question. Consider this example class:
```kotlin
@JsonClass(generateAdapter = true)
class TextParts(val heading: String, val body: String? = null)
```
Pretty straightforward. The `JsonClass` annotation with `generateAdapter = true` will attempt to use the codegen backend to write an adapter automatically for this. Let's try converting this to JSON.
```kotlin
val text = TextParts("This is the heading", "And this is the body")
val moshi = Moshi.Builder().build()
// TextPartsJsonAdapter was generated by the codegen backend
println(TextPartsJsonAdapter(moshi).toJson(text))
{"heading":"This is the heading","body":"And this is the body"}
```
What this means is, given a JSON object that looks like this
```json
{ "heading": "This is the heading", "body": "And this is the body" }
```
We can get an instance of `TextParts` that looks like this
```kotlin
val text = TextParts("This is the heading", "And this is the body")
```
Cool! Now, let's make things unfortunate. Imagine your backend team is stretched thin, and due to a limitation with how they initially built their database schema, you can only get the above JSON in this form
```json
{
"heading": "This is the heading",
"extras": { "body": "And this is the body" }
}
```
If you try to parse this with the old `TextPartsJsonAdapter`, your app is going to crash, because the JSON and its Kotlin representation have diverged. The equivalent Kotlin for this new JSON is going to be something like this:
```kotlin
@JsonClass(generateAdapter = true)
class Extras(val body: String? = null)
@JsonClass(generateAdapter = true)
class TextParts(val heading: String, val extras: Extras? = null)
```
Many things changed here. Your direct access to the `body` field now needs to go through `extras`, which just isn't that nice. You're also now incurring the (albeit miniscule) overhead of generating two adapters rather than one. Wouldn't it be great if we could continue to have a flat object like before? Let's try to make that happen.
### How to write your own Moshi adapter?
With less effort than one might think! Let's put down the basic building blocks.
```kotlin
class TextPartsJsonAdapter {
// Moshi is flexible about the parameters of these two methods, and for simpler types
// you will find it easier to follow the example from the Moshi README which does not
// use JsonReader/JsonWriter and instead directly converts items to and from their String
// representations. The method names are also not enforced, as Moshi only uses the
// annotations to find relevant methods. The internal implementation of how they do it
// can be found here: https://git.io/JLwnb
@FromJson
fun fromJson(reader: JsonReader): TextParts? {
TODO("Not implemented")
}
@ToJson
fun toJson(writer: JsonWriter: value: TextParts?) {
TODO("Not implemented")
}
}
```
Now we're ready to start parsing. First, let's implement the `toJson` part, where we take an instance of the object and then try to write the equivalent JSON for it. Since this is comparatively easier, I'm going to do it in one go and leave comments inline to explain what's happening.
```kotlin
@ToJson
fun toJson(writer: JsonWriter: value: TextParts?) {
// Null values shouldn't arrive to the adapter, this error lets callers know
// what builder options need to be passed to the Moshi.Builder() instance
// to avoid this particular situation.
if (value == null) {
throw NullPointerException("value was null! Wrap in .nullSafe() to write nullable values.")
}
// Use the Kotlin `with` scoping method so we don't need to call
// all methods with the `writer.` prefix.
with(writer) {
// Start the JSON object.
beginObject()
// Since our `extras` field is nullable, and our backend will send
// it as a literal null rather than skip it, we want null values to
// be written into the final JSON.
serializeNulls = true
// Create a JSON field with the name 'heading'
name("heading")
// Set the value of the 'heading' field to the actual heading
value(value.heading)
// Create the 'extras' field
name("extras")
if (value.body != null) {
// If the body text exists, then start a new object and add a
// body field
beginObject()
name("body")
value(value.bodyText)
endObject()
} else {
// Otherwise we put down a literal null
nullValue()
}
// End the top-level object.
endObject()
}
}
```
Parsing JSON manually is relatively easy to screw up and Moshi will let you know if you get nesting wrong (missed a closing `endObject()` or `endArray()`) and other easily detectable problems, but you should definitely have tests for all possible cases. I'll let the readers do that on their own, but if you _really_ need to see an example then let me know below.
Anyways, that's the object -> JSON part sorted. Now let's try to do the reverse. Here's where we are as of now.
```kotlin
fun fromJson(reader: JsonReader): TextParts? {
TODO("Not implemented")
}
```
Same as writing JSON, we need to start by making an object.
```diff
fun fromJson(reader: JsonReader): TextParts? {
+ // We'll be constructing the object at the end so these
+ // will store the values we read.
+ var heading: String? = null
+ var body: String? = null
+ with(reader) {
+ beginObject()
+ endObject()
+ }
TODO("Not implemented")
}
```
We have a fixed set of keys that we expect to read, so go ahead and configure a couple instances of `JsonReader.Options` that we will use to find the keys in this JSON.
```diff
+val topLevelKeys = JsonReader.Options.of("heading", "extras")
+val extrasKeys = JsonReader.Options.of("body")
+
fun fromJson(reader: JsonReader): TextParts? {
// We'll be constructing the object at the end so these
// will store the values we read.
```
And we're set. You'll see the significance of the Options objects now.
```diff
var body: String? = null
with(reader) {
beginObject()
+ while(hasNext()) {
+ when(selectName(topLevelKeys)) {
+ 0 -> heading = nextString() ?: throw Util.unexpectedNull(
+ "heading",
+ "text",
+ this
+ )
+ }
+ }
endObject()
}
TODO("Not implemented")
```
`reader.hasNext()` is going to continue iterating through the document's tokens until it's completed, which lets us look through the entire document for the parts we need. The `selectName(JsonReader.Options)` method will return the index of a matched key, so `0` there means that the `heading` key was found. In response to that, we want to read it as a string and throw if it is null (since it's non-nullable in `TextParts`). The `Util.unexpectedNull` method is a little nicety that is part of Moshi's internals and is used by its kapt-generated adapters to provide better error messages and we're going to do the same.
```diff
0 -> heading = nextString() ?: throw Util.unexpectedNull(
"heading",
"text",
this
)
+ -1 -> {
+ // Skip unknown values
+ skipName()
+ skipValue()
+ }
}
}
endObject()
```
When I said that `selectName` returns the index of the matched key, I didn't mention that it returns -1 when it comes across a key that isn't in the Options object. Since we don't care about them, we're going to skip both their name and value and continue right on ahead. Now, we're going to try and parse that inner `extras` object. A lot is about to happen quickly, but bear with me as I explain things.
```diff
"text",
this
)
+ 1 -> {
+ // "extras" is nullable, so we first try to see if it is null.
+ // If it isn't, this will throw and we can then safely assume
+ // a non-null value and proceed.
+ try {
+ nextNull<Any>()
+ } catch (_: JsonDataException) {
+ beginObject()
+ while (hasNext()) {
+ when (selectName(extrasKeys)) {
+ 0 -> body = nextString()
+ -1 -> {
+ // Skip unknown values
+ skipName()
+ skipValue()
+ }
+ }
+ }
+ endObject()
+ }
+ }
-1 -> {
// Skip unknown values
skipName()
skipValue()
```
Now that you look at it, not really that different from what we did above. The only new thing here is the `nextNull` method, which simply tries to find a null value and throws the `JsonDataException` if the value wasn't null.
```diff
}
endObject()
}
- TODO("Not implemented")
+ // Satisfy the typechecker and throw in case the JSON body
+ // didn't contain the 'heading' field at all
+ require(heading != null) { "heading must not be null" }
+ return TextParts(heading, body)
}
```
And that's it! The final adapter is going to look like this
```kotlin
class TextPartsJsonAdapter {
val topLevelKeys = JsonReader.Options.of("heading", "extras")
val extrasKeys = JsonReader.Options.of("body")
@FromJson
fun fromJson(reader: JsonReader): TextParts? {
// We'll be constructing the object at the end so these
// will store the values we read.
var heading: String? = null
var body: String? = null
with(reader) {
beginObject()
while(hasNext()) {
when(selectName(topLevelKeys)) {
0 -> heading = nextString() ?: throw Util.unexpectedNull(
"heading",
"text",
this
)
1 -> {
// "extras" is nullable, so we first try to see if it is null.
// If it isn't, this will throw and we can then safely assume
// a non-null value and proceed.
try {
nextNull<Any>()
} catch (_: JsonDataException) {
beginObject()
while (hasNext()) {
when (selectName(extrasKeys)) {
0 -> body = nextString()
else -> {
// Skip unknown
skipName()
skipValue()
}
}
}
endObject()
}
}
-1 -> {
skipName()
skipValue()
}
}
}
endObject()
}
// Satisfy the typechecker and throw in case the JSON body
// didn't contain the 'heading' field at all
require(heading != null) { "heading must not be null" }
return TextParts(heading, body)
}
@ToJson
fun toJson(writer: JsonWriter: value: TextParts?) {
// Null values shouldn't arrive to the adapter, this error lets callers know
// what builder options need to be passed to the Moshi.Builder() instance
// to avoid this particular situation.
if (value == null) {
throw NullPointerException("value was null! Wrap in .nullSafe() to write nullable values.")
}
// Use the Kotlin `with` scoping method so we don't need to call
// all methods with the `writer.` prefix.
with(writer) {
// Start the JSON object.
beginObject()
// Since our `extras` field is nullable, and our backend will send
// it as a literal null rather than skip it, we want null values to
// be written into the final JSON.
serializeNulls = true
// Create a JSON field with the name 'heading'
name("heading")
// Set the value of the 'heading' field to the actual heading
value(value.heading)
// Create the 'extras' field
name("extras")
if (value.body != null) {
// If the body text exists, then start a new object and add a body field
beginObject()
name("body")
value(value.bodyText)
endObject()
} else {
// Otherwise we put down a literal null
nullValue()
}
// End the top-level object.
endObject()
}
}
}
```
This is certainly a lengthy job to do, and this blog post is a result of nearly 8 hours I spent writing JSON adapters by hand. Certainly not recommended if avoidable, but sometimes you just need to. When it comes to it, now you hopefully know how :)
[gson]: https://github.com/google/gson
[json spec]: https://TODO
[moshi]: https://github.com/square/moshi

View File

@ -0,0 +1,175 @@
+++
categories = ["fediverse"]
date = 2022-11-16
summary = "A quick and easy way of creating a Fediverse identity on your own domain without an ActivityPub server"
slug = "mastodon-on-your-own-domain-without-hosting-a-server-netlify-edition"
tags = ["mastodon", "fediverse", "webfinger", "netlify"]
title = "Mastodon on your own domain without hosting a server, Netlify edition"
+++
## Preface
I recently came across [a blog post](https://blog.maartenballiauw.be/post/2022/11/05/mastodon-own-donain-without-hosting-server.html) from [Maarten Balliauw](https://mastodon.online/@maartenballiauw) that explained how they had managed to create an ActivityPub compatible identity for themselves, without hosting Mastodon or any other ActivityPub server.
I recommend going to their blog and reading the whole thing, but here's a TL;DR
- [ActivityPub](https://activitypub.rocks/) has the notion of an "actor" that sends messages
- This "actor" must be discoverable via a protocol called [WebFinger](https://webfinger.net)
- WebFinger is ridiculously easy to implement
For all practical purposes, WebFinger is essentially a JSON document that is served at `/.well-known/webfinger` from a domain and is used to identify "actors" across the Fediverse.
Maarten's approach to implementing this was to simply place the JSON document at `/.well-known/webfinger` on their domain `balliauw.be`, which allowed `@maarten@balliauw.be` to become a WebFinger-compatible identity that can be searched for on Mastodon and will return their actual `@maartenballiauw.be@mastodon.online` profile.
Maarten did however note that since they're relying on static hosting, they're unable to restrict what identities they can enforce as valid, and thus a search for `@anything@balliauw.be` will also return their `mastodon.online` identity.
## The implementation
I wanted to also set up something like this, but without the limitation Maarten had run into. Since my website runs on Netlify, I decided to try out using an [Edge Function](https://docs.netlify.com/edge-functions/overview/) to build this up.
Similar to Maarten, I first obtained my current Fediverse identity from the Mastodon server I am on: [androiddev.social](https://androiddev.social) (incredible props to [Mikhail](https://androiddev.social/@friendlymike) for making it a reality).
```json
➜ curl -s https://androiddev.social/.well-known/webfinger?resource=acct:msfjarvis@androiddev.social | jq .
{
"subject": "acct:msfjarvis@androiddev.social",
"aliases": [
"https://androiddev.social/@msfjarvis",
"https://androiddev.social/users/msfjarvis"
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://androiddev.social/@msfjarvis"
},
{
"rel": "self",
"type": "application/activity+json",
"href": "https://androiddev.social/users/msfjarvis"
},
{
"rel": "http://ostatus.org/schema/1.0/subscribe",
"template": "https://androiddev.social/authorize_interaction?uri={uri}"
}
]
}
```
With this in hand, now we can get started on wiring this up into our website.
First, create an Edge Function using the Netlify CLI. Here's the options I chose.
```
➜ yarn exec ntl functions:create --name webfinger
? Select the type of function you'd like to create: Edge function (Deno)
? Select the language of your function: TypeScript
? Pick a template: typescript-json
? Name your function: webfinger
◈ Creating function webfinger
◈ Created netlify/edge-functions/webfinger/webfinger.ts
? What route do you want your edge function to be invoked on?: /.well-known/webfinger
◈ Function 'webfinger' registered for route `/.well-known/webfinger`. To change, edit your `netlify.toml` file.
```
Next, add the following code to the TypeScript file just created for you. I've added comments inline to explain what each part of the code does so you can customize it according to your needs.
```typescript
// Netlify Edge Functions run on Deno (https://deno.land), so imports use URLs rather than package names.
import { Status } from "https://deno.land/std@0.136.0/http/http_status.ts";
import type { Context } from "https://edge.netlify.com";
export default async (request: Request, context: Context) => {
// We obtain the value of the 'resource' query parameter so that we
// can ensure a response is only sent for the identity we want.
const url = new URL(request.url);
const resourceParam = url.searchParams.get("resource");
if (resourceParam === null) {
return context.json(
{
error: "No 'resource' query parameter was provided",
},
{
status: Status.BadRequest,
},
);
// I want to be searchable as `@harsh@msfjarvis.dev`, so I only
// allow requests that set the resource query param to this value.
} else if (resourceParam !== "acct:harsh@msfjarvis.dev") {
return context.json(
{
error: "An invalid identity was requested",
},
{
status: Status.BadRequest,
},
);
} else {
// Here's the JSON object we got earlier
return context.json({
subject: "acct:msfjarvis@androiddev.social",
aliases: [
"https://androiddev.social/@msfjarvis",
"https://androiddev.social/users/msfjarvis",
],
links: [
{
rel: "http://webfinger.net/rel/profile-page",
type: "text/html",
href: "https://androiddev.social/@msfjarvis",
},
{
rel: "self",
type: "application/activity+json",
href: "https://androiddev.social/users/msfjarvis",
},
{
rel: "http://ostatus.org/schema/1.0/subscribe",
template: "https://androiddev.social/authorize_interaction?uri={uri}",
},
],
});
}
};
```
And that's it! You can test it out as below to verify things work as expected.
```json
➜ curl -s https://msfjarvis.dev/.well-known/webfinger | jq .
{
"error": "No 'resource' query parameter was provided"
}
➜ curl -s https://msfjarvis.dev/.well-known/webfinger?resource=acct:anything@msfjarvis.dev | jq .
{
"error": "An invalid identity was requested"
}
➜ curl -s https://msfjarvis.dev/.well-known/webfinger?resource=acct:harsh@msfjarvis.dev | jq .
{
"subject": "acct:msfjarvis@androiddev.social",
"aliases": [
"https://androiddev.social/@msfjarvis",
"https://androiddev.social/users/msfjarvis"
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://androiddev.social/@msfjarvis"
},
{
"rel": "self",
"type": "application/activity+json",
"href": "https://androiddev.social/users/msfjarvis"
},
{
"rel": "http://ostatus.org/schema/1.0/subscribe",
"template": "https://androiddev.social/authorize_interaction?uri={uri}"
}
]
}
```
Thanks again to Maarten for doing the initial research for this and writing about it!

View File

@ -0,0 +1,75 @@
+++
categories = ["aps"]
date = 2021-11-06
summary = "I recently migrated Password Store to Material You, Google's latest iteration of Material Design. Here's how it went."
slug = "migrating-aps-to-material-you"
tags = ["android-password-store"]
title = "Migrating APS to Material You"
socialImage = "uploads/m3-social.webp"
+++
With much fanfare, Google released the next iteration of Material Design: **Material You**. It's received mixed reviews, but I found it extremely pleasant to use and the homogeneity of Google apps following the platform colors felt great. That's what prompted me to update APS to Material You and join in :)
As expected, the library ecosystem (specifically the [material-components-android] library) took a while to support Material You but with the [1.5.0-alpha05] release of the MDC Android library, things are finally at a place where migration to Material You (henceforth referred to as M3) is viable for simpler apps like APS.
APS has had some design work done to it but for the most part remains the culmination of ad-hoc choices (often bad) over a period of several years. With this migration I sought to change that and make things a bit more cohesive as well as give the app some much needed _oomph_.
## Getting the basics in
I began with scouring through the resources in the conveniently isolated [M3 website], where the Material Design team has helpfully created a lot of great tools and content to help developers and designers through the process. There's the "[Migration to Material 3]" blog post, and the [Material Theme Builder] to generate palettes/styles/themes for apps, for both Jetpack Compose and Android's View-based system. These were extremely helpful in getting a headstart on the whole process. It's all documented in the commit history of the [migration PR] but I figure some additional context can't hurt.
Once I had the themes in, I decided to take the opportunity to also introduce a custom typeface. The app has been using Roboto since forever and it felt like it was time to spice things up. I decided to go with [Manrope] since it is a font I've previously used and found to be excellent for visual appeal and accessibility. I'm still not a 100% confident in my choice, so if people have better options in mind I'd love to know down in the comments.
Once the new font face was in, I opted to enable dynamic colors. Admittedly not the right choice, since I should've validated the "default" palette first but that's what I did ¯\\_(ツ)_/¯.
## Bugfixes and improvements™
Once the M3 themes were all prepped, it was time to actually start migrating.
I switched our activities to use the M3 themes, and immediately started noticing bugs from non-idiomatic and straight up incorrect theming we've been lugging around for the past couple years.
First step was to update our iconography, which was using inconsistent tints throughout. I updated all of them to use `?attr/colorControlNormal` which made them blend in correctly with the rest of the updated UI.
Earlier this year we had migrated a selection UI in one of our screens to use [Chips], but we never got the theming right so it always looked kind of wrong. With M3, we were able to revert back to `MaterialButtonToggleGroup` without regressing on the [accessibility issue] which made us do it in the first place.
There were a lot more smaller changes that were made to address the remaining visual bugs
- Our onboarding flow was using an incorrect interpretation of `?attr/colorPrimary` for theming, and was migrated to use `?android:attr/colorBackground`
- A lot of screens were using hard-coded colors, which were migrated to theme attributes
- Many screens used hard-coded styles for buttons and text fields, and were also migrated to theme attributes
- Multiple layouts also referenced typography styles directly and were migrated to the corresponding M3 attributes, based on the mapping table in the "[Migration to Material 3]" article.
- System bars and Toolbar had to be given explicit styles and colors to match the "flat" aesthetic from our M2 designs.
## The final stretch
With the visual fixes out of the way, I went in and cleaned up the themes and styles. I commonized shared attributes such as fonts and widget styles, created M3 variants of other special-purpose themes we had, and got rid of all the now unused M2 theming. Overall, the PR touched 60+ separate files and generated a final diff of `+603,-314` lines. The PR can be seen [here](https://msfjarvis.dev/aps/pr/1532).
We use a third-party library by [Max Rumpf] called [ModernAndroidPreferences] for our settings UI, and it hard-coded the use of AppCompat dialogs. Max was extremely helpful and made that customisable for us over the weekend which allowed us to use the appropriate Material You dialogs consistently. Huge thanks to Max, and check out his library! <3
## Screenshots!
### Before
![Screenshot gallery of a few APS screens before the Material 3 migration](/uploads/aps_m2_gallery.webp)
### After
![Screenshot gallery of a few APS screens after the Material 3 migration](/uploads/aps_m3_gallery.webp)
## Closing notes
APS is a very low-effort app when it comes to UI work. We do not have a custom design system, everything follows Material to a T, and we try to stay in that lane. Our migration took me around 9 hours of work over two days, most of which was really spent on menial work such as manually checking all layouts for hard-coded styles and replacing them with attributes. This isn't representative of what this process would look like for any project which rolls its own design system on top of Material, since they have a lot more to do before they can even _begin_ the migration of their screens.
I'd like to thank the Material Design team once more for the fabulous work they have done both in creating Material You as well as the technical documentation around it. [Material Theme Builder] was an extremely crucial tool for me that set the tone of the whole process, and I would have certainly repeated the same mistakes I did with Material 2 if it wasn't for the tooling and guidance from the team.
[material-components-android]: https://github.com/material-components/material-components-android
[1.5.0-alpha05]: https://github.com/material-components/material-components-android/releases/tag/1.5.0-alpha05
[m3 website]: https://m3.material.io
[migration to material 3]: https://material.io/blog/migrating-material-3
[material theme builder]: https://material.io/blog/material-theme-builder
[migration pr]: https://github.com/android-password-store/Android-Password-Store/pull/1532/commits
[manrope]: https://fonts.google.com/specimen/Manrope#about
[chips]: https://material.io/components/chips
[accessibility issue]: https://github.com/android-password-store/Android-Password-Store/issues/1261
[max rumpf]: https://github.com/maxr1998
[modernandroidpreferences]: https://github.com/Maxr1998/ModernAndroidPreferences

View File

@ -0,0 +1,62 @@
+++
categories = ["android"]
date = 2020-01-11
summary = "Dagger is not the easiest tool to get on board with but it's almost worth the effort. Here's the story of my journey to not hating Dagger."
devLink = "https://dev.to/msfjarvis/my-dagger-story-2go0"
slug = "my-dagger-story"
socialImage = "uploads/dagger_story_social.webp"
tags = ["dagger"]
title = "My Dagger Story"
+++
[Dagger](https://dagger.dev) is infamous for very good reasons. It's complicated to use, the documentation is an absolute shitshow, and simpler 'alternatives' exist. While [Koin](http://insert-koin.io/) and to a lesser extent [Kodein](https://kodein.org/di/) do the job, they're still service locators at their core and don't automatically inject dependencies like Dagger does.
## Background
Before I start, some introductions. I'm the sole developer of [Viscerion](https://play.google.com/store/apps/details?id=me.msfjarvis.viscerion), an Android client for [WireGuard](https://www.wireguard.com/). It is a fully [open source](https://github.com/msfjarvis/viscerion) project just like the upstream Android client which served as the base for it. I forked Viscerion as a playground project that'd let me learn new Android tech in an unencumbered way and be something that I'd actually use, hence guaranteeing some level of sustained interest. I do still contribute major fixes back upstream, so put down your pitchforks :P
Like I said before, Viscerion is a learning endeavour, so I decided to learn. I rewrote most of the app in Kotlin, implemented some UI changes to make the app more friendlier to humans and added a couple features here and there.
And then I decided to tackle the Dependency Injection monster.
## The beginnings
The dependency injection story always begins with the search for a library that does it for you. You look at Dagger, go to the documentation, look up what a Thermosiphon is, then scratch Dagger off the list and move on. Kotlin users will then end up on one of [Koin](http://insert-koin.io/) or [Kodein](https://kodein.org/di/) and that'll be the end of their story.
That was mine as well! Before Viscerion was forked, the app used to have Dagger (albeit sorely underused as I can tell now that I know a fair bit about it) but then it was [swapped out](https://github.com/WireGuard/wireguard-android/commit/712b6c6f600ef6eb683d356a6e9a05e9415b7e12) for singleton access from the Application class. I really, really wanted to try out the fancy 'Dependency Injection' thing everybody loved so I did some searching around, went through the aforementioned motions and [settled on Koin](https://github.com/msfjarvis/viscerion/pull/131).
It was great! I could get any dependency anywhere and that allowed me to write all kinds of hot garbage, and garbage I wrote. But despite all that, I still really wanted to give Dagger another shot. I tried multiple times to make it work, the remains of which have been force pushed away long since. Then I came across [Fred Porciúncula](https://twitter.com/tfcporciuncula)'s [dagger-journey](https://github.com/tfcporciuncula/dagger-journey) repository and the accompanying talk that tried to fill the usability gap that Dagger's documentation never could. He was largely successful in being able to teach me how to use Dagger, and the first "proper" attempt I made at using Dagger was [largely decent](https://github.com/msfjarvis/viscerion/pull/196/files). I was still missing a lot of knowledge that made me [slip back into my hate-train](https://github.com/msfjarvis/viscerion/pull/196#issuecomment-557907972).
## The turning point
Around mid-December 2019, [Arun](https://twitter.com/arunkumar_9t2) released the 0.1 version of his Dagger 2 dependency graph visualizer, [Scabbard](https://arunkumar.dev/introducing-scabbard-a-tool-to-visualize-dagger-2-dependency-graphs/). It looked **awesome**. I reshared it and shoved in my residual Dagger hate for good measure because isn't that what the internet is for. I was confident that Dagger shall never find a place in my code and my friend [Sasikanth](https://sasikanth.dev) was hell-bent on ensuring otherwise.
Together, we dug up my previous efforts and I started [a PR](https://github.com/msfjarvis/viscerion/pull/214) so he could review it and help me past the point I dropped out last time. He helped [me on GitHub](https://github.com/msfjarvis/viscerion/pull/214#pullrequestreview-336919368), privately on Telegram and together in about 2 days Viscerion was completely Koin-free and ready to kill. I put down my thoughts about the migration briefly [on the PR](https://github.com/msfjarvis/viscerion/pull/214#issuecomment-569541678), which I'll reproduce and expand on below.
> - Dagger is ridiculously complex without a human to guide you around.
I will die on this hill. Without Sasikanth's help I would have never gotten around to even _trying_ Dagger again.
> - Koin's service locator pattern makes it far too easy to write bad code because you can inject anything anywhere.
Again, very strong opinion that I will continue to have. I overlooked a clean way of implementing a feature and went for a quick and dirty version because Koin allowed me the freedom to do it. Dagger forced me to re-evaluate my code and I ended up being able to extract all Android dependencies from that package and move it into a separate module.
> - Dagger can feel like a lot of boilerplate but some clever techniques can mitigate that.
Because the Dagger documentation wasn't helpful, I didn't realise that a `Provides` annotated method and an `@Inject`ed constructor was an either-or situation and I didn't need to write both for a class to be injectable. Sasikanth [with the rescue again](https://github.com/msfjarvis/viscerion/pull/214#discussion_r361800427).
> - Writing `inject` methods for every single class can feel like a drag because it is.
[I mean\...](https://github.com/msfjarvis/viscerion/blob/4a40f3692e62939d3b4c3693efe41ad03fb5f330/app/src/main/java/com/wireguard/android/di/AppComponent.kt#L69-L101)
> - Injecting into Kotlin `object`s appears to be a no-go. I opted to [refactor out the staticity where possible](https://github.com/msfjarvis/viscerion/pull/214/commits/9eb532521f51d0f7bb66a2a78aa1fc5688128a22), [pass injected dependencies to the function](https://github.com/msfjarvis/viscerion/commit/e23f878140d4bda9e2c54d6c2684e07994066fd6#diff-28007a5799b03e7b556f5bb942754031) or [fall back to \'dirty\' patterns](https://github.com/msfjarvis/viscerion/pull/214/commits/fc54ec6bb8e99ec639c6617765e814e12d91ea1a#diff-74f75ab44e1cd2909c4ec4d704bbbab7R65) as needed. Do what you feel like.
I have no idea if that's even a good ability to begin with, so I chose to change myself rather than fight the system.
> - I still do not _love_ Dagger. Fuck you Google.
This, I probably don't subscribe to anymore. Dagger was horrible to get started with, but I can now claim passing knowledge and familiarity with it, enough to be able to use it for simple projects and be comfortable while doing so.
## To summarize
Like RxJava, Dagger has become an industry standard of sorts and a required skill at a lot of Android positions, so eventually you might wind up needing to learn it anyway, so why wait? Dagger is not _terrible_, just badly presented. Learning from existing code is always helpful, and that was part of how I learned. Use my PR, and post questions below and I'll do my best to help you like I was helped and hopefully we'll both learn something new :)

View File

@ -0,0 +1,280 @@
+++
categories = ["android"]
date = 2019-11-21
summary = "GitHub recently rolled out Packages to the general public, allowing the entire develop-test-deploy pipeline to get centralized at GitHub. Learn how to use it to publish your Android library packages."
devLink = "https://dev.to/msfjarvis/publishing-an-android-library-to-github-packages-1l74"
slug = "publishing-an-android-library-to-github-packages"
socialImage = "uploads/github_packages_social.webp"
tags = ["gradle", "github", "packaging"]
title = "Publishing an Android library to GitHub Packages"
+++
> UPDATE(06/06/2020): The Android Gradle Plugin supports Gradle's inbuilt `maven-publish` plugin since version 4.0.0, so I've added the updated process for utilising it at the beginning of this guide. The previous post follows that section.
GitHub released the Package Registry beta in May of this year, and graduated it to public availability in Universe 2019, rebranded as [GitHub Packages](https://github.com/features/packages "GitHub Packages"). It supports NodeJS, Docker, Maven, Gradle, NuGet, and RubyGems. That's a LOT of ground covered for a service that's about one year old.
Naturally, I was excited to try this out. The [documentation](https://help.github.com/en/github/managing-packages-with-github-packages/about-github-packages) is by no means lacking, but the [official instructions](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages) for using Packages with Gradle do not work for Android libraries. To make it compatible with Android libraries, some small but non-obvious edits are needed which I've documented here for everybody's benefit.
> GitHub Packages currently does **NOT** support unauthenticated access to packages, which means you will always require a personal access token with the `read:packages` scope to be able to download packages during build. I emailed GitHub support about this, and their reply is attached at the end of this post.
I've also created a [sample repository](https://github.com/msfjarvis/github-packages-deployment-sample/) with incremental commits corresponding to the steps given below, for people who prefer to see the code directly.
To be able to deploy packages, you will require a Personal Access Token from GitHub with the `write:packages` scope. Follow the steps [here](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token#creating-a-token) to create the token if you have never done so before.
### For AGP >= 4.0.0
All you need to do is ensure you're on at least Gradle 6.5 and AGP 4.0.0, then configure as follows.
For Groovy:
```groovy
apply plugin: 'maven-publish'
afterEvaluate {
publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/msfjarvis/github-packages-deployment-sample")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("PASSWORD")
}
}
}
publications {
release(MavenPublication) {
from components.release
groupId = "$GROUP"
artifactId = "deployment-sample-library"
version = "$VERSION"
}
}
}
}
```
For Kotlin:
```kotlin
plugins {
id("maven-publish")
}
afterEvaluate {
publishing {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/msfjarvis/github-packages-deployment-sample")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("PASSWORD")
}
}
}
publications {
// Simple convenience function to hide the nullability of `findProperty`.
private fun getProperty(key: String): String {
return findProperty(key)?.toString() ?: error("Failed to find property for $key")
}
create<MavenPublication>("release") {
from(components.getByName("release"))
groupId = getProperty("GROUP")
artifactId = "deployment-sample-library"
version = getProperty("VERSION")
}
}
}
}
```
Then, set the `GROUP` and `VERSION` properties in `gradle.properties`
```groovy
GROUP=msfjarvis
VERSION=0.1.0-SNAPSHOT
```
And that should be it! You can check the migration commit [here](https://github.com/msfjarvis/github-packages-deployment-sample/commit/260fd3154fd393d3969afd048dc2c77d03619b1d).
When you are ready to publish, run `./gradlew -Pgpr.user=<username> -Pgpr.key=<personal access token> publish` from your repository and everything should correctly deploy.
### For AGP < 4.0.0
#### Step 1
Copy the official integration step from GitHub's [guide](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#authenticating-with-a-personal-access-token), into your Android library's `build.gradle` / `build.gradle.kts`. If you try to run `./gradlew publish` now, you'll run into errors. We'll be fixing that shortly. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/d69235577a1d4345cecb364a3a3d366bf894c5a6)\]
```diff
--- library/build.gradle
+++ library/build.gradle
@@ -1,5 +1,6 @@
apply plugin: "com.android.library"
apply plugin: "kotlin-android"
+apply plugin: "maven-publish"
apply from: "../dependencies.gradle"
// apply from: "../bintrayconfig.gradle"
@@ -28,6 +29,24 @@ android {
}
}
+publishing {
+ repositories {
+ maven {
+ name = "GitHubPackages"
+ url = uri("https://maven.pkg.github.com/msfjarvis/github-packages-deployment-sample")
+ credentials {
+ username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
+ password = project.findProperty("gpr.key") ?: System.getenv("PASSWORD")
+ }
+ }
+ }
+ publications {
+ gpr(MavenPublication) {
+ from(components.java)
+ }
+ }
+}
+
dependencies {
api deps.support.app_compat
implementation deps.kotlin.stdlib8
```
#### Step 2
Switch out the `maven-publish` plugin with [this](https://github.com/wupdigital/android-maven-publish) one. It provides us an Android component that's compatible with publications and precisely what we need. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/1452c4a0c15d394b73dc3384f02834788dfe1bda)\]
```diff
--- build.gradle
+++ build.gradle
@@ -14,6 +14,7 @@ buildscript {
classpath deps.gradle_plugins.kotlin
classpath deps.gradle_plugins.spotless
classpath deps.gradle_plugins.versions
+ classpath deps.gradle_plugins.android_maven_publish
}
}
--- dependencies.gradle
+++ dependencies.gradle
@@ -12,7 +12,8 @@ ext.deps = [
spotless: "com.diffplug.spotless:spotless-plugin-gradle:3.26.0",
versions: "com.github.ben-manes:gradle-versions-plugin:0.27.0",
bintray_release: "com.novoda:bintray-release:0.9.1",
- kotlin: "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.60"
+ kotlin: "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.60",
+ android_maven_publish: "digital.wup:android-maven-publish:3.6.2"
],
kotlin: [
--- library/build.gradle
+++ library/build.gradle
@@ -1,6 +1,6 @@
apply plugin: "com.android.library"
apply plugin: "kotlin-android"
-apply plugin: "maven-publish"
+apply plugin: "digital.wup.android-maven-publish"
apply from: "../dependencies.gradle"
// apply from: "../bintrayconfig.gradle"
```
#### Step 3
Switch to using the `android` component provided by `wup.digital.android-maven-publish`. This is the one we require to be able to upload an [AAR](https://developer.android.com/studio/projects/android-library) artifact. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/7cc6fcd6ffa5774433bce76ac6929435dbbb77cc)\]
```diff
--- library/build.gradle
+++ library/build.gradle
@@ -42,7 +42,7 @@ publishing {
}
publications {
gpr(MavenPublication) {
- from(components.java)
+ from(components.android)
}
}
}
```
#### Step 4
Every Gradle/Maven dependency's address has three attributes, a group ID, an artifact ID, and a version.
```groovy
implementation 'com.example:my-fancy-library:1.0.0'
```
Here:
- Group ID: `com.example`
- Artifact ID: `my-fancy-library`
- Version: `1.0.0`
We'll need to configure these too. I prefer using the `gradle.properties` file for this purpose since it's very easy to access variables from it, but if you have a favorite way of configuring build properties, use that instead! \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/cee74a5e0b3b76d1d7a2d4eb9636d80fb1db49d6)\]
```diff
--- gradle.properties
+++ gradle.properties
@@ -19,3 +19,7 @@ android.useAndroidX=true
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
+
+# Publishing config
+GROUP=msfjarvis
+VERSION=0.1.0-SNAPSHOT
--- library/build.gradle
+++ library/build.gradle
@@ -43,6 +43,10 @@ publishing {
publications {
gpr(MavenPublication) {
from(components.android)
+ groupId "$GROUP"
+ artifactId "deployment-sample-library"
+ // Use your configured version outside CI, the SHA of the top commit inside.
+ version System.env['GITHUB_SHA'] == null ? "$VERSION" : System.env['GITHUB_SHA']
}
}
}
```
#### Step 5
Now all that's left to do is configure GitHub Actions. Go to the Secrets menu in your repository's settings, then create a `PACKAGES_TOKEN` secret and provide the access token you generated earlier. Head over to the [documentation](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#creating-encrypted-secrets) for Secrets if you wanna know how this works under the hood.
Now, let's add the actual configuration that'll get Actions up and running.
```diff
--- /dev/null
+++ .github/workflows/publish_snapshot.yml
@@ -0,0 +1,13 @@
+name: "Release per-commit snapshots"
+on: push
+
+jobs:
+ setup-android:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@master
+ - name: Publish snapshot
+ run: ./gradlew publish
+ env:
+ USERNAME: msfjarvis
+ PASSWORD: ${{ secrets.PACKAGES_TOKEN }}
```
That's it! Once you push to GitHub, you'll see the [action running](https://github.com/msfjarvis/github-packages-deployment-sample/commit/42e1f6609bf9f2abe8e181296a57d86df648b4d4/checks?check_suite_id=322323808) in your repository's Actions tab and a [corresponding package](https://github.com/msfjarvis/github-packages-deployment-sample/packages/60429) in the Packages tab once the workflow finishes executing.
### Closing notes
The requirement to authenticate for packages is a significant problem with GitHub Packages' adoption, giving an edge to solutions like [JitPack](https://jitpack.io) which handle the entire process automagically. As mentioned earlier, I did contact GitHub support about it and got this back.
![GitHub support reply about authentication requirement for packages](/uploads/github_packages_support_response.webp)
My interpretation of this is quite simply that **it's gonna take a while**. I hope not :)

View File

@ -0,0 +1,60 @@
+++
categories = ["webdev"]
date = 2019-12-17
summary = "Analytics platforms are often overwhelming and a privacy nightmare -- here's how to bring analytics to the backend with very simple tooling"
devLink = "https://dev.to/msfjarvis/server-side-analytics-with-goaccess-pg8"
slug = "serverside-stats-with-goaccess"
socialImage = "uploads/goaccess_social.webp"
tags = ["caddyserver", "goaccess", "analytics"]
title = "Server-side analytics with Goaccess"
+++
Analytics are a very helpful aspect of any development. They allow developers to know what parts of their apps are visited the most often and can use more attention, and for bloggers to know what content does or does not resonate with their readers.
There are many, many analytics providers and software stacks each with their specific pros and cons, but nearly all managed analytics come with the overarching concern of privacy of user data. [Google Analytics](https://analytics.google.com/) is a _huge_ analytics vendor, with the capabilities to almost accurately extrapolate even the **age** of your visitors. That's nuts, and honestly scary.
Analytics platforms often drown us in data and statistics most of which we don't really care for or use. Wouldn't it be far easier if we were able to both remove the client-side aspect of analytics, as well as remove unused information and focus on what we need? Enter [Goaccess](https://goaccess.io).
## What is Goaccess
Goaccess is an **open-source**, **real-time** web log analyzer. In other words, it parses your webserver's logs and generates actionable reports from them in HTML, JSON or CSV, based on your needs. It is highly configurable and allows you to also modify the generated report by anonymizing IPs, ignoring crawlers, determining the real operating systems of the users and some more.
## The setup
To create a compelling analytics experience, we'll need to use Goaccess' `--real-time-html` option, that creates an HTML report, and an accompanying `WebSocket` server that will dispatch a request to update the page data every time goaccess parses updated logs. Here's a peek at Goaccess' terminal visualizer, to get an idea about the datasets you can expect from the web version.
![Goaccess in the terminal](/uploads/goaccess_terminal.webp)
Goaccess supports most common webserver log formats, and [some more](https://goaccess.io/man#options) with the option to provide your own format if you're using custom solutions. I'm using `VCOMMON`, as that is the default log format of my webserver of choice, [Caddy](https://caddyserver.com). Here's the command executed by the systemd unit that I use for goaccess. I'll explain every option in a bit.
```bash
goaccess --log-format=VCOMMON \
--ws-url=wss://stats.example.com/ws \
--output=${STATS_DIR}/index.html \
--log-file=/etc/logs/requests.log \
--no-query-string \
--anonymize-ip \
--double-decode \
--real-os \
--real-time-html
```
- `--ws-url`: This option allows us to specify the path for our WebSocket server that's responsible for dispatching updates.
- `--output`: File to dump HTML reports into.
- `--log-file`: The source file to read logs from.
- `--no-query-string`: Does not parse the query string from URLs (`example.org/contact?utm_source=twitter` => `example.org/contact`). This can greatly decrease memory consumption and is often not helpful.
- `--double-decode`: Attempts to decode values like user-agent, request and referrer that are often encoded twice.
- `--real-os`: Displays the real OS names behind the browsers.
- `--real-time-html`: The hero of the show -- the option that makes our analytics real-time and self-updating in the browser.
The final step in this process is to expose the local WebSocket server to the `/ws` endpoint of your domain to allow real-time updates to work. Here's how I do it in Caddy.
```bash
https://stats.example.com/ws {
proxy / localhost:7890 {
websocket
}
}
```
And that's it! Your analytics page should be up at your specified URL, updating on every new request and visitor.

View File

@ -0,0 +1,74 @@
+++
categories = ["rust", "dev"]
date = 2020-07-05
summary = "Rust programs are pretty fast on their own, but you can slightly augment their performance with some simple tricks."
slug = "simple-tricks-for-faster-rust-programs"
socialImage = "uploads/cuddlyferris.webp"
tags = ["perf"]
title = "Simple tricks for faster Rust programs"
+++
Rust is _pretty_ fast. Let's get that out of the way. But sometimes, _pretty_ fast is not fast enough.
Fortunately, it's also _pretty_ easy to slightly improve the performance of your Rust binaries with minimal code changes. I'm gonna go over some of these tricks that I've picked up from many sources across the web (I'll post a small list of **very** good blogs run by smart Rustaceans who cover interesting Rust related things).
## Turn on full LTO
Rust by default runs a "thin" LTO pass across each individual [codegen unit](https://doc.rust-lang.org/rustc/codegen-options/index.html#codegen-units). This can be optimized with a very simple addition to your `Cargo.toml`
```toml
[profile.release]
codegen-units = 1
lto = "fat"
```
This makes the following changes to the `release` profile:
- Forces `rustc` to build the entire crate as a single unit, which lets LLVM make smarter decisions about optimization thanks to all the code being together.
- Switches LTO to the `fat` variant. In `fat` mode, LTO will perform [optimization across the entire dependency graph](https://doc.rust-lang.org/rustc/codegen-options/index.html#lto) as opposed to the default option of doing it just to the local crate.
## Use a different memory allocator
Some time ago, Rust switched from using `jemalloc` on all platforms to the OS-native allocator. This caused serious performance regressions in many programs like [fd](https://github.com/sharkdp/fd). To switch back to `jemalloc`, check out [this](https://github.com/sharkdp/fd/pull/481) PR for the changes required.
Note that this alone is not guaranteed to be helpful, and a lot of programs see little to no benefit, so please run your own benchmarks with [hyperfine](https://github.com/sharkdp/hyperfine) to confirm whether or not it helped you.
## Cows!
Rustaceans [love their cows](https://www.reddit.com/r/rust/comments/8o1pxh/the_secret_life_of_cows/), and it's one of the most underrated APIs in the Rust standard library. It's claim to fame is relatively simple - it's a smart copy-on-write pointer. Or well, a smart clone-on-write pointer, as copy means something different in Rust as opposed to other languages.
Given a data wrapped in a `std::borrow::Cow`, you can avoid cloning the data if you only want immutable read access, which saves memory and improves runtime performance as well. Over a large codebase, these savings pile up to create a noticeable enough difference. Here's an example from the Rust standard library that explains this well.
```rust
use std::borrow::Cow;
fn abs_all(input: &mut Cow<[i32]>) {
for i in 0..input.len() {
let v = input[i];
if v < 0 {
// Clones into a vector if not already owned.
input.to_mut()[i] = -v;
}
}
}
// No clone occurs because `input` doesn't need to be mutated.
let slice = [0, 1, 2];
let mut input = Cow::from(&slice[..]);
abs_all(&mut input);
// Clone occurs because `input` needs to be mutated.
let slice = [-1, 0, 1];
let mut input = Cow::from(&slice[..]);
abs_all(&mut input);
// No clone occurs because `input` is already owned.
let mut input = Cow::from(vec![-1, 0, 1]);
abs_all(&mut input);
```
# References
- Pascal Hertleif's [blog](https://deterministic.space/) - He's a very popular and active Rust developer and writes amazing, insightful articles.
- Amos Wenger's [blog](https://fasterthanli.me) - Amos' articles often go over important topics like API design through a comparison angle between Rust and another language to highlight differences and benefits to each approach.
- Stjepan Glavina's [blog](https://stjepang.github.io/) - He's done a lot of interesting perf-related work including optimising sorting in the stdlib and building async libraries. His writeups for the library work are very intriguing and go into great detail about the process.

View File

@ -0,0 +1,27 @@
+++
categories = ["news"]
date = 2020-02-09
summary = "The Viscerion experiment that started more than a year ago is now coming to an end. Here's what's happening."
slug = "sunsetting-viscerion"
socialImage = "uploads/viscerion_social.webp"
tags = ["personal"]
title = "Sunsetting Viscerion"
+++
Viscerion is one of my more known and loved apps that I myself continue to enjoy working on and using. The project started back in 2018 following a short stint with WireGuard working on their own Android app, and is now being shut down.
> TL;DR: The work I have been doing on Viscerion for the past year will become a part of the upstream WireGuard app over the next 6 months under an agreement between me and Jason Donenfeld, the WireGuard creator and lead developer.
## The story behind Viscerion
When I initially started this project, it was called WireGuard-KT, and as the dumb and literal name suggests, began with me rewriting the app into Kotlin. I was not a huge fan of Kotlin at that point in time, but was eager to learn and this was the perfect opportunity. My ambitions were rather too lofty for the upstream project at that time and they had to let me go from the internship position, presenting the option to pursue everything I had planned, in a personal capacity.
When I was working on the upstream app, I was seeding builds of my staging branches to a group of friends, who also became the first users/testers of WireGuard-KT. They encouraged me to publish the app to the Play Store which has since been unpublished over copyright concerns about the similarity of the name and resulted in the rebranding of the project as Viscerion.
## Fast-forwarding to today
Jason contacted me, extending an invitation to bring my work from Viscerion to upstream under a paid contract which would involve shutting down Viscerion since the reason why it was created in the first place was now void (consider this like Inbox and Gmail but an alternate universe where the most important features weren't being skipped over). After coming to a mutual agreement over what features and changes would be and what would be the process of deprecating Viscerion, I was officially hired and given full push access.
## What's going to happen with Viscerion
I have submitted a final [5.2.11](https://github.com/msfjarvis/viscerion/releases/latest) release to the [Play Store](https://play.google.com/store/apps/details?id=me.msfjarvis.viscerion), and the repository has been made read-only. The Play Store listing will be unpublished after 60 days and will only be available to existing users. Hearty thanks to every single user of Viscerion that has helped make this experiment a roaring success and to Jason for finally coming around :p

View File

@ -0,0 +1,95 @@
+++
categories = ["email"]
date = 2020-04-13
summary = "I recently moved from forwarding my email through Google to hosting it through Purelymail.com. Here are some thoughts about the process and the motivation behind it"
devLink = "https://dev.to/msfjarvis/switching-my-email-to-purelymail-4l6i"
slug = "switching-my-email-to-purelymail"
tags = ["purelymail"]
title = "Switching my email to Purelymail"
+++
Email is a very crucial part of my workflow, and I enjoy using it (and also why I'm beyond excited for what Basecamp has in store with [hey.com](https://hey.com)). I have switched emails a couple times over the many years I have had an internet presence, finally settling on [me@msfjarvis.dev](mailto:me@msfjarvis.dev) when I bought my domain. There began the problem.
I attempt to self-host things when reasonable, to retain some control and not have a single point of failure outside my control that would lock me out. With email, that part is a constant, uphill battle against spam filters to ensure your domain doesn't land in a big filter list that will then start trashing all your email and make life hard. Due to this, I never self-hosted email, instead choosing to forward it through Google Domains (the registrar for this domain) to my existing Google account. While this is a very reliable approach, it still involves depending heavily on my Google account. This has proven to be a problem in many ways, including being locked out after opting into Advanced Protection and people's accounts being banned for a number of reasons completely unrelated to email. If something like this were to happen to me, I would lose both my Google as well as my domain email instantly. A very scary position to be in for anybody.
A couple days ago, [Jake Wharton](https://twitter.com/JakeWharton) retweeted a blog post from [Roland Szabo](https://twitter.com/rolisz) titled ['Moving away from GMail'](https://rolisz.ro/2020/04/11/moving-away-from-gmail/). I read through it, looked at PurelyMail, and was convinced that it was really the solution for my little problem. I am a big believer in paying in dollaroos rather than data so I really loved the transparency behind pricing, data use, infrastructure and just about everything else. Signed up!
## Migration
Like any other email provider, all you need to configure for PurelyMail to work is DNS. I use Cloudflare for my sites, so there was nothing to do on the Google Domains side of things. I left the forwarding setup as-is to allow any lagging DNS resolvers to still be able to get email to me, even if its to my Google account. I hope to get rid of that setting in the near future since I believe the change will have propagated by then. I maintain my DNS settings under a git repository, using StackExchange's excellent [dnscontrol](http://stackexchange.github.io/dnscontrol/) tool. DNSControl operates on a JS-like syntax that is parsed, evaluated and then used to publish to the DNS provider of choice. Neat stuff! The changes required looked something like this:
```diff
diff --git dnsconfig.js dnsconfig.js
index 29b8d1a927ab..01ea2af1d448 100644
--- dnsconfig.js
+++ dnsconfig.js
@@ -6,7 +6,7 @@
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_CF = NewDnsProvider('cloudflare', 'CLOUDFLAREAPI');
+var CF_PROXY_OFF = {'cloudflare_proxy': 'off'}; // Proxy disabled.
@@ -18,25 +18,17 @@ var RECORDS = [
+ CNAME('_dmarc', '_dmarcroot.purelymail.com.', CF_PROXY_OFF),
+ CNAME('purelymail1._domainkey', 'key1._dkimroot.purelymail.com.', CF_PROXY_OFF),
+ CNAME('purelymail2._domainkey', 'key2._dkimroot.purelymail.com.', CF_PROXY_OFF),
+ CNAME('purelymail3._domainkey', 'key3._dkimroot.purelymail.com.', CF_PROXY_OFF),
- MX('@', 10, 'alt1.gmr-smtp-in.l.google.com.', TTL('1d')),
- MX('@', 20, 'alt2.gmr-smtp-in.l.google.com.', TTL('1d')),
- MX('@', 30, 'alt3.gmr-smtp-in.l.google.com.', TTL('1d')),
- MX('@', 40, 'alt4.gmr-smtp-in.l.google.com.', TTL('1d')),
- MX('@', 5, 'gmr-smtp-in.l.google.com.', TTL('1d')),
- TXT('@', 'v=spf1 include:_spf.google.com ~all', TTL('3600s')),
+ MX('@', 50, 'mailserver.purelymail.com.'),
+ TXT('@', 'v=spf1 include:_spf.purelymail.com ~all'),
+ TXT('@', 'purelymail_ownership_proof=**redacated**'),
];
```
The only 'unexpected' change I had to make was to disable Cloudflare's proxy feature for the CNAME records. Once that was done, PurelyMail was instantly able to verify all DNS records and I was in business.
## Pros and Cons of the switch
I've been on PurelyMail for about a day now and poked around enough to have a comprehensive idea of what's different from my usual GMail flow, so let's get into that.
### Pros
#### You pay for it
By now everybody must have realized a simple fact: If you're not paying, you're the product. I do not wish to be a product. Your hard-earned money is more likely to keep companies from being shady than your emails. PurelyMail is a one man operation, which makes it more trustworthy to me than Google's massive scale. Google does not care for a single user, PurelyMail will.
#### Transparency
PurelyMail tells you upfront about what they charge and how they arrive at that number. There is no contract period, and if you wish to have fine grained control over what you pay, you can use their advanced pricing section to calculate your costs based on your exact needs. The website is straightforward and to the point, there is no glossy advertising to obscure flaws, and their security practices are all [documented](https://purelymail.com/docs/security) on their site, front and center.
#### Failsafe
My GMail is tied to my Google account, which means anything that flags my Google account will bring down my ability to have email. This is a scary position to be in. Having my email separate from my Google account frees me from that looming danger.
#### Easy export
PurelyMail has a tool called [`mailPort`](https://purelymail.com/docs/mailPort) that lets you move email between PurelyMail and other providers. You can bring your entire mailbox to PurelyMail when switching to it, or back to wherever you go next should it not feel sufficient for your needs. No questions asked, and no bullshit. It just works.
#### No client lock-in
Because PurelyMail has no bells and whistles, you won't be penalized on the feature side of things if you use one client compared to another. Things stay consistent.
### Cons
#### You pay for it
I am in a fortunate position where I can pay for things solely based on principle, without having to worry _too_ much. Not everybody is similarly blessed, or you may simply have technical issues with being able to pay online for internet things. Stripe and PayPal are not available globally, and fees are often insane. I completely understand.
#### Roundcube is great, but it ain't no GMail
PurelyMail uses the Roundcube frontend for its webmail offering, with a couple extra themes. It's not the prettiest, and does not have a lot of bells and whistles that you might get accustomed to from GMail. The change is a bit rough honestly, but the pros certainly outweigh the cons. On the bright side, its easier to influence product direction at PurelyMail, so get on the issue tracker and request or vote for features!
#### No dedicated client
Not having a specialized client unfortunately also means that you'll have to shop around for what works. I still use the GMail mobile app, but K-9 Mail is also pretty decent.
## Conclusion
I have begun moving my various accounts to my domain mail as and when they remind me of their existence (55 left still, if my [pass](https://passwordstore.org/) repository is to be believed), and hope to eventually be able to get by without the pinned GMail tab in my browser :)
PurelyMail has proven to be an excellent platform so far. Support has been swift and helpful, and I haven't had any bad surprises. I hope to be a content user for as long as I possibly can :)

View File

@ -0,0 +1,18 @@
+++
categories = ["teachingkotlin", "kotlin", "dev", "android"]
date = 2019-09-20
summary = "Kotlin's been great for me -- and millions others, as evident by its explosive growth. Long-time Java developers may feel hesitant to give it a shot. This series aims to smoothen this transition, letting people know what benefits they might reap from Kotlin, and what differences should they be careful about."
devLink = "https://dev.to/msfjarvis/teachingkotlin-kotlin-for-android-java-developers-1fo3"
slug = "teaching-kotlin--kotlin-for-android-java-developers"
socialImage = "uploads/teachingkotlin_social.webp"
tags = []
title = "#TeachingKotlin - Kotlin for Android Java developers"
+++
Anybody familiar with my work knows that I am a fan of the [Kotlin](https://kotlinlang.org/ "Kotlin") programming language, especially it's interoperability with Java with respect to Android. I'll admit, I've not been a fan since day one. The abundant lambdas worried me and everything being that much shorter to implement was confusing to a person whose first real programming task was in the Java programming language.
As I leaped over the initial hurdle of hesitation and really got into Kotlin, I was mindblown. Everything is so much better! Being able to break away from Java's explicit verbosity into letting the language do things for you is a bit daunting at first but over time you'll come to appreciate the time you save and in turn how many potential problems you can avoid by simply not having to do everything yourself. [Can't have bugs if you don't write code](https://github.com/kelseyhightower/nocode) :p
As I've gotten more and more into the Kotlin ecosystem and community and converted developers into adopting Kotlin, into taking that first step, I've realised most of them have a common set of concerns and often a lack of knowledge about what Kotlin actually brings to the table and what are the drawbacks of using a "new" language over an established behemoth like Java.
Hence I've decided to publish a series of posts outlining exactly that -- What to expect when moving to Kotlin from Java, the benefits and the common pitfalls as well as current limitations that may or may not hinder said move. The first post of the series will go up on the upcoming Monday evening 6:00 PM IST (Indian Standard Time), and all following ones will be published at the same time every week. I'd like to keep this up for as long as possible and so I'm not declaring this as a `n`-part series right off the bat. We'll figure it out as we go :)

View File

@ -0,0 +1,191 @@
+++
categories = ["kotlin", "android", "teachingkotlin"]
date = 2019-09-23
summary = "Part 1 of my #TeachingKotlin, this post goes over Kotlin classes, objects and how things like finality and staticity vary between Java and Kotlin."
slug = "teaching-kotlin--classes-and-objects"
tags = []
title = "#TeachingKotlin Part 1 - Classes and Objects and everything in between"
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-1-classes-and-objects-and-everything-in-between-5bn0"
socialImage = "uploads/teachingkotlin_social.webp"
+++
Classes in Kotlin closely mimic their Java counterparts in implementation, with some crucial changes that I will attempt to outline here.
Let's declare two identical classes in Kotlin and Java as a starting point. We'll be making changes to them alongside to show how different patterns are implemented in the two languages.
Java:
{{< highlight java >}}
class Person {
private final String name;
public Person(String name) {
this.name = name;
}
}
{{< /highlight >}}
Kotlin:
{{< highlight kotlin >}}
class Person(val name: String)
{{< /highlight >}}
The benefits of using Kotlin immediately start showing! But let's go over this in a sysmetatic fashion and break down each aspect of what makes Kotlin so great.
## Constructors and parameters
Kotlin uses a very compact syntax for describing primary constructors. With some clever tricks around default values, we can create many constructors out of a single one!
Notice the `val` in the parameter name. It's a concise syntax for declaring variables and initializing them from the constructor itself. Like any other property, they can be mutable (`var`) or immutable (`val`). If you remove the `val` in our `Person` constructor, you will not have a `name` variable available on its instance, i.e., `Person("Person 1").name` will not resolve.
The primary constructor cannot have any code so Kotlin provides something called 'initializer blocks' to allow you to run initialization code from your constructor. Try running the code below in the [Kotlin playground](https://play.kotlinlang.org/)
{{< highlight kotlin >}}
class Person(val name: String) {
init {
println("Invoking constructor!")
}
}
val \_ = Person("Matt")
{{< /highlight >}}
Moving on, let's add an optional age parameter to our classes, with a default value of 18. To make it convenient to see how different constructors affect values, we're also including an implementation of the `toString` method for some classing print debugging.
Java:
{{< highlight java >}}
class Person {
private final String name;
private int age = 18;
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name);
this.age = age;
}
@Override
public String toString() {
return "Name=" + name + ",age=" + Integer.toString(age);
}
}
{{< /highlight >}}
Kotlin:
{{< highlight kotlin >}}
class Person(val name: String, val age: Int = 18) {
override fun toString() : String {
// I'll go over string templates in a future post, hold me to it :)
return "Name=$name,age=$age"
}
}
{{< /highlight >}}
Lots of new things here! Let's break them down.
Kotlin has a feature called 'default parameters', that allows you to specify default values for parameters, thus making them optional when creating an instance of the class.
Let's take these for a spin on [repl.it](https://repl.it)!
<iframe frameborder="0" width="100%" height="500px" src="https://repl.it/@msfjarvis/ButteryYellowgreenTraining?lite=true"></iframe>
<iframe frameborder="0" width="100%" height="500px" src="https://repl.it/@msfjarvis/DarkcyanDisfiguredDatalogs?lite=true"></iframe>
Both work perfectly well, but you know which one you'd enjoy writing more ;)
An important note here is that constructors with default values don't directly work with Java if you're writing a library or any code that would require to interop with Java. Use the Kotlin `@JvmOverloads` annotation to handle that for you.
{{< highlight kotlin >}}
class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
override fun toString() : String {
return "Name=$name,age=$age"
}
}
{{< /highlight >}}
Doing this will generate constructors similar to how we previously wrote in Java, to allow both Kotlin and Java callers to work.
## Finality of classes
In Kotlin, all classes are final by default, and cannot be inherited while Java defaults to extensible classes. The `open` keyword marks Kotlin classes as extensible, and the `final` keyword does the opposite on Java.
Java:
{{< highlight java >}}
public class Man extends Person { /_ Class body _/ } // Valid in Java
{{< /highlight >}}
Kotlin:
{{< highlight kotlin >}}
class Man(val firstName: String) : Person(firstName) // Errors!
{{< /highlight >}}
Trying it out in the Kotlin REPL
{{< highlight kotlin >}}
> > > class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
> > > ... override fun toString() : String {
> > > ... return "Name=$name,age=$age"
> > > ... }
> > > ... }
> > > class Man(val firstName: String) : Person(firstName)
> > > error: this type is final, so it cannot be inherited from
> > > class Man(val firstName: String) : Person(firstName)
^
{{< /highlight >}}
Makes sense, since that's default for Kotlin. Let's add the `open` keyword to our definition of `Person` and try again.
{{< highlight kotlin >}}
> > > open class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
> > > ... override fun toString() : String {
> > > ... return "Name=$name,age=$age"
> > > ... }
> > > ... }
> > > class Man(val firstName: String) : Person(firstName)
> > > println(Man("Henry"))
> > > Name=Henry,age=18
> > > {{< /highlight >}}
And everything works as we'd expect it to. This is a behavior change that is confusing and undesirable to a lot of people, so Kotlin provides a compiler plugin to mark all classes as `open` by default. Check out the [`kotlin-allopen`](https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin) page for more information about how to configure the plugin for your needs.
## Static utils classes
Everybody knows that you don't have a real project until you have a `StringUtils` class. Usually it'd be a `public static final` class with a bunch of static methods. While Kotlin has a sweeter option of [extension functions and properties](https://kotlinlang.org/docs/tutorials/kotlin-for-py/extension-functionsproperties.html), for purposes of comparison we'll stick with the old Java way of doing things.
Here's a small function I use to convert Android's URI paths to human-readable versions.
Java:
{{< highlight java >}}
public static final class StringUtils {
public static String normalizePath(final String str) {
return str.replace("/document/primary:", "/sdcard/");
}
}
{{< /highlight >}}
Kotlin:
{{< highlight kotlin >}}
object StringUtils {
// I'll cover this declaration style too. It's just the first post!
fun normalizePath(str: String): String = str.replace("/document/primary:", "/sdcard/")
}
{{< /highlight >}}
A recurring pattern with Kotlin is concise code, as you can see in this case.
That's all for this one! Let me know in the comments about what you'd prefer to be next week's post about or if you feel I missed something in this one and I'll definitely try to make it happen :)

View File

@ -0,0 +1,125 @@
+++
categories = ["kotlin", "android", "teachingkotlin"]
date = 2019-09-30
summary = "The second post in #TeachingKotlin series, this post goes over Kotlin's variables and their attributes, like visibility and getters/setters."
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-2-variables-2api"
slug = "teaching-kotlin--variables"
socialImage = "uploads/teachingkotlin_social.webp"
tags = []
title = "#TeachingKotlin Part 2 - Variables"
+++
Even the variables in Kotlin are supercharged!
Let's start with a simple [data class](https://kotlinlang.org/docs/reference/data-classes.html#data-classes) and see how the variables in there behave.
```kotlin
data class Student(val name: String, val age: Int, val subjects: ArrayList<String>)
```
To use the variables in this class, Kotlin let's you directly use the dot notation for accessing.
```kotlin
>>> val s1 = Student("Keith Hernandez", 21, arrayListOf("Mathematics", "Social Studies"))
>>> println(s1.name)
Keith Hernandez
>>> println(s1) // data classes automatically generate `toString` and `hashCode`
Student(name=Keith Hernandez, age=21, subjects=[Mathematics, Social Studies])
```
For Java callers, Kotlin also generates getters and setter methods.
```java
final Student s1 = new Student("Keith Hernandez", 21, arrayListOf("Mathematics", "Social Studies"));
System.out.println(s1.getName());
System.out.println(s1);
```
The same properties apply to variables in non-data classes as well.
```kotlin
>>> class Item(id: Int, name: String) {
... val itemId = id
... val itemName = name
... }
>>> val item = Item(0, "Bricks")
>>> println(item.itemId)
0
>>> println(item)
Line_4$Item@46fb460a
>> >
```
As you can notice, the `toString` implementation is not identical to our data classes but that's a topic for another post. Back to variables!
## Customizing getters and setters
While Kotlin creates getters and setters automatically, we can customize their behavior.
```kotlin
class Item(id: Int, name: String) {
var itemId = id
var itemName = name
var currentState: Pair<Int, String> = Pair(itemId, itemName)
set(value) {
itemId = value.first
itemName = value.second
field = value
}
override fun toString() : String {
return "id=$itemId,name=$itemName"
}
}
```
Let's take this for a spin in the Kotlin REPL and see how our `currentState` field behaves.
```kotlin
>>> val item = Item(0, "Nails")
>>> println(item)
id=0,name=Nails
>>> item.currentState = Pair(1, "Bricks")
>>> println(item)
id=1,name=Bricks
```
Notice how setting a new value to currentState mutates the other variables as well? That's because of our custom setter. These setters are identical to a normal top-level function except a reference to the field in question is available as the variable `field` for manipulation.
## Visibility modifiers
Kotlin's visibility modifiers aren't very well explained. There's the standard `public`, `private` and `protected`, but also the new `inner` and `internal`. I'll attempt to fill in those gaps.
### `inner`
`inner` is a modifier that only applies to classes declared within another one. It allows you to access members of the enclosing class. A sample might help explain this better.
```kotlin
class Outer {
private val bar: Int = 1
inner class Inner {
fun foo() = bar
}
}
val demo = Outer().Inner().foo() // == 1
```
The keyword `this` does not behave as some would normally expect in inner classes, go through the Kotlin documentation for `this` [here](https://kotlinlang.org/docs/reference/this-expressions.html) and I'll be happy to answer any further questions :)
### `internal`
`internal` applies to methods and properties in classes. It makes the field/method 'module-local', allowing it to be accessed within the same module and nowhere else. A module in this context is a logical compilation unit, like a Gradle subproject.
That's all for today! Hope you're liking the series so far. I'd love to hear feedback on what you want me to cover next and how to improve what I write :)

View File

@ -0,0 +1,54 @@
+++
categories = ["kotlin", "android", "teachingkotlin"]
date = 2019-12-16
summary = "Part 3 of #TeachingKotlin covers some subtle differences between Kotlin and Java that might affect your codebases as you start migrating to or writing new code in Kotlin."
devLink = "https://dev.to/msfjarvis/teachingkotlin-part-3-caveats-coming-from-java-2e1k"
slug = "teachingkotlin-part-3--caveats-coming-from-java"
socialImage = "uploads/teachingkotlin_social.webp"
tags = []
title = "#TeachingKotlin Part 3 - Caveats coming from Java"
+++
When you start migrating your Java code to Kotlin, you will encounter multiple subtle changes that might catch you off guard. I'll document some of these gotchas that I and other people I follow have found and written about.
## Splitting strings
Java's `java.lang.String#split` [method](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-) takes a `String` as it's first argument and creates a `Regex` out of it before attempting to split. Kotlin, however, has two variants of this method. One takes a `String` and uses it as a plaintext delimiter, and the other takes a `Regex` behaving like the Java method we mentioned earlier. Code that was directly converted from Java to Kotlin will fail to accommodate this difference, so be on the lookout.
## Runtime asserts
Square's [Jesse Wilson](https://twitter.com/jessewilson) found through an [OkHttp bug](https://github.com/square/okhttp/issues/5586) that Kotlin's `assert` function differs from Java's in a very critical way - the asserted expression is _always_ executed. He's written about it on his blog which you can check out for a proper write up: [Kotlins Assert Is Not Like Javas Assert](https://publicobject.com/2019/11/18/kotlins-assert-is-not-like-javas-assert/).
TL; DR Java's `assert` checks the `java.lang.Class#desiredAssertionStatus` method **before** executing the expression, but Kotlin does it **after** which results in unnecessary, potentially significant overhead.
```java
// Good :)
@Override void flush() {
if (Http2Stream.class.desiredAssertionStatus()) {
if (!Thread.holdsLock(Http2Stream.this) == false) {
throw new AssertionError();
}
}
}
```
```kotlin
// Bad :(
override fun flush() {
if (!Thread.holdsLock(this@Http2Stream) == false) {
if (Http2Stream::class.java.desiredAssertionStatus()) {
throw AssertionError()
}
}
}
```
## Binary incompatibility challenges
[Jake Wharton](https://twitter.com/JakeWharton) wrote in his usual in-depth detail about how the Kotlin `data` class modifier makes it a challenge to modify public API without breaking source and binary compatibility. Kotlin's sweet language features that provide things like default values in constructors and destructuring components become the very thing that inhibits binary compatibility.
Take about 10 minutes out and give Jake's article a read: [Public API challenges in Kotlin](https://jakewharton.com/public-api-challenges-in-kotlin/).
## Summary
While migrating from Java to Kotlin is great, there are many subtle differences between the languages that can blindside you and must be taken into account. It's more than likely that these problems may never affect you, but it's probably helpful to know what's up when they do :)

View File

@ -0,0 +1,173 @@
+++
categories = ["github-actions"]
date = 2021-01-02T00:00:00Z
summary = "GitHub Actions is a power CI/CD platform that can do a lot more than your traditional CI systems. Here's some tips to get you started with exploring its true potential."
slug = "github-actions-tips-tricks"
socialImage = "/uploads/actions_social.webp"
tags = ["tips and tricks", "schedules", "jobs", "workflows"]
title = "Tips and Tricks for GitHub Actions"
+++
GitHub Actions has grown at a rapid pace, and has become the CI platform of choice for most open source projects. The recent changes to Travis CI's pricing for open source is certainly bound to accelerate this even more.
Due to it being a first-party addition to GitHub, Actions has nearly infinite potential to run jobs in reaction to changes on GitHub. You can automatically set labels to newly opened pull requests, greet first time contributors, and more.
Let's go over some things that you can do with Actions, and we'll end it with some safety related tips to ensure that your workflows are secure from both rogue action authors as well as rogue pull requests.
## Running workflows based on a cron trigger
GitHub Actions can trigger the execution of a workflow in response to a large list of events as given [here](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows), one of them being a cron schedule. Let's see how we can use the schedule feature to automate repetitive tasks.
For [Android Password Store](https://msfjarvis.dev/aps), we maintain a list of known [public suffixes](https://publicsuffix.org/) to be able efficiently detect the 'base' domain of the website we're autofilling into. This list changes frequently, and we typically sync our repository with the latest copy on a weekly basis. Actions enables us to do this automatically:
```yaml
name: Update Publix Suffix List data
on:
schedule:
- cron: "0 0 * * 6"
jobs:
update-publicsuffix-data:
# The actual workflow doing the update job
```
Putting the cron expression into [crontab guru](https://crontab.guru/#0_*_*_*_6), you can see that it executes at 12AM on every Saturday. Going through the merged pull requests in APS, you will also notice that the [publicsuffixlist pull requests](https://github.com/android-password-store/Android-Password-Store/pulls?q=is%3Apr+is%3Amerged+sort%3Aupdated-desc+label%3APSL) indeed happen no sooner than 7 days apart.
Mine is a very naive example of how you can use cron triggers to automate parts of your workflow. The [Rust](https://github.com/rust-lang) project uses these same triggers to implement a significantly more important aspect of their daily workings. Rust maintains a repository called [glacier](https://github.com/rust-lang/glacier) which contains a list of internal compiler errors (ICEs) and code fragments to reproduce each of them. Using a similar cron trigger, this repository checks each new nightly release of Rust to see if any of these compiler crashes were resolved silently by a refactor. When it comes across a ICE that was fixed (compiles correctly or fails with errors rather than crashing the compiler), it files a [pull request](https://github.com/rust-lang/glacier/pulls?q=is%3Apr+author%3Aapp%2Fgithub-actions+sort%3Aupdated-desc) moving the reproduction file to the `fixed` pile.
## Running jobs based on commit message
Continuous delivery is great, but sometimes you want slightly more control. Rather than run a deployment task on each push to your repository, what if you want it to only run when a specific keyword is in the commit message? Actions has support for this natively, and the deployment pipeline of this very site relies on this feature:
```yaml
name: Deploy to Cloudflare Workers Sites
on:
push:
branches:
- main
jobs:
deploy-main:
if: "contains(github.event.head_commit.message, '[deploy]')"
# Set up wrangler and push to the production environment
deploy-staging:
if: "contains(github.event.head_commit.message, '[staging]')"
# Set up wrangler and push to the staging environment
```
This snippet defines a job that is only executed when the top commit of the push contains the text `[deploy]` in its message, and another that only runs when the commit message contains `[staging]`. Together, these let me control if I want a change to not be immediately deployed, deployed to either the main or staging site, or to both at the same time. So now I can update a draft post without a full re-deployment of the main site, or make a quick edit to a published post that doesn't need to be reflected in the staging environment.
The core logic of this operation is composed of three parts. The [github context](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#github-context), the [if conditional](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idif) and the [contains](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions#contains) method. The linked documentation for each does a great job at explaining them, and has further references to allow you to fulfill even more advanced use cases.
## Testing across multiple configurations in parallel
Jobs in a workflow run in parallel by default, and GitHub comes with an amazing matrix functionality that can automatically generate multiple jobs for you from a single definition. Take this specific example:
| | Windows | MacOS | Ubuntu |
| ------- | ----------------- | --------------- | ---------------- |
| Stable | Windows + Stable | MacOS + Stable | Ubuntu + Stable |
| Beta | Windows + Beta | MacOS + Beta | Ubuntu + Beta |
| Nightly | Windows + Nightly | MacOS + Nightly | Ubuntu + Nightly |
> {{< sub "This particular matrix is for Rust, to test a codebase across Windows, Ubuntu, and macOS using the Rust stable, beta, and nightly toolchains." >}}
In GitHub Actions, we can simply provide the platforms (Windows, MacOS and, Ubuntu) and the Rust channels (Stable, Beta, and Nightly) inside a single job and let it figure out how to make the permutations and create separate jobs for them. To configure such a matrix, we write something like this:
```yaml
jobs:
check-rust-code:
strategy:
# Defines a matrix strategy
matrix:
# Sets the OSes we want to run jobs on
os: [ubuntu-latest, windows-latest, macOS-latest]
# Sets the Rust channels we want to test against
rust: [stable, beta, nightly]
# Make the job run on the OS picked by the matrix
runs-on: ${{ matrix.os }}
steps:
- uses: actions-rs/toolchain@v1
with:
profile: minimal
components: rustfmt, clippy
# Installs the Rust toolchain for the channel picked by the matrix
toolchain: ${{ matrix.rust }}
```
This will automatically generate 9 (3 platforms \* 3 Rust channels) parallel jobs to test this entire configuration, without requiring us to manually define each of them. [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) at its finest :)
## Make a job run after another
By default, jobs defined in a workflow file run in parallel. However, we might need a more sequential order of execution for some cases, and GHA does include support for this case. Let's try another real world example!
[LeakCanary](https://github.com/square/leakcanary) has a [checks job](https://github.com/square/leakcanary/blob/f5343aca6e019994f7e69a28fac14ca18e071b88/.github/workflows/main.yml) that runs on each push to the main branch and on each pull request. They wanted to add support for snapshot deployment, in order to finally retire Travis CI. To make this happen, I simply added a [new job](https://github.com/square/leakcanary/pull/2044/commits/a6f6c204559396120836b27c0b2a46d3e444c728) to the same workflow, having it run only on push events and have a dependency on the checks job. This ensures that there won't be a snapshot deployment until all tests are passing on the main branch. The relevant parts of the workflow configuration are here:
```yaml
on:
pull_request:
push:
branches:
- main
jobs:
checks:
# Runs automated unit and instrumentation tests
snapshot-deployment:
# Only run if the push event triggered this workflow run
if: "github.event_name == 'push'"
# Run after the 'checks' job has passed
needs: [checks]
```
# Mitigating security concerns with Actions
GitHub Actions benefits from a vibrant ecosystem of user-authored actions, which opens it up to equal opportunities for abuse. It is relatively easy to work around the common ones, and I'm going to outline them here. I'm no authority on security, and these recommendations are based on a combination of my reading and understanding. These _should_ be helpful, but this list is not exhaustive, and you should exercise all the caution you can.
## Use exact commit hashes rather than tags
Tags are moving qualifiers, and can be [force pushed at any moment](https://julienrenaux.fr/2019/12/20/github-actions-security-risk/). If the repository for an Action you use in your workflows is compromised, the tag you use could be force pushed with a malicious version that can send your repository secrets to a third-party server. Auditing the source of a repository at a given tag, then using the SHA1 commit hash it currently points to as the version addresses that concern due to it being nearly impossible to fake a new commit with the exact hash.
To get the commit hash for a specific tag, head to the Releases page of the repository, then click the short SHA1 hash below the tag name and copy the full hash from the URL.
![A tag along with its commit hash](/uploads/actions_tips_tricks_commit_hash.webp)
> {{< sub "Here, the commit hash is feb985e. Ideally, you want to click that link and copy the full hash from the URL" >}}
```diff
job:
checks:
- - uses: burrunan/gradle-cache-actions@v1.6
+ - uses: burrunan/gradle-cache-actions@feb985ecf49f57f54f31920821a50d0394faf122
```
### Alternate solution
A more extreme fix for this problem is to [vendor](https://stackoverflow.com/questions/26217488/what-is-vendoring) each third-party action you use into your own repository, and then use the local copy as the source. This puts you in charge of manually syncing the source to each version, but allows you to restrict the allowed Actions to ones in your repository thereby greatly increasing security. However, having to manually sync can get tedious if your workflows involve a lot of third-party actions. However, the same manual sync also gives you slightly better visibility into the changes between versions since they'd be available in a single PR diff.
To use an Action from a local directory, replace the `uses:` line with the relative path to the local copy in the repository.
```diff
job:
checks:
- name: Checkout repository
# Assuming the copy of actions/checkout is at .github/actions/checkout
- - uses: actions/checkout@v2
+ - uses: ./.github/actions/checkout
```
## Replace `pull_request_target` with `pull_request`
[`pull_request_target`](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows#pull_request_target) grants a PR access to a github token that can write to your repository, exposing your code to modification by a malicious third-party who simply needs to open a PR against your repository. Most people will already be using the safe [`pull_request`](https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows#pull_request) event, but if you are not, audit your requirements for `pull_request_target` and make the switch.
```diff
-on: [push, pull_request_target]
+on: [push, pull_request]
```
{{< horizontal_line >}}
I'm still learning about Actions, and there is a lot that I did not cover here. I highly encourage readers to refer the GitHub docs for [Workflow syntax](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions) and [Context and expressions syntax](https://docs.github.com/en/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions) to gain more knowledge of the workflow configuration capabilities. Let me know if you find something cool that I did not cover here!

View File

@ -0,0 +1,142 @@
---
categories:
- automation
date: 2023-01-17T19:32:18.074Z
summary: Renovate is an extremely powerful tool for keeping your dependencies
up-to-date, and its flexibility is often left unexplored. I'm hoping to change
that.
draft: false
slug: tips-and-tricks-for-using-renovate
tags:
- dependency-management
- renovate
title: Tips and tricks for using Renovate
---
[Mend Renovate](https://www.mend.io/free-developer-tools/renovate/) is a free to use dependency update management service powered by the open-source [renovate](https://github.com/renovatebot/renovate), and is a compelling alternative to GitHub's blessed solution for this problem space: [Dependabot](https://docs.github.com/en/code-security/dependabot). Renovate offers a significantly larger suite of supported language ecosystems compared to Dependabot as well as fine-grained control over where it finds dependencies, how it chooses updated versions, and a lot more. TL;DR: Renovate is a massive upgrade over Dependabot and you should evaluate it if _any_ aspect of Dependabot has caused you grief, there's a good chance Renovate does it better.
I'm collecting some tips here about "fancy" things I've done using Renovate that may be helpful to other folks. You'll be able to find more details about all of these in their very high quality docs at [docs.renovatebot.com](https://docs.renovatebot.com/).
## Disabling updates for individual packages
There are times where you're sticking with an older version of a package (temporarily or otherwise) and you just don't want to see PRs bumping it, wasting CI resources for an upgrade that will probably fail and is definitely not going to be merged. Renovate offers a convenient way to do this:
```json
{
"packageRules": [
{
"managers": ["gradle"],
"packagePatterns": ["^com.squareup.okhttp3"],
"enabled": false
}
]
}
```
## Grouping updates together
Renovate already includes preset configurations for [monorepos](https://github.com/renovatebot/renovate/blob/b4d1ad8e5210017a3550c9da4342b0953a70330a/lib/config/presets/internal/monorepo.ts) that publish multiple packages with identical versions, but you can also easily add more of your own. As an example, here's how you can combine updates of the serde crate and its derive macro.
```json
{
"packageRules": [
{
"managers": ["cargo"],
"matchPackagePatterns": ["serde", "serde_derive"],
"groupName": "serde"
}
]
}
```
## Set a semver range for upgrades
Sometimes there are cases where you may need to set an upper bound on a package dependency to avoid breaking changes or regressions. Renovate offers intuitive support for the same.
```json
{
"packageRules": [
{
"matchPackageNames": ["com.android.tools.build:gradle"],
"allowedVersions": "<=7.4.0"
}
]
}
```
## Supporting non-standard dependency declarations
Dependency versions are sometimes specified without their package names, for example in config files. These cannot be automatically detected by Renovate, but you can use a regular expression to teach it how to identify these dependencies.
For example, you can specify the version of Hugo to build your Netlify site with in the `netlify.toml` file in your repository.
```toml
[build.environment]
HUGO_VERSION = "0.109.0"
```
This is how the relevant configuration might look like with Renovate
```json
{
"regexManagers": [
{
"description": "Update Hugo version in Netlify config",
"fileMatch": [".toml$"],
"matchStrings": ["HUGO_VERSION = \"(?<currentValue>.*?)\""],
"depNameTemplate": "gohugoio/hugo",
"datasourceTemplate": "github-releases"
}
]
}
```
You can read more about Regex Managers [here](https://docs.renovatebot.com/modules/manager/regex/).
## Making your GitHub Actions usage more secure
According to GitHub's [official recommendations](https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-third-party-actions), you should be using exact commit SHAs instead of tags for third-party actions. However, this is a pain to do manually. Instead, allow Renovate to manage it for you!
```json
{
"extends": [
"config:base",
":dependencyDashboard",
"helpers:pinGitHubActionDigests"
]
}
```
## Automatically merging compatible updates
Every person with a JavaScript project has definitely loved getting 20 PRs from Dependabot about arbitrary transitive dependencies that they didn't even realise they had. With Renovate, that pain can also be automated away if you have a robust enough test suite to permit automatic merging of minor updates.
```json
{
"automergeType": "branch",
"packageRules": [
{
"description": "Automerge non-major updates",
"matchUpdateTypes": ["minor", "patch", "digest", "lockFileMaintenance"],
"automerge": true
}
]
}
```
With this configuration, Renovate will push compatible updates to `renovate/$depName` branches and merge it automatically to your main branch if CI runs on the branch and passes. To make that happen, you will also need to update your GitHub Actions workflows.
```diff
name: Run tests
on:
pull_request:
branches:
- main
+ push:
+ branches:
+ - renovate/**
```
## Closing notes
This list currently consists exclusively of things I've used in my own projects. There is way more you can achieve with Renovate, and I recommend going through the docs at [docs.renovatebot.com](https://docs.renovatebot.com/) to find any useful knobs for the language ecosystem you wish to use it with. If you come across something interesting not covered here, let me know either below or on Mastodon at [@msfjarvis@androiddev.social](https://androiddev.social/@msfjarvis)!

View File

@ -0,0 +1,126 @@
+++
categories = ["android", "kotlin"]
date = 2020-11-21T00:00:00Z
summary = "Building libraries is hard, and keeping track of your public API surface harder. Kotlin 1.4's explicit API mode tries to make the latter not be difficult anymore."
draft = true
slug = "tips-for-building-kotlin-libraries"
socialImage = "/uploads/kotlin_social.webp"
tags = ["libraries"]
title = "Tips and tricks for building libraries in Kotlin"
+++
Building a library is arguably a far more involved task than building an application. You need to be _extra_ mindful of your dependencies, and ensure that you are not breaking source and/or binary compatibility unintentionally. When doing so in Kotlin, you may also need to also provide an idiomatic API surface for Java callers if you're offering JVM support.
I have _some_ experience building libraries, and have had the fortune of seeing a **lot** of other, much smarter people do it. This post aims to serve as a collection of what I've learned by doing things myself and observing others, that will hopefully be helpful to people trying their hand at library development.
## Avoid `data` classes in your public API
Kotlin's [data classes](https://kotlinlang.org/docs/reference/data-classes.html#data-classes) are a fantastic language feature, but unfortunately they pose many challenges. Jake Wharton has written about this in great detail over on [his blog](https://jakewharton.com/public-api-challenges-in-kotlin/), but I will reproduce the problem here as a TL;DR for people who just want to get an overview of the problem.
Here's an example class:
```kotlin
data class Example(
val username: String,
val id: Int,
)
```
Compiling this with `kotlinc` then disassembling it with `javap` gives us this:
```java
public final class Example {
public final java.lang.String getUsername();
public final int getId();
public Example(java.lang.String, int);
public final java.lang.String component1();
public final int component2();
public final Example copy(java.lang.String, int);
public static Example copy$default(Example, java.lang.String, int, int, java.lang.Object);
public java.lang.String toString();
public int hashCode();
public boolean equals(java.lang.Object);
}
```
Now, let's add a new field there. The resultant diff will look like this:
```diff
data class Example(
val username: String,
+ val realname: String? = null,
val id: Int,
-)
+) {
+ constructor(username: String, id: Int): this(username, null, id)
+}
```
What we did here was add a secondary constructor with the previous signature, as a way of preserving backwards compatibility. As Jake notes in his article, even this effort from us breaks the public API. Let's compile and disassemble this again to see why.
```diff
Compiled from "Example.kt"
public final class Example {
public final java.lang.String getUsername();
+ public final java.lang.String getRealname();
public final int getId();
+ public Example(java.lang.String, java.lang.String, int);
+ public Example(java.lang.String, java.lang.String, int, int, kotlin.jvm.internal.DefaultConstructorMarker);
public Example(java.lang.String, int);
public final java.lang.String component1();
- public final int component2();
- public final Example copy(java.lang.String, int);
- public static Example copy$default(Example, java.lang.String, int, int, java.lang.Object);
+ public final java.lang.String component2();
+ public final int component3();
+ public final Example copy(java.lang.String, java.lang.String, int);
+ public static Example copy$default(Example, java.lang.String, java.lang.String, int, int, java.lang.Object);
public java.lang.String toString();
public int hashCode();
public boolean equals(java.lang.Object);
```
If the problem is not immediately apparent, consider this: `component2()` is no longer returning an `int`. This breaks destructing from Kotlin. The `copy` method's API also changed, which is another binary incompatible change.
You can read more details about how to structure your public classes to avoid this, in Jake's post that I linked above.
## (Ab)use `@SinceKotlin` for offering Java-only APIs
Full disclosure: I picked this up from [LeakCanary](https://github.com/square/leakcanary) so credit goes entirely to [Piwai](https://twitter.com/piwai) for thinking of it.
[`@SinceKotlin`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-since-kotlin/) is an annotation offered in Kotlin that allows things to be marked with the Kotlin version they were first introduced. This allows the usage of classes/methods/properties et al be checked during compile time based on the `-api-version` compiler flag.
For example, if you write this code:
```kotlin
@SinceKotlin("1.4")
class Example(val username: String)
```
and try to compile it like this:
```bash
$ kotlinc example.kt -Werror -api-version 1.3
error: warnings found and -Werror specified
example.kt:1:1: warning: the version is greater than the specified API version 1.3
@SinceKotlin("1.4")
^
```
you can see that compilation fails. I had to pass in `-Werror` manually here, but I believe the Kotlin Gradle Plugin handles making this an error automatically.
How does that help us offer Java-only APIs though? Well, here's how Piwai [did it](https://github.com/square/leakcanary/blob/69d54f36ed9d3204624d214835ba99898665a346/leakcanary-android-core/src/main/java/leakcanary/LeakCanary.kt#L177-L184):
```kotlin
/**
* Construct a new Config via [LeakCanary.Config.Builder].
* Note: this method is intended to be used from Java code only. For idiomatic Kotlin use
* `copy()` to modify [LeakCanary.config].
*/
@Suppress("NEWER_VERSION_IN_SINCE_KOTLIN")
@SinceKotlin("999.9") // Hide from Kotlin code, this method is only for Java code
fun newBuilder() = Builder(this)
```
Since the version here is set to `999.9`, which hopefully Kotlin will never be over, any attempt to use this will result in a compiler error. The only way to work around this madness is to be equally mad and pass `-api-version 999.9`, which you'd never do, right? 😬

View File

@ -0,0 +1,48 @@
+++
categories = ["rust"]
date = 2019-09-07
summary = "Rust is an amazing systems language that is on an explosive rise thanks to its memory safety guarantees and fast, iterative development. In this post, I recap some of the tooling that I use with Rust to make coding in it even more fun and intuitive"
devLink = "https://dev.to/msfjarvis/tools-for-effective-rust-development-3mb4"
title = "Tools for effective Rust development"
slug = "tools-for-effective-rust-development"
socialImage = "uploads/rust_social.webp"
tags = ["cargo", "rls", "cargo-edit", "clippy"]
+++
[Rust] is a memory-safe systems language that is blazing fast, and comes with no runtime or garbage collector overhead. It can be used to build very performant web services, CLI tools, and even [Linux kernel modules](https://github.com/fishinabarrel/linux-kernel-module-rust)!
[Rust] also provides an assortment of tools to make development faster and more user-friendly. I'll be going over some of them here that I've personally used and found to be amazing.
## cargo-edit
[cargo-edit] is a crate that extends Rust's Cargo tool with `add`, `remove` and `upgrade` commands that allow you to manage dependencies with ease. The [documentation](https://github.com/killercup/cargo-edit/blob/master/README.md#available-subcommands) goes over these options in detail.
I personally find `cargo-edit` useful in projects with a lot of dependencies as it gets tiresome to manually hunt down updated versions.
## cargo-clippy
[cargo-clippy] is an advanced linter for Rust that brings together **331** ([at the time of writing](https://rust-lang.github.io/rust-clippy/stable/index.html)) different lints in one package that's built and maintained by the Rust team.
I've found it to be a great help alongside the official documentation and ["the book"](https://doc.rust-lang.org/book/) as a way of writing cleaner and more efficient Rust code. As a beginner Rustacean, I find it very helpful in breaking away from my patterns from other languages and using more "rust-y" constructs and expressions in my code.
## rustfmt
[rustfmt] is the official formatting tool for Rust code. It's an opinionated, zero-configuration tool that "just works". It has not reached a `1.0` release yet, which entails some [caveats](https://github.com/rust-lang/rustfmt#limitations) with its usage but in my experience it will work for most people and codebases without any hassle.
As a Kotlin programmer I am very used to having an official styleguide for consistent formatting across all projects. `rustfmt` brings that same convenience to Rust development, which is major since Rust does not have any official IDE which would do it automatically.
## rls
[rls] is Rust's implementation of Microsoft's [language-server-protocol](https://microsoft.github.io/language-server-protocol/), an attempt at standardizing the interface between language tooling and IDEs to allow things like code completion, find all references and documentation on hover to work seamlessly across different IDEs. [VSCode](https://code.visualstudio.com/) implements the `language-server-protocol` and integrates seamlessly with `rls` using the [rust-lang.rust](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust) extension to create a compelling IDE experience.
Being a beginner, the ability for code to be checked within the editor and not requiring builds for each change is a huge speed-up in the learning and development process. Documentation about crates and errors being available directly on hover is certainly helpful in furthering my knowledge and understanding of the language.
## Conclusion
So this is my list of must-have tooling that has helped me continuously improve as a Rustacean. I'm VERY curious to hear what others are using! I opted to stick with official tools where possible since they've proven very reliable and I seem to find considerably more help online with them, but I'd love to try out non-official alternatives that offer significant benefits :)
[rust]: https://rust-lang.org/
[cargo-edit]: https://github.com/killercup/cargo-edit
[cargo-clippy]: https://github.com/rust-lang/rust-clippy
[rustfmt]: https://github.com/rust-lang/rustfmt
[rls]: https://github.com/rust-lang/rls

View File

@ -0,0 +1,53 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-08-04
summary = "In the first post in the new 'Tools of the trade' series, we talk about direnv."
slug = "tools-of-the-trade-direnv"
socialImage = "uploads/tools-of-the-trade-direnv.webp"
tags = ["direnv", "cli-tools"]
title = "Tools of the trade: direnv"
+++
This post was supposed to be a monolith directory of all the CLI-based tooling that I use to get things done throughout my day, but it turned out to be just a bit too long so I elected to split it out into separate posts.
Let's talk about [direnv](https://github.com/direnv/direnv).
## What is direnv?
On the face of it, it's not very interesting. Their GitHub description simply reads 'Unclutter your .profile', which gives you a general idea of what to expect but also grossly undersells it.
What direnv does, is improve the experience with things like [12 factor apps](https://en.wikipedia.org/wiki/Twelve-Factor_App_methodology). It enables per-directory configurations that would otherwise be 'global'. Let's look into how I use it, to get a robust idea of what you can expect.
## Why do I use it?
I have a separate account for proprietary work related things [here](https://github.com/hshandilya-navana), which means that any GitHub tooling I use now needs to be configured with separate credentials for when I'm interacting with work repositories. Bummer!
`direnv` makes this simpler by allowing for environment variables to be set for those repositories only. I mostly use the official GitHub CLI from [here](https://github.com/cli/cli) to interact with the remote repo, so providing a separate GitHub token is just a matter of setting the `GITHUB_TOKEN` environment variable to one that is allowed to interact with the current repo. With direnv, all you need to do is create a `.envrc` file in the repository directory with this:
```bash
export GITHUB_TOKEN=<redacted>
```
and `direnv` will automatically set it when you enter the directory, and more importantly: **reset** it back to its previous value when you exit. This 'unloading' feature makes `direnv` extremely powerful.
{{< asciinema qMkuyVjPSkhNqO6Jo0eQnLiyt >}}
`direnv` also comes with a rich stdlib that lets you do far more than just export environment variables.
Setting up a Python virtualenv:
{{< asciinema irkZWRh00gFVIcH41BRcOvowm >}}
Stripping entries from `$PATH`:
{{< asciinema vbzolwrYnXzBFvhAqMJEFBNRv >}}
Adding entries into `$PATH`:
{{< asciinema C1EhhAoy1y3vSwJaIc0R8o0RY >}}
> You'll notice an unfamiliar `rg -c` command there, it's [ripgrep](https://github.com/BurntSushi/ripgrep), and the `-c` flag counts the number of matches in the string if there are any, and nothing otherwise. We'll talk about it later in this series :)
The possibilities are huge! To check out the stdlib yourself, run `direnv stdlib` after installing `direnv`.
This was part 1 of the [Tools of the trade](/categories/tools-of-the-trade/) series.

View File

@ -0,0 +1,81 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-08-18
summary = "Probably the final post of this series? Let's talk about fd!"
slug = "tools-of-the-trade-fd"
socialImage = "uploads/tools-of-the-trade-fd.webp"
tags = ["fd", "cli-tools"]
title = "Tools of the trade: fd"
+++
Continuing [this series](/categories/tools-of-the-trade/), let's talk about [fd](https://github.com/sharkdp/fd).
## What is fd?
`fd` is an extremely fast replacement for the GNU coreutils' `find(1)` tool. It's written in Rust, and is built for humans, arguably unlike `find(1)`.
## Why do I use it?
Other than the obvious speed benefits, one of the most critical improvements you'll notice in your workflow with `fd` is the presence of good defaults. By default `fd` ignores hidden files and folders, and respects `.gitignore` and similar files. Here's a small comparison to show you the differences between `fd` and `find(1)`'s default behaviors.
Running both `find` and `fd` on the repository for this website, then piping the results into [del.dog](https://del.dog):
```bash
$ find | paste
https://del.dog/raw/greconillo
```
```bash
$ fd | paste
https://del.dog/raw/thelerrell
```
If you check both those links, you'll observe that `find(1)` has a significantly higher number of results compared to `fd`. Looking closely, you'll also notice that `find(1)` has dumped the entire `.git` directory into the results as well, alongwith the `public` directory of Hugo which contains the built site. These are surely important directories, but you almost **never** want to search through your `.git` directory or build artifacts. `fd` shines here by excluding them automatically, while being significantly faster than `find(1)` even when they're both returning the exact number of results.
On top of these, `fd` also comes with a very rich set of options that let you do many typically complex operations within `fd` itself.
### Converting all JPEG files to PNG
```bash
$ fd -tf jpg$ -x convert {} {.}.png
```
Some new things here!
- `-tf` means we only want files. There are multiple options for this in `fd`, including directory, executable, symlink, and even UNIX pipes and sockets.
- `jpg$` is our search term, in RegEx. `fd` makes use of [BurntSushi](https://github.com/BurntSushi)'s excellent [regex](https://github.com/rust-lang/regex) library for extremely quick RegEx parsing, and is able to thus support it by default. You can override this by passing `-g`/`--glob` to use glob-based matching instead. RegEx itself is too complicated, and my experience with it too limited, to actually cover it all here. All you need to know here is that the `$` at the end simply means that we want `jpg` to be the final characters of our matching term.
- `-x` is one of two exec modes provided by `fd`. `-x` runs the provided command for each term separately, in a multi-threaded fashion, so for long-running tasks you might want to reduce CPU load by restricting threads using `--threads <num>`.
- `{}` and `{.}` are part of `fd`'s execution placeholders that let you manipulate search results a bit more before handing them off to external commands. `{}` is replaced with the result as-is, and `{.}` strips the file extension. There are a couple more that you can check out using `fd --help`.
- `convert` is an external command from the ImageMagick suite of tools.
### Finding and deleting all files with a specific extension
```bash
$ fd -HItf \\.xml$ -X rm -v
```
Mostly familiar now, but with some key differences.
- `-H` and `-I` combined are used to include **h**idden and **i**gnored files into the results.
- `\\.xml$` is a more expansive RegEx that ensures that you only delete files that match `a_file.xml` and not `this_is_not_an_xml`, by ensuring that we match on `.xml` and not just `xml`. The double backslash is an escape sequence, because `.` has a special meaning in RegEx that we do not want here.
- `-X` is the other exec mode, batch. It runs the given command by passing all results as parameters in one go. Since we want to delete files, and `rm` lets you specify an arbitrary amount of arguments, we can use this and thus only run `rm` once.
### Updating all git repositories in a directory
```bash
$ fd -Htd ^.git$ --maxdepth 1 -x hub -C {//} sync
```
Already feels like home!
- `-Htd` together search for hidden folders.
- `^.git$` matches exactly on `.git` by mandating that `.git` be both the first (^) and last ($) characters.
- `--maxdepth 1` is a speed optimization to make `fd` only check the current directory and not traverse.
- `-x` again runs each command separately
- `{//}` gives us the parent directory. For `msfjarvis.dev/.git`, this will give you `msfjarvis.dev`.
[hub](https://hub.github.com) is a `git` wrapper that provides some handy features on top like `sync` which updates all locally checked out branches from their upstream remotes. You can re-implement this with some leg work but I'll leave that as an exercise for you.
And that's about it! Let me know what you think of `fd` and if you're switching to it.
This was part 3 of the [Tools of the trade](/categories/tools-of-the-trade/) series.

View File

@ -0,0 +1,62 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-08-10
summary = "Continuing this series, let's talk about fzf."
slug = "tools-of-the-trade-fzf"
socialImage = "uploads/tools-of-the-trade-fzf.webp"
tags = ["fzf", "cli-tools"]
title = "Tools of the trade: fzf"
+++
In the second post of [this series](/categories/tools-of-the-trade/), let's talk about [fzf](https://github.com/junegunn/fzf).
## What is fzf?
In its simplest form, `fzf` is a **f**u**zz**y **f**inder. It lets you search through files, folders, any line-based text using a simple fuzzy and/or regex backed system.
On-demand, `fzf` can also be super fancy.
## Why do I use it?
Because `fzf` is a search tool, you can use it to find files and folders. My most common use-case for it is a simple bash function that goes like this:
```bash
# find-and-open, gedit? Sorry I'll just stop.
function fao() {
local ARG;
ARG="${1}";
if [ -z "${ARG}" ]; then
nano "$(fzf)";
else
nano "$(fzf -q"${ARG}")";
fi
}
```
It starts up a fzf session and then opens up the selected file in `nano`.
{{< asciinema gCwYg97C1NbRVgCUK0Dd1byVl >}}
By default, `fzf` is a full-screen tool and takes up the entire height of your terminal. I've restricted it to 40% of that, as it looks a bit nicer IMO. You can make more such changes by setting the `FZF_DEFAULT_OPTS` environment variable as described in the [layout section](https://github.com/junegunn/fzf#layout) of the fzf docs.
But that's not all! You can get _real_ fancy with `fzf`.
For example, check out the output of `fzf --preview 'bat --style=numbers --color=always --line-range :500 {}'` [here](https://asciinema.org/a/WFFx2negPw5iXbCZe1YlAZeqj) (a bit too wide to embed here :()
> `bat` is a `cat(1)` clone with syntax highlighting and other nifty features, and also a tool I use on the daily. We'll probably be covering it soon :)
You can also bind arbitrary keys to actions with relative ease.
{{< asciinema l7OPG4xQv5QVtvyxQfmly2eiE >}}
The syntax as evident, is pretty simple
```
<key-shortcut>:execute(<command>)<+abort>
```
The `+abort` there is optional, and signals `fzf` that we want to exit after running the command. Detailed instructions are available in the `fzf` [README](https://github.com/junegunn/fzf#readme).
And that's it from me. Post any fancy `fzf` recipes you come up with in the comments below!
This was part 2 of the [Tools of the trade](/categories/tools-of-the-trade/) series.

View File

@ -0,0 +1,46 @@
+++
categories = ["tools-of-the-trade"]
date = 2020-09-02
summary = "Bringing this series back on popular demand, we're here to talk about SDKMAN!"
slug = "tools-of-the-trade-sdkman"
socialImage = "uploads/tools-of-the-trade-sdkman.webp"
tags = ["sdkman", "cli-tools"]
title = "Tools of the trade: SDKMAN!"
+++
In the fourth post of [this series](/categories/tools-of-the-trade/), we're talking about [SDKMAN!](https://sdkman.io).
## What is SDKMAN?
SDKMAN is a **SDK** **Man**ager. By employing its CLI, you can install a plethora of JVM-related tools and SDKs to your computer, without ever needing root access.
## Why do I use it?
Since I primarily work with [Kotlin](https://kotlinlang.org/), having an up-to-date copy of the Kotlin compiler becomes helpful for quickly testing code samples with its inbuilt REPL (**R**ead **E**valuate **P**rint **L**oop). I also use [Gradle](https://gradle.org) as my build tool of choice, and tend to stay up-to-date with their releases in my projects. Finally, to run all these Java-based tools, you're gonna need Java itself. Linux distros tend to package very outdated versions of the JDK which becomes a hindrance when building standalone JVM apps that I want to use the latest Java APIs in. SDKMAN allows you to install Java from multiple sources including AdoptOpenJDK, Azulsystems' Zulu and many more.
The real kicker here is the fact that you can keep multiple versions of the same thing installed. Using Java 14 everywhere but a specific project breaks over Java 8? Just install it alongside!
To make this side-by-side ability even more useful, SDKMAN let's you create a `.sdkmanrc` file in a directory, and it will switch your currently active version of any installed tool to the version specified in the file. People following the series from the beginning might recall this sounds awfully like direnv, because it is. However, SDKMAN is noticeably slow when executing these changes, presumably because its tearing down an existing symlink and creating a new one. For that reason, SDKMAN ships with the `sdk_auto_env` feature (automatically parse `.sdkmanrc` when you change directories) off by default, requiring you to manually type `sdk env` each time you enter a directory where you have a `.sdkmanrc`.
Since the auto env feature matches what direnv does, I just use it directly. So, rather than doing this:
```bash
# .sdkmanrc
java=8.0.262-zulu
```
I do:
```bash
# .envrc
# In bash, doing `${VARIABLE/src/dest}` replaces `src` with
# `dest` in `${VARIABLE}`, but you still need to write it
# back manually (hence the `export`).
export JAVA_HOME="${JAVA_HOME/current/8.0.262-zulu}"
```
for the same end result, but a lot faster.
And that's really it! SDKMAN's pretty neat, but for the most part it just stays out of your way and thus there's not a lot to talk about it. The next post's gonna be much more hands-on :-)
This was part 4 of the [Tools of the trade](/categories/tools-of-the-trade/) series.

View File

@ -0,0 +1,13 @@
---
title: Using containers in NixOS
date: 2023-12-08T11:27:39.010Z
summary: NixOS allows running arbitrary Docker containers declaratively, these
are some of my notes on my usage of this functionality.
draft: true
---
NixOS comes with the ability to [declaratively manage docker containers](https://nixos.wiki/wiki/NixOS_Containers#Declarative_docker_containers), which functions as a nice escape hatch when something you want to run doesn't have a native Nix package or is not easy to run within NixOS.
All the available configuration options can be found [here](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=alpha_desc&query=virtualisation.oci-containers.containers), so rather than explain all of it I'll just walk through my own experience of getting a container up for [Linkding](https://github.com/sissbruecker/linkding).
`podman containers list` works only if you're root, not with `sudo podman containers list`.

View File

@ -0,0 +1,15 @@
---
title: Using Retrofit to disguise scraping as a REST API
date: 2023-09-13T07:08:10.659Z
summary: We've all used Retrofit to interact with REST APIs for as long as we
can remember, but what if there was no API?
draft: true
---
Square's Retrofit is best known for being the gold standard of REST clients in the JVM/Android ecosystem, but it's excellent API design also lends itself to great extensibility which we will leverage today.
While trying to implement post search functionality in [Claw](https://msfjarvis.dev/g/compose-lobsters), my [lobste.rs](https://lobste.rs) client I stumbled into a _tiny_ problem: there was no API! lobste.rs has a [web-based search](https://lobste.rs/search) but no equivalent mechanism via the JSON API I was using for doing everything else within the app.
The search page uses URL query parameters to specify the search term which made it quite easy to reliably construct a URL which would contain the posts we were interested in, and it looked something like this: `/search?q={query}&what=stories&order=newest&page={page}`.
Retrofit has a [Converter](https://github.com/square/retrofit/blob/40c4326e2c608a07d2709bfe9544cb1d12850d11/retrofit/src/main/java/retrofit2/Converter.java) API which lets users convert request/response bodies to and from their HTTP representations. We will leverage this to convert the raw HTML body we will receive from the search page into a list of LobstersPost objects.

View File

@ -0,0 +1,104 @@
+++
categories = ["kotlin", "android"]
date = 2019-10-25
summary = "I was an early adopter of the Gradle Kotlin DSL, deploying it to multiple Android projects of mine, but lately it has been more trouble than I could care for. Here are my grievances with it."
devLink = "https://dev.to/msfjarvis/why-i-went-back-to-the-gradle-groovy-dsl-4jf4"
slug = "why-i-went-back-to-the-gradle-groovy-dsl"
tags = ["groovy", "gradle"]
title = "Why I went back to the Gradle Groovy DSL"
+++
About an year ago when I first discovered the [Gradle Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html), I was very quick to [jump](https://github.com/msfjarvis/viscerion/commit/c16d11a816c3c7e3f7bab51ef2f32569b6b657bf) [on](https://github.com/android-password-store/Android-Password-Store/commit/3c06063153d0b7f71998128dc6fb4e5967e33624) [that](https://github.com/substratum/substratum/commit/ebff9a3a88781d093565526b171d9d5b8e9c1bed) [train](https://github.com/substratum/substratum/commit/5065e082055cde19e41ee02920ca07d0e33c89f5). Now it feels like a mistake.
The initial premise of the Gradle Kotlin DSL was very cool. You get first class code completion in the IDE, and you get to write Kotlin rather than the arguably weird Groovy. People were excited to finally be able to write complex build logic using the `buildSrc` functionality that this change introduced.
However the dream slowly started fading as more and more people started using the Kotlin DSL and the shortcomings became more apparent. My grievances with the Kotlin DSL are multifold as I'll detail below.
Just a disclaimer, This post is not meant to completely trash the Kotlin DSL's usability. It has it's own very great benefits and people who leverage those should continue using it and disregard this post :-)
### Build times
The Gradle Kotlin DSL inflates build times _significantly_. Compiling `buildSrc` and all the `*.gradle.kts` files for my [app](http://github.com/msfjarvis/viscerion/tree/1ea6f07f8219aa42139977f37ebbcb230d7f78e7 "app") takes upto 10 seconds longer than the Groovy DSL. Couple that with the fact that changing any file from `buildSrc` invalidated the entire compiler cache for me made iterative development extremely painful.
### Half-baked API surface
Gradle doesn't seem to have invested any actual time in converting the original Groovy APIs into Kotlin-friendly versions before they peddled the Kotlin DSL to us. Check the samples below and decide for yourself.
Groovy
```groovy
android {
compileSdkVersion 29
buildToolsVersion = '29.0.2'
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
}
buildTypes {
minifyEnabled = true
}
}
dependencies {
implementation('my.company:fancy.library:1.1.1') {
force = true
}
}
```
Kotlin
```groovy
android {
compileSdkVersion(29)
buildToolsVersion = "29.0.2"
defaultConfig {
minSdkVersion(21)
targetSdkVersion(29)
}
buildTypes {
isMinifyEnabled = true
}
}
dependencies {
implementation('my.company:fancy.library:1.1.1') {
isForce = true
}
}
```
I am definitely biased here, but this is not how an idiomatic Kotlin API looks like.
What we should have gotten
```groovy
android {
compileSdkVersion = 29
buildToolsVersion = "29.0.2"
defaultConfig {
minSdkVersion = 21
targetSdkVersion = 29
}
buildTypes {
minifyEnabled = true
}
}
dependencies {
implementation('my.company:fancy.library:1.1.1') {
force = true
}
}
```
Property access syntax and discoverable variable names should have been the norm since day one for it to actually be a good Kotlin DSL.
### Complexity
The Kotlin DSL is not very well documented outside Gradle's bits and pieces in documentation. Things like [this](https://github.com/msfjarvis/viscerion/commit/c851571e33189c345329ea3934ad1af15edbe6fb "this") were incredibly problematic to implement in the Kotlin DSL, at least for me and I found it to be incredibly frustrating.
## Conclusion
Again, these are my pain points with the Kotlin DSL. I still use it for some of my projects but I am not going to use it in new projects until Gradle addresses these pains.

View File

@ -0,0 +1,129 @@
+++
categories = ["android"]
date = 2020-07-23
summary = "(Mostly) everybody agrees that Android upgrades are good, but how very crucial they are to security and privacy often gets overlooked. Let's dig into that."
devLink = "https://dev.to/msfjarvis/why-upgrade-android-557f"
slug = "why-upgrade-android"
socialImage = "uploads/why_upgrade_android_social.webp"
tags = ["updates", "security", "privacy"]
title = "Why upgrade Android?"
toc = true
+++
A couple days ago I came across a security conscious user who was quick to point out why a particular feature had to be added to APS, but failed to realise the fact that the problem wouldn't even exist if they were running the latest version of Android (we'll talk about the behavior change that fixed it later here).
Android upgrades bring massive changes to the platform, improving security against both known and unknown threats. You sign off that benefit when you buy into an incompetent OEM's cheap phones, and it has become a bit too 'normal' than anybody would prefer.
That's not what we're going to talk about, though. This post is going to be purely about privacy, and how it has changed, nay, improved, over the years of Android. My apps support a minimum of Android 6, so I will begin with the next version, Android 7, and go through Google's release notes, singling out privacy related changes.
## Android 7
Android 7 had a very passing focus on privacy and thus did not have a lot of obvious or concrete changes around it. Background execution limits introduced in Android 6 were improved in Android 7 to apply even more restrictions after devices became stationary, which can be loosely interpreted as 'bad' for data exfiltration SDKs that apps ship but in reality didn't do much.
## Android 8
### Locking down background location access
In Android 8, access to background location was [severely throttled](https://developer.android.com/about/versions/oreo/android-8.0-changes#abll). Apps received less frequent updates for location and thus couldn't track you in real time.
### Introduction of Autofill
The Android Autofill framework was debuted, along with support for [Web form Autofill](https://developer.android.com/about/versions/oreo/android-8.0-changes#wfa). This paved the way for password managers to fill fields for you without relying on hacked up accessibility services or the Android clipboard. This was a major win!
### Better HTTPS defaults
Android 8.0's implementation of HttpsURLConnection did not perform [insecure TLS/SSL protocol version fallback](https://developer.android.com/about/versions/oreo/android-8.0-changes#networking-all), which means connections that failed to negotiate a requested TLS version would now abort rather than fall back to an older version of TLS.
### ANDROID_ID changes
Access to the `ANDROID_ID` field [was changed significantly](https://developer.android.com/about/versions/oreo/android-8.0-changes#privacy-all). It is generated per-app and per-signature as opposed to the entire system making it harder to fingerprint users who have multiple apps installed with the same advertising-related SDKs.
## Android 9
### Limited access to sensors
Beginning Android 9, [background access to device sensors](https://developer.android.com/about/versions/pie/android-9.0-changes-all#bg-sensor-access) was greatly reduced. Access to microphone and camera was completely denied, and so was the gyroscope, accelerometer and other sensors of that class.
### Granular call log access
For apps that need to access the user's call logs for any reason, a [new permission group was introduced](https://developer.android.com/about/versions/pie/android-9.0-changes-all#restrict-access-call-logs). Now, you don't require granting access to all phone-related permissions to let an app back up your call logs.
### Restricted access to phone numbers
There are multiple ways to monitor phone calls on Android, and with the introduction of the `CALL_LOG` permission group, [these were locked down](https://developer.android.com/about/versions/pie/android-9.0-changes-all#restrict-access-phone-numbers) to only expose phone numbers to apps that were allowed explicit access to call logs.
### Making Wi-Fi and cellular networks less privacy invasive
A combination of changes to [what permissions apps require](https://developer.android.com/about/versions/pie/android-9.0-changes-all#restricted_access_to_wi-fi_location_and_connection_information) to know about your WiFi and [how much personally identifiable data is provided by these APIs](https://developer.android.com/about/versions/pie/android-9.0-changes-all#information_removed_from_wi-fi_service_methods) further improves your privacy against rogue apps. Disabling device location [now disables the ability to get information on cell towers](https://developer.android.com/about/versions/pie/android-9.0-changes-all#telephony_information_now_relies_on_device_location_setting) your phone is connected to.
### No more serials
Requesting access to the device serial number [now requires phone state permissions](https://developer.android.com/about/versions/pie/android-9.0-changes-28#build-serial-deprecation) making it more explicit when apps are trying to fingerprint you.
## Android 10
### Scoped Storage
Probably the most controversial change in 10, Scoped Storage segregated the device storage into scopes and [gave apps access to them without needing extra permissions](https://developer.android.com/about/versions/10/privacy/changes#scoped-storage).
### Explicit background permission access
Android 10 introduces the `ACCESS_BACKGROUND_LOCATION` permission and [completely disables background access](https://developer.android.com/about/versions/10/privacy/changes#app-access-device-location) for apps targeting SDK 29 that don't declare it. For older apps, the framework treats granting location access as effectively background location access. When the app upgrades to target SDK 29, the background permission is revoked and must be explicitly requested again.
### Removal of contacts affinity
Beginning Android 10, the system no longer [keeps track of what contacts you interact with most](https://developer.android.com/about/versions/10/privacy/changes#contacts-affinity) and thus search results are not weighted anymore.
### MAC randomization enabled by default
Connecting to a Wi-FI network now uses a [randomized MAC address](https://developer.android.com/about/versions/10/privacy/changes#randomized-mac-addresses) to prevent fingerprinting.
### Removal of access to non-resettable identifiers
Access to identifiers such as IMEI and serial was [restricted to privileged apps](https://developer.android.com/about/versions/10/privacy/changes#non-resettable-device-ids) which means apps served by the Play Store can no longer see them.
### Restriction on clipboard access
This is the problem we first talked about. Apps before Android 10 could monitor clipboard events and potentially exfil confidential data like passwords. [In Android 10 this was completely disabled](https://developer.android.com/about/versions/10/privacy/changes#clipboard-data) for apps that were not in foreground or not your active input method. This change was made with **no** compatibility changes, which means even older apps would not be able to access clipboard data out of turn.
### More WiFi and location improvements
Apps can no longer [toggle WiFi](https://developer.android.com/about/versions/10/privacy/changes#enable-disable-wifi) or [read a list of configured networks](https://developer.android.com/about/versions/10/privacy/changes#configure-wifi), and getting access to methods that expose device location requires the `ACCESS_FINE_LOCATION` permission to make it obvious that an app is doing it. The last change also affects telephony related APIs, a full list is available [here](https://developer.android.com/about/versions/10/privacy/changes#telephony-apis).
### Permissions controls
Apps no longer have [silent access to screen contents](https://developer.android.com/about/versions/10/privacy/changes#screen-contents), and the platform now prompts users [to disallow permissions for legacy apps](https://developer.android.com/about/versions/10/privacy/changes#user-permission-legacy-apps) that target Android 5.1 or below that would earlier be granted at install time. [Physical activity recognition](https://developer.android.com/about/versions/10/privacy/changes#physical-activity-recognition) is now given its own permission and common libraries for the purpose like Google's Play Services APIs will now send empty data when an app requests activity without the permissions.
## Android 11 (tentative)
### Storage changes
- Apps targeting Android 11 are [no longer allowed to opt out of scoped storage](https://developer.android.com/about/versions/11/privacy/storage#scoped-storage).
- All encompassing access to a large set of directories and files is [completely disabled](https://developer.android.com/about/versions/11/privacy/storage#file-directory-restrictions), including the root of the internal storage, the `Download` folder, and the data and obb subdirectories of the `Android` folder.
### Permission changes
- Location, microphone and camera related permissions can now [be granted on a one-off basis](https://developer.android.com/about/versions/11/privacy/permissions#one-time), meaning they'll automatically get revoked when the app process exits.
- Apps that are not used for a few months will [have their permissions automatically revoked](https://developer.android.com/about/versions/11/privacy/permissions#auto-reset).
- A new `READ_PHONE_NUMBERS` permission [has been added](https://developer.android.com/about/versions/11/privacy/permissions#phone-numbers) to call certain APIs that expose phone numbers.
### Location changes
- [One time access](https://developer.android.com/about/versions/11/privacy/location#one-time-access) is now an option for location, allowing users to not grant persistent access when they don't wish to.
- Background location needs to [be requested separately now](https://developer.android.com/about/versions/11/privacy/location#background-location) and asking for it together with foreground location will throw an exception.
### Data access auditing
To allow apps to audit their own usage of user data, [a new callback is provided](https://developer.android.com/about/versions/11/privacy/data-access-auditing#log-access). Apps can implement it and then log all accesses to see if there's any unexpected data use that needs to be resolved.
### Redacted MAC addresses
Unpriviledged apps targeting SDK 30 will no longer be able to get the device's real MAC address.
# Closing notes
As you can tell, improving user privacy is a constant journey and Android is doing a better job of it with every new release. This makes it crucial that you stay up-to-date, either by buying phones from an OEM that delivers timely updates for a sufficiently long support period, or by using a trusted custom ROM like [GrapheneOS](https://grapheneos.org/) or [LineageOS](https://lineageos.org/).

View File

@ -0,0 +1,132 @@
+++
categories = ["android", "gradle", "kotlin"]
date = 2022-06-26
summary = "Paparazzi enables a radically faster and improved UI testing workflow, and using a small workaround we can bring that to our multiplatform Compose projects"
slug = "writing-paparazzi-tests-for-your-kotlin-multiplatform-projects"
tags = ["jetpack-compose", "kotlin-multiplatform"]
title = "Writing Paparazzi tests for your Kotlin Multiplatform projects"
+++
## Introduction
[Paparazzi] is a Gradle plugin and library that enables writing UI tests for Android screens that run entirely on the JVM, without needing a physical device or emulator. This is massive, since it significantly increases the speed of UI tests as well as allows them to run on any CI system, not just ones using macOS or Linux with KVM enabled.
Unfortunately, Paparazzi does not directly work with Kotlin Multiplatform projects so you cannot apply it to a KMP + Android module and start putting your tests in the `androidTest` source set (not to be confused with `androidAndroidTest`. Yes, I know). Why would you want to do this in the first place? Like everything cool and new in Android land, [Compose]! Specifically, [compose-jb], JetBrains' redistribution of Jetpack Compose optimised for Kotlin Multiplatform.
I've [sent a PR] to Paparazzi that will resolve this issue, and in the mean time we can workaround this limitation.
## Setting things up
To begin, we'll need a new Gradle module for our Paparazzi tests. Since Paparazzi doesn't understand Kotlin Multiplatform yet, we're gonna hide that aspect of our project and present it a pure Android library project. Set up the module like so:
```kotlin
// paparazzi-tests/build.gradle.kts
plugins {
id("com.android.library")
id("app.cash.paparazzi")
}
android {
buildFeatures { compose = true }
}
```
Now, add dependencies in this module to the modules that contain the composables you'd like to test. As you might have guessed, this approach currently limits you to only being able to test public composables. However, if you're trying to test the UI exposed by a "common" module like I am, that might not be such a big deal.
```kotlin
// paparazzi-tests/build.gradle.kts
dependencies {
testImplementation(projects.common)
}
```
And that's pretty much it! You can now be off to the races and start writing your tests:
```kotlin
// paparazzi-tests/src/test/kotlin/UserProfileTest.kt
class UserProfileTest {
@get:Rule val paparazzi = Paparazzi()
@Test
fun light_mode() {
paparazzi.snapshot {
MaterialTheme(colorScheme = LightThemeColors) { UserProfile() }
}
}
@Test
fun dark_mode() {
paparazzi.snapshot {
MaterialTheme(colorScheme = DarkThemeColors) { UserProfile() }
}
}
}
```
Consult the [Paparazzi documentation] for the Gradle tasks reference and customization options.
## Recipes
### Disable release build type for test module
If you use `./gradlew check` in your CI, our new module will be tested in both release and debug build types. This is fairly redundant, so you can disable the release build type altogether:
```kotlin
// paparazzi-tests/build.gradle.kts
androidComponents {
beforeVariants { variant ->
variant.enable = variant.buildType == "debug"
}
}
```
### Running with JDK 12+
You will run into [this issue] if you use JDK 12 or above to run Paparazzi-backed tests. I've [started working] on a fix for it upstream, in the mean time it can be worked around by forcing the test tasks to run with JDK 11.
```kotlin
// paparazzi-tests/build.gradle.kts
tasks.withType<Test>().configureEach {
javaLauncher.set(javaToolchains.launcherFor {
languageVersion.set(JavaLanguageVersion.of(11))
})
}
```
### Testing with multiple themes easily
Using an enum and Google's [TestParameterInjector] you can write a single test and have it run against all your themes.
```kotlin
// paparazzi-tests/src/test/kotlin/Theme.kt
import androidx.compose.material3.ColorScheme
enum class Theme(val colors: ColorScheme) {
Light(LightThemeColors),
Dark(DarkThemeColors),
}
```
```kotlin
// paparazzi-tests/src/test/kotlin/UserProfileTest.kt
@RunWith(TestParameterInjector::class)
class UserProfileTest {
@get:Rule val paparazzi = Paparazzi()
@Test
fun verify(@TestParameter theme: Theme) {
paparazzi.snapshot(name = theme.name) {
MaterialTheme(colorScheme = theme.colors) { UserProfile() }
}
}
}
```
[paparazzi]: https://github.com/cashapp/paparazzi
[compose]: https://d.android.com/jetpack/compose
[compose-jb]: https://github.com/jetbrains/compose-jb
[sent a pr]: https://github.com/cashapp/paparazzi/pull/450
[paparazzi documentation]: https://cashapp.github.io/paparazzi
[this issue]: https://github.com/cashapp/paparazzi/issues/409
[started working]: https://github.com/cashapp/paparazzi/pull/474
[testparameterinjector]: https://github.com/google/TestParameterInjector

View File

@ -0,0 +1,152 @@
+++
categories = ["nix"]
date = 2022-12-18
summary = "Quick how-to for writing ad-hoc checks for your own Nix Flakes"
slug = "writing-your-own-nix-flake-checks"
tags = ["nix", "nix flakes", "flake checks"]
title = "Writing your own Nix Flake checks"
+++
## Preface
Ever since discovering [nix(3) flake check](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake-check.html) from [crane](https://github.com/ipetkov/crane) (wonderful tool btw, highly recommend it if you're building Rust things), I've wanted to be able to quickly write my own flake checks. Unfortunately, as with everything Nix, dummy-friendly documentation was hard to come by so I started trying out a bunch of things until I ended up with something that worked, which I'll share below.
## The premise
I had been using a basic shell script with a `nix-shell` shebang for a while to run formatters on my scripts repo and while it worked, `nix-shell` startup is fairly slow and it just wasn't cutting it for me. So I decided to try porting it to `nix flake check` which would benefit from evaluation caching and be faster while removing the overhead of `nix-shell` from the utility script.
## The thing you're here for
Like everything in Nix, the checks needed to be derivations that Nix will build and run the respective `checkPhase` of. So naively, I put together this to run the [alejandra](https://github.com/kamadorueda/alejandra) Nix formatter, [shfmt](https://github.com/mvdan/sh) to format shell scripts and [shellcheck](https://shellcheck.net/) to lint them:
```nix
outputs = {
self,
nixpkgs,
flake-utils,
}:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = import nixpkgs {inherit system;};
files = pkgs.lib.concatStringsSep " " [
# Individual shell scripts from the repository
];
fmt-check = pkgs.stdenv.mkDerivation {
name = "fmt-check";
src = ./.;
doCheck = true;
nativeBuildInputs = with pkgs; [alejandra shellcheck shfmt];
checkPhase = ''
shfmt -d -s -i 2 -ci ${files}
alejandra -c .
shellcheck -x ${files}
'';
};
in {
checks = {inherit fmt-check;};
});
```
I needed a space separated list of my shell scripts to pass to shfmt and shellcheck, so I used a library function from nixpkgs called `concatStringsSep` that takes a list, and concatenates it together with the given separator. That's the `files` binding declared in the snippet above.
Here I ran into my first problem: Nix expects every derivation to generate an output which meant this doesn't actually build.
```plaintext
➜ nix flake check
error: flake attribute 'checks.fmt-check.outPath' is not a derivation
```
There's been [some discussion](https://github.com/NixOS/nixpkgs/issues/16182) about this but the TL;DR is that `mkDerivation` must produce an output. So I tried to cheat around this requirement by faking an output.
```diff
diff --git flake.nix flake.nix
index b7fef3b99110..a531a30ad88e 100644
--- flake.nix
+++ flake.nix
@@ -18,6 +18,7 @@
];
fmt-check = pkgs.stdenv.mkDerivation {
name = "fmt-check";
+ dontBuild = true;
src = ./.;
doCheck = true;
nativeBuildInputs = with pkgs; [alejandra shellcheck shfmt];
checkPhase = ''
@@ -25,6 +26,11 @@
alejandra -c .
shellcheck -x ${files}
'';
+ installPhase = ''
+ mkdir "$out"
+ '';
};
in {
checks = {inherit fmt-check;};
```
`dontBuild` does exactly what you'd think and makes Nix not execute the `buildPhase` of the derivation, and the `mkdir $out` in the `installPhase` generates the output directory Nix was looking for which is still valid even if completely empty.
You can make this slightly faster by using a smaller stdenv that won't pull in a compiler toolchain or be rebuilt when said toolchain is updated:
```diff
diff --git flake.nix flake.nix
index 7ce7a2ba80f8..b69db13fbc6d 100644
--- flake.nix
+++ flake.nix
@@ -16,7 +16,7 @@
files = pkgs.lib.concatStringsSep " " [
# bunch of shell scripts since I didn't have an extension I could glob against
];
- fmt-check = pkgs.stdenv.mkDerivation {
+ fmt-check = pkgs.stdenvNoCC.mkDerivation {
name = "fmt-check";
dontBuild = true;
src = ./.;
```
## The final result
This is what the flake looked like for me after all this
```nix
{
description = "A very basic flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils/main";
};
outputs = {
self,
nixpkgs,
flake-utils,
}:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = import nixpkgs {inherit system;};
files = pkgs.lib.concatStringsSep " " [
# Individual shell scripts from the repository
];
fmt-check = pkgs.stdenvNoCC.mkDerivation {
name = "fmt-check";
dontBuild = true;
src = ./.;
doCheck = true;
nativeBuildInputs = with pkgs; [alejandra shellcheck shfmt];
checkPhase = ''
shfmt -d -s -i 2 -ci ${files}
alejandra -c .
shellcheck -x ${files}
'';
installPhase = ''
mkdir "$out"
'';
};
in {
checks = {inherit fmt-check;};
});
}
```
It's probably not idiomatic Nix (for some definition of idiomatic) but the entire thing has been a trial and error anyway so :shrug:
I'm very much a noob when it comes to Nix so any feedback is very welcome and appreciated!

35
content/uses.md Normal file
View File

@ -0,0 +1,35 @@
+++
title = "Uses"
type = "page"
ShowReadingTime = false
ShowToc = false
+++
## Editor + Terminal
I use the `gnome-terminal` that ships with Linux Mint's Cinnamon Edition with `bash` and a custom prompt from [starship](https://starship.rs). The editor I use depends on what code I am working with:
- Web, Python: VS Code
- Rust: VS Code with rust-analyzer or IntelliJ IDEA with intellij-rust
- Android: Android Studio
- Kotlin: IntelliJ IDEA
My terminal-based text editor of choice is currently [micro](https://micro-editor.com/).
### Development environment
I use [Nix](https://nixos.org/nix/) with [home-manager](https://github.com/nix-community/home-manager) to maintain my development environment and dotfiles. My current Nix configuration can be found in my [dotfiles repo](https://github.com/msfjarvis/dotfiles/blob/main/nixos/ryzenbox-configuration.nix).
## Hardware
### PC
- CPU: Ryzen 5 1600 (6C/12T) @ 3.2 GHz
- GPU: Nvidia GeForce GTX 1650 Super
- RAM: 16GB Kingston HyperX
- Motherboard: ASRock A320M Pro4
- SSD: 250GB Samsung 860 EVO
### Phone
- 128GB Google Pixel 7 running Android 13.

Some files were not shown because too many files have changed in this diff Show More