Compare commits

...

2038 Commits

Author SHA1 Message Date
Harsh Shandilya fe4c82df9b screemshots 2024-04-01 16:11:04 +05:30
Harsh Shandilya 9585197491 fix generate script 2024-04-01 11:23:39 +05:30
Harsh Shandilya 08b680373c . 2024-03-31 23:50:04 +05:30
Harsh Shandilya 3e6134f117 moar social glazing 2024-03-31 23:06:48 +05:30
Harsh Shandilya 82f6e438e9 social glazing 2024-03-31 22:39:41 +05:30
Harsh Shandilya 4c479d4147 wtf 2024-03-31 22:34:31 +05:30
Harsh Shandilya 369f3817be finally release this damn post 2024-03-31 22:31:14 +05:30
Harsh Shandilya a8706af802 yarn no css 2024-03-31 22:27:43 +05:30
Harsh Shandilya 9ea36efd39 fix script 2024-03-31 21:56:49 +05:30
Harsh Shandilya 9c829ba6e4 quite down devshell 2024-03-31 21:51:45 +05:30
Harsh Shandilya 059f42ba01 try fixing cms 2024-03-31 21:34:45 +05:30
Harsh Shandilya 7f3877f66d bye bye netlify-cli 2024-03-31 17:54:40 +05:30
Harsh Shandilya 1ad999f515 . 2024-03-31 17:43:01 +05:30
Harsh Shandilya 2aa35b3ff5 touch up Gradle post again 2024-03-31 17:39:10 +05:30
GitHub Actions 0e50b1265a 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] 15573f97e3
chore(deps): update dependency decap-cms to v3.1.6 [staging] 2024-03-29 13:07:52 +00:00
renovate[bot] bad121edbe
chore(deps): update dependency decap-cms to v3.1.5 [staging] 2024-03-28 13:07:13 +00:00
renovate[bot] 6aef9d27e3
chore(deps): update dependency netlify-cli to v17.21.1 [staging] 2024-03-26 15:44:39 +00:00
GitHub Actions 672f4921a9 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] 64709b60f0
chore(deps): update dependency netlify-cli to v17.20.1 [staging] 2024-03-22 23:18:48 +00:00
renovate[bot] 1535a51eb5
chore(deps): update dependency netlify-cli to v17.20.0 [staging] 2024-03-21 15:59:18 +00:00
renovate[bot] 6ee9fdd1a1
chore(deps): update dependency decap-cms to v3.1.4 [staging] 2024-03-21 10:51:01 +00:00
renovate[bot] b5d9b5d244
chore(deps): update dependency netlify-cli to v17.19.6 [staging] 2024-03-20 17:08:26 +00:00
renovate[bot] 1017899b48
chore(deps): update dependency gohugoio/hugo to v0.124.1 [staging] 2024-03-20 12:20:55 +00:00
renovate[bot] f069cca645
chore(deps): update dependency netlify-cli to v17.19.5 [staging] 2024-03-18 12:47:40 +00:00
GitHub Actions d613f61769 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] 59408f6e71
chore(deps): update dependency gohugoio/hugo to v0.124.0 [staging] 2024-03-16 19:53:32 +00:00
renovate[bot] f3ab14b712
chore(deps): update dependency netlify-cli to v17.19.4 [staging] 2024-03-15 16:37:46 +00:00
renovate[bot] 29f666b4c4
chore(deps): update dependency netlify-cli to v17.19.3 [staging] 2024-03-14 20:44:03 +00:00
renovate[bot] 449c2f7338
chore(deps): update dependency netlify-cli to v17.19.2 [staging] 2024-03-11 15:22:34 +00:00
renovate[bot] cdc59f22cd
chore(deps): update dependency netlify-cli to v17.19.1 [staging] 2024-03-11 11:57:33 +00:00
GitHub Actions 5d20e4ec29 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] b228d3d90e
chore(deps): update dependency netlify-cli to v17.19.0 [staging] 2024-03-08 15:17:23 +00:00
Harsh Shandilya 3bcec52dbe fix(nix): adjust flake-compat URL 2024-03-08 16:21:10 +05:30
Harsh Shandilya 018eb49950 chore: mark RSS layout as vendored 2024-03-08 16:19:08 +05:30
renovate[bot] d3313d17be
chore(deps): update dependency decap-cms to v3.1.3 [staging] 2024-03-08 10:38:40 +00:00
Harsh Shandilya 3763aa332b . 2024-03-08 12:38:42 +05:30
renovate[bot] 00af2bbefd
chore(deps): update dependency gohugoio/hugo to v0.123.8 [staging] 2024-03-07 16:36:46 +00:00
renovate[bot] 56aa2bc252
chore(deps): update dependency netlify-cli to v17.18.1 [staging] 2024-03-06 10:27:57 +00:00
renovate[bot] 733a337cf0
chore(deps): update dependency netlify-cli to v17.18.0 [staging] 2024-03-05 17:20:14 +00:00
renovate[bot] 4e9cb9f5d4
chore(deps): update dependency netlify-cli to v17.17.2 [staging] 2024-03-04 15:49:37 +00:00
GitHub Actions 17d3547689 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] be68985b28
chore(deps): update dependency gohugoio/hugo to v0.123.7 [staging] 2024-03-01 18:32:41 +00:00
renovate[bot] d16569aab5
chore(deps): update dependency gohugoio/hugo to v0.123.6 [staging] 2024-02-28 19:22:34 +00:00
renovate[bot] fc6d4523eb
chore(deps): update dependency gohugoio/hugo to v0.123.4 [staging] 2024-02-26 18:45:48 +00:00
renovate[bot] 587b69d68c
chore(deps): update dependency netlify-cli to v17.17.1 [staging] 2024-02-26 14:29:12 +00:00
GitHub Actions a5271b7fb8 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] e4f886988a
chore(deps): update dependency gohugoio/hugo to v0.123.3 [staging] 2024-02-23 18:14:43 +00:00
Harsh Shandilya 98b1041ebd 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] 55e5c4ac84
chore(deps): update dependency netlify-cli to v17.17.0 [staging] 2024-02-22 16:40:09 +00:00
renovate[bot] 6d9d90cdfd
chore(deps): update dependency gohugoio/hugo to v0.123.2 [staging] 2024-02-22 16:39:43 +00:00
renovate[bot] a9000bd40b
chore(deps): update dependency decap-cms to v3.1.2 [staging] 2024-02-21 10:22:47 +00:00
renovate[bot] d03ea468c2
chore(deps): update dependency gohugoio/hugo to v0.123.1 [staging] 2024-02-21 09:41:04 +00:00
renovate[bot] b4a91badca
chore(deps): update dependency netlify-cli to v17.16.4 [staging] 2024-02-20 19:59:43 +00:00
renovate[bot] f3bb2ed41e
chore(deps): update dependency gohugoio/hugo to v0.123.0 [staging] 2024-02-19 18:46:00 +00:00
renovate[bot] ba3dfb5874
chore(deps): update dependency netlify-cli to v17.16.3 [staging] 2024-02-19 15:18:59 +00:00
GitHub Actions 86306736cf 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] 825d4edac6
chore(deps): update dependency netlify-cli to v17.16.2 [staging] 2024-02-13 15:12:17 +00:00
GitHub Actions f4663a426e 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 2f1d9f7994 prettify RSS feed 2024-02-10 00:28:20 +05:30
renovate[bot] 0a78dc8e88
chore(deps): update dependency netlify-cli to v17.16.1 [staging] 2024-02-08 19:20:37 +00:00
Harsh Shandilya a14830f162 . 2024-02-07 12:44:09 +05:30
Harsh Shandilya 94a629ba3b continue polish on dep sync post 2024-02-07 11:59:27 +05:30
Harsh Shandilya 97bb77b82a .
This reverts commit 7c2d054c53.
2024-02-06 12:11:10 +05:30
Harsh Shandilya 959747b709 polish dep sync post some more 2024-02-05 23:50:01 +05:30
Harsh Shandilya c691f0317b devshell: add `hyperlink` 2024-02-05 23:35:19 +05:30
Harsh Shandilya 74fa83a43f add missing figures to dep sync post 2024-02-05 23:35:11 +05:30
renovate[bot] 8c3e00b76e
chore(deps): update dependency netlify-cli to v17.16.0 [staging] 2024-02-05 12:19:54 +00:00
renovate[bot] 15530c85dc
chore(deps): update dependency prettier to v3.2.5 [staging] 2024-02-04 06:26:12 +00:00
GitHub Actions 35b22398e0 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 7c2d054c53 . 2024-02-03 00:48:43 +05:30
Harsh Shandilya c1f7e03ec3 fix(renovate): add manager for Decap CMS 2024-02-02 00:45:31 +05:30
renovate[bot] 88d80449b4
chore(deps): update dependency netlify-cli to v17.15.7 [staging] 2024-02-01 14:28:57 +00:00
renovate[bot] f63b492425
chore(deps): update dependency netlify-cli to v17.15.6 [staging] 2024-01-31 10:18:06 +00:00
renovate[bot] bbf0e694a8
chore(deps): update dependency netlify-cli to v17.15.5 [staging] 2024-01-30 12:10:32 +00:00
renovate[bot] 486a344c30
chore(deps): update dependency netlify-cli to v17.15.4 [staging] 2024-01-29 17:03:54 +00:00
GitHub Actions be961291de 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] 4dd47d7a07
chore(deps): update dependency gohugoio/hugo to v0.122.0 [staging] 2024-01-26 17:35:13 +00:00
renovate[bot] 37b6b54f7f
chore(deps): update dependency netlify-cli to v17.15.3 [staging] 2024-01-24 19:23:47 +00:00
renovate[bot] 24f0f4ce5b
chore(deps): update dependency netlify-cli to v17.15.2 [staging] 2024-01-22 17:09:13 +00:00
GitHub Actions 1dc81b60a4 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] 1e968994b0
chore(deps): update dependency netlify-cli to v17.15.1 [staging] 2024-01-19 10:15:15 +00:00
Harsh Shandilya 8af0c7f949 . 2024-01-19 13:16:33 +05:30
Harsh Shandilya 794a946bd2 chore: fix flake inputs 2024-01-19 13:11:00 +05:30
renovate[bot] c704860d37
chore(deps): update dependency netlify-cli to v17.15.0 [staging] 2024-01-18 16:33:13 +00:00
renovate[bot] 359b0e66ef
chore(deps): update dependency prettier to v3.2.4 [staging] 2024-01-17 10:54:40 +00:00
Harsh Shandilya 62960784d0 . 2024-01-17 15:30:20 +05:30
renovate[bot] 9732785f23
chore(deps): update dependency prettier to v3.2.3 [staging] 2024-01-17 05:07:32 +00:00
renovate[bot] c3010daea1
chore(deps): update dependency netlify-cli to v17.14.0 [staging] 2024-01-15 17:07:08 +00:00
renovate[bot] 0b08cd244c
chore(deps): update dependency prettier to v3.2.2 [staging] 2024-01-14 06:38:17 +00:00
GitHub Actions 70b70b3c66 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] 8c0379b509
chore(deps): update dependency prettier to v3.2.1 [staging] 2024-01-12 23:29:18 +00:00
renovate[bot] 79f79693ae
chore(deps): update dependency prettier to v3.2.0 [staging] 2024-01-12 16:37:47 +00:00
renovate[bot] ef178456a9
chore(deps): update dependency netlify-cli to v17.13.2 [staging] 2024-01-12 12:13:16 +00:00
renovate[bot] 7bcabd9803
chore(deps): update dependency netlify-cli to v17.13.1 [staging] 2024-01-11 14:35:46 +00:00
renovate[bot] c862906b02
chore(deps): update dependency netlify-cli to v17.13.0 [staging] 2024-01-09 17:31:11 +00:00
GitHub Actions f241ff61bd 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] 071fb970d4
chore(deps): update dependency gohugoio/hugo to v0.121.2 [staging] 2024-01-05 14:15:06 +00:00
renovate[bot] da35964737
chore(deps): update dependency netlify-cli to v17.11.1 [staging] 2024-01-05 10:47:47 +00:00
renovate[bot] 1b89ad43da
chore(deps): update dependency netlify-cli to v17.11.0 [staging] 2024-01-02 16:46:37 +00:00
Harsh Shandilya f07e327a31 . 2024-01-02 21:17:16 +05:30
Harsh Shandilya 0b51f5211e polish dependency sync post a bit more 2024-01-02 01:38:27 +05:30
GitHub Actions ed7d6aa3cc 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] e8a2b87118
chore(deps): update dependency netlify-cli to v17.10.2 [staging] 2023-12-29 15:04:30 +00:00
GitHub Actions f444ba8696 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 9947630d47 . 2023-12-19 02:26:00 +05:30
GitHub Actions abc87c38ae 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 4cb149dcca chore: finish up dependency sync post :fingers-crossed: 2023-12-14 18:17:05 +05:30
Harsh Shandilya 9240269333
fix: add missing `doCheck` 2023-12-12 20:00:41 +05:30
Harsh Shandilya d9c630e13e
chore: fix code example 2023-12-12 19:57:04 +05:30
Harsh Shandilya 390fd3b86f
chore: refresh about page 2023-12-12 19:51:41 +05:30
Harsh Shandilya 3d92098618 chore: add page bundles to ignore-revs 2023-12-11 12:18:12 +05:30
Harsh Shandilya 83c1a03b3c chore: try out page bundles 2023-12-11 12:17:32 +05:30
Harsh Shandilya 382e566a94 Flesh out links in gradle sync post 2023-12-11 12:14:49 +05:30
Harsh Shandilya 1b7210a058 config: link my Gitea for funsies 2023-12-11 12:04:50 +05:30
Harsh Shandilya 94e7f1fb4a config: explicitly set what sites get share buttons 2023-12-11 11:57:18 +05:30
Harsh Shandilya 14cbe17d48 config: correct edit url 2023-12-11 11:52:02 +05:30
Harsh Shandilya 5bc9b60746 chore: bump PaperMod 2023-12-11 11:23:15 +05:30
renovate[bot] 4c797cf91d
chore(deps): update dependency prettier to v3.1.1 [staging] 2023-12-10 09:31:51 +00:00
GitHub Actions eeee83f515 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 0cf0876987 Update Blog “improving-dependency-sync-speeds-for-your-gradle-project” 2023-12-09 14:46:15 +00:00
renovate[bot] b41b3ea151
chore(deps): update dependency netlify-cli to v17.10.1 [staging] 2023-12-08 15:39:53 +00:00
renovate[bot] b3d3ade537
chore(deps): update dependency gohugoio/hugo to v0.121.1 [staging] 2023-12-08 12:43:25 +00:00
Harsh Shandilya 327a0b161b Update Blog “using-containers-in-nixos” 2023-12-08 11:27:44 +00:00
renovate[bot] 597135af64
chore(deps): update dependency netlify-cli to v17.10.0 [staging] 2023-12-06 21:45:34 +00:00
renovate[bot] d68357d4b5
chore(deps): update actions/setup-go action to v5 [staging] 2023-12-06 16:08:11 +00:00
renovate[bot] 930c743814
chore(deps): update dependency gohugoio/hugo to v0.121.0 [staging] 2023-12-05 18:25:10 +00:00
Harsh Shandilya a39e1ec355 Create Blog “using-containers-in-nixos” 2023-12-05 05:45:52 +00:00
renovate[bot] 5e4814aa3f
chore(deps): update dependency netlify-cli to v17.9.0 [staging] 2023-12-04 11:06:02 +00:00
GitHub Actions 3e374a0664 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] 5d5f5b34b7
chore(deps): update dependency netlify-cli to v17.8.1 [staging] 2023-11-28 23:23:26 +00:00
GitHub Actions d75460d5ca 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] e7aef06360
chore(deps): update dependency netlify-cli to v17.7.0 [staging] 2023-11-23 18:19:20 +00:00
renovate[bot] e5974fe13d
chore(deps): update dependency netlify-cli to v17.6.0 [staging] 2023-11-21 15:10:05 +00:00
renovate[bot] 58169a93dd
chore(deps): update dependency netlify-cli to v17.5.3 [staging] 2023-11-20 20:15:05 +00:00
renovate[bot] 6740df743a
chore(deps): update dependency netlify-cli to v17.5.2 [staging] 2023-11-20 13:56:50 +00:00
Harsh Shandilya 6f5f3ecaa1
netlify: require Node 18 for builds 2023-11-20 10:41:46 +05:30
Harsh Shandilya c43d45931a
bump PaperMod 2023-11-20 10:35:20 +05:30
GitHub Actions c3306af42f 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] 4de41982ee
chore(deps): update dependency netlify-cli to v17.5.1 [staging] 2023-11-17 14:00:24 +00:00
renovate[bot] 1c8cccba86
chore(deps): update dependency netlify-cli to v17.4.0 [staging] 2023-11-16 16:55:20 +00:00
renovate[bot] ed3d945de6
chore(deps): update dependency netlify-cli to v17.3.2 [staging] 2023-11-15 14:17:55 +00:00
renovate[bot] c371d93297
chore(deps): update dependency netlify-cli to v17.3.1 [staging] 2023-11-14 17:33:12 +00:00
renovate[bot] c2387fb67a
chore(deps): update dependency prettier to v3.1.0 [staging] 2023-11-13 04:57:34 +00:00
GitHub Actions 4e7042c775 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] b8bfd083f7
chore(deps): update dependency netlify-cli to v17.2.2 [staging] 2023-11-10 12:26:42 +00:00
renovate[bot] 5a88c53d76
chore(deps): update dependency netlify-cli to v17.2.1 [staging] 2023-11-09 11:05:18 +00:00
renovate[bot] 344612e8cf
chore(deps): update dependency netlify-cli to v17.2.0 [staging] 2023-11-08 19:35:38 +00:00
renovate[bot] c717a4b2d6
chore(deps): update dependency gohugoio/hugo to v0.120.4 [staging] 2023-11-08 14:00:15 +00:00
renovate[bot] d71d3f33be
chore(deps): update dependency netlify-cli to v17.1.0 [staging] 2023-11-07 15:02:22 +00:00
GitHub Actions 9038e31906 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] 75abd432cb
chore(deps): update dependency netlify-cli to v17.0.1 [staging] 2023-11-02 17:32:52 +00:00
renovate[bot] bcbce1099d
chore(deps): update dependency gohugoio/hugo to v0.120.3 [staging] 2023-11-01 18:30:31 +00:00
renovate[bot] 41cbf74099
chore(deps): update dependency netlify-cli to v17 [staging] 2023-11-01 14:02:24 +00:00
renovate[bot] d06ded06cb
chore(deps): update dependency gohugoio/hugo to v0.120.2 [staging] 2023-10-31 18:48:04 +00:00
renovate[bot] 4f5b3661b6
chore(deps): update dependency gohugoio/hugo to v0.120.1 [staging] 2023-10-30 19:11:42 +00:00
GitHub Actions 5b11a49bd9 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] 06dbd13342
chore(deps): update dependency netlify-cli to v16.9.3 [staging] 2023-10-27 22:14:53 +00:00
Harsh Shandilya 7d53594ae3
netlify: allow build command to be set on dashboard 2023-10-25 12:48:46 +05:30
Harsh Shandilya 1707fa1d90 Update Blog “using-retrofit-to-disguise-scraping-as-a-rest-api” 2023-10-24 18:38:21 +00:00
renovate[bot] 1870fe6042
chore(deps): update dependency netlify-cli to v16.9.2 [staging] 2023-10-24 16:42:46 +00:00
Harsh Shandilya 5ecf2ff5f6
admin: update to decap-cms 3.1.0-beta.0 2023-10-24 16:36:07 +05:30
GitHub Actions b25e7f79af 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] c020e41a50
chore(deps): update dependency netlify-cli to v16.9.1 [staging] 2023-10-20 22:07:52 +00:00
renovate[bot] d8f4e634df
chore(deps): update dependency netlify-cli to v16.9.0 [staging] 2023-10-19 20:29:20 +00:00
renovate[bot] fe29d9ae75
chore(deps): update actions/checkout digest to b4ffde6 [staging] 2023-10-19 10:22:41 +00:00
renovate[bot] c264f42e9d
chore(deps): update dependency netlify-cli to v16.8.0 [staging] 2023-10-17 12:16:08 +00:00
GitHub Actions 4cdf469653 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] 4b035c3405
chore(deps): update dependency netlify-cli to v16.7.0 [staging] 2023-10-12 19:29:49 +00:00
renovate[bot] fbe1a4a959
chore(deps): update dependency netlify-cli to v16.6.2 [staging] 2023-10-12 13:53:04 +00:00
renovate[bot] 25c7f97635
chore(deps): update dependency netlify-cli to v16.6.1 [staging] 2023-10-10 19:50:21 +00:00
GitHub Actions bc6a013cbe 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 51a3f4e568
Fix Netlify overriding robots.txt 2023-10-06 21:29:58 +05:30
renovate[bot] cf6625d1b7
chore(deps): update dependency netlify-cli to v16.5.1 [staging] 2023-10-03 10:36:01 +00:00
renovate[bot] 1757019d15
chore(deps): update dependency netlify-cli to v16.5.0 [staging] 2023-10-02 15:48:46 +00:00
GitHub Actions 93e95b7e60 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 f9953f929e
Block AI scrapers 2023-09-30 01:12:26 +05:30
renovate[bot] e5f63d2a54
chore(deps): update dependency gohugoio/hugo to v0.119.0 [staging] 2023-09-24 16:14:27 +00:00
GitHub Actions 329420e8cf 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] 09b21c0413
chore(deps): update actions/checkout digest to 8ade135 [staging] 2023-09-22 18:29:01 +00:00
renovate[bot] 3f76f721f6
chore(deps): update dependency netlify-cli to v16.4.2 [staging] 2023-09-21 14:11:11 +00:00
renovate[bot] a57489122b
chore(deps): update dependency netlify-cli to v16.4.1 [staging] 2023-09-20 12:44:37 +00:00
renovate[bot] 6574ee3c50
chore(deps): update dependency netlify-cli to v16.4.0 [staging] 2023-09-19 11:52:49 +00:00
renovate[bot] 661c1573de
chore(deps): update dependency netlify-cli to v16.3.6 [staging] 2023-09-18 19:51:35 +00:00
renovate[bot] f837560dfd
chore(deps): update dependency netlify-cli to v16.3.5 [staging] 2023-09-18 13:23:11 +00:00
GitHub Actions 6ef6166d57 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] 4f03ffb66d
chore(deps): update dependency netlify-cli to v16.3.3 [staging] 2023-09-15 16:18:39 +00:00
renovate[bot] 68c1ca5807
chore(deps): update dependency netlify-cli to v16.3.2 [staging] 2023-09-13 16:53:54 +00:00
Harsh Shandilya 9c30b17691 Create Blog “improving-dependency-sync-speeds-for-your-gradle-project” 2023-09-13 07:27:08 +00:00
Harsh Shandilya 4e91b70d4a Update Blog “using-retrofit-to-disguise-scraping-as-a-rest-api” 2023-09-13 07:23:21 +00:00
GitHub Actions 8ddf9e6b1c 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] 5743952e24
chore(deps): update dependency netlify-cli to v16.3.1 [staging] 2023-09-06 12:38:09 +00:00
renovate[bot] a7be5210f4
chore(deps): update actions/checkout action to v4 [staging] 2023-09-04 14:03:26 +00:00
GitHub Actions 3035834a68 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 e0bd7c3aec Create Blog “using-retrofit-to-disguise-scraping-as-a-rest-api” 2023-09-02 21:39:51 +00:00
renovate[bot] 7182fcfad4
chore(deps): update dependency gohugoio/hugo to v0.118.2 [staging] 2023-08-31 12:08:00 +00:00
renovate[bot] 3c5ed8617c
chore(deps): update dependency prettier to v3.0.3 [staging] 2023-08-29 12:53:59 +00:00
renovate[bot] cd2133e6ca
chore(deps): update dependency netlify-cli to v16.2.0 [staging] 2023-08-29 08:12:42 +00:00
GitHub Actions 94fb915b5b 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] 989cf08b34
chore(deps): update actions/checkout digest to f43a0e5 [staging] 2023-08-24 16:51:57 +00:00
Harsh Shandilya 66a9f1e530
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 3720b41480 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] 519f3ac7c8
chore(deps): update dependency netlify-cli to v16.1.0 [staging] 2023-08-17 13:21:58 +00:00
renovate[bot] 63f727c021
chore(deps): update dependency prettier to v3.0.2 [staging] 2023-08-15 16:00:58 +00:00
renovate[bot] 8ccda18b64
chore(deps): update dependency netlify-cli to v16.0.3 [staging] 2023-08-14 15:59:04 +00:00
GitHub Actions 5254be117b 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] 0d4e95d6b1
chore(deps): update dependency netlify-cli to v16.0.2 [staging] 2023-08-11 16:15:12 +00:00
renovate[bot] 5c07091e3c
chore(deps): update dependency netlify-cli to v16.0.1 [staging] 2023-08-10 18:58:41 +00:00
renovate[bot] 49ebd2aa02
chore(deps): update dependency netlify-cli to v16 [staging] 2023-08-10 17:09:43 +00:00
renovate[bot] f0112f766f
chore(deps): update actions/setup-go digest to 93397be [staging] 2023-08-08 13:15:48 +00:00
renovate[bot] d2d53dc4ad
chore(deps): update dependency netlify-cli to v15.11.0 [staging] 2023-08-07 20:07:21 +00:00
renovate[bot] 2f57bddba6
chore(deps): update dependency gohugoio/hugo to v0.117.0 [staging] 2023-08-07 16:25:01 +00:00
GitHub Actions 03ae1c8feb 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 3a2c186fab
Update PaperMod 2023-08-04 02:15:07 +05:30
renovate[bot] eaddf3fcd2
chore(deps): update dependency prettier to v3.0.1 [staging] 2023-08-03 06:56:45 +00:00
renovate[bot] 921bd121b3
chore(deps): update dependency gohugoio/hugo to v0.116.1 [staging] 2023-08-01 09:34:17 +00:00
renovate[bot] 0fd8f7d67f
chore(deps): update dependency netlify-cli to v15.10.0 [staging] 2023-07-31 17:06:12 +00:00
renovate[bot] a8c4cb99b8
chore(deps): update dependency gohugoio/hugo to v0.116.0 [staging] 2023-07-31 12:57:03 +00:00
GitHub Actions 6b0d31108a 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 6049107dfb
Use auto theme 2023-07-24 15:33:18 +05:30
GitHub Actions ea121ffea7 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] 276a0e1dd8
chore(deps): update dependency gohugoio/hugo to v0.115.4 [staging] 2023-07-20 10:10:07 +00:00
renovate[bot] 4bb667e560
chore(deps): update dependency netlify-cli to v15.9.1 [staging] 2023-07-19 12:08:15 +00:00
GitHub Actions e6c93ad122 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] bbf4aec54e
chore(deps): update dependency gohugoio/hugo to v0.115.3 [staging] 2023-07-13 18:27:35 +00:00
renovate[bot] eda510a8d5
chore(deps): update dependency netlify-cli to v15.9.0 [staging] 2023-07-12 15:02:05 +00:00
Harsh Shandilya aa1a8a9add
config: direct to `/posts/` feed from homepage 2023-07-11 10:45:44 +05:30
Harsh Shandilya 8bce958705
refactor: update RSS output template 2023-07-10 17:34:19 +05:30
Harsh Shandilya cae4a53ee8
chore: update PaperMod 2023-07-10 17:20:52 +05:30
GitHub Actions f335b10a08 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] f898d83e53
chore(deps): update dependency gohugoio/hugo to v0.115.2 [staging] 2023-07-08 19:29:26 +00:00
renovate[bot] cfc2bf3b2c
chore(deps): update dependency netlify-cli to v15.8.1 [staging] 2023-07-06 20:35:20 +00:00
Harsh Shandilya 44d016a1d8
chore: reformat Nix files with alejandra 2023-07-06 18:06:57 +05:30
renovate[bot] 40ab14acc3
chore(deps): update dependency prettier to v3 [staging] 2023-07-05 15:30:22 +00:00
renovate[bot] 94296b9ad1
chore(deps): update dependency gohugoio/hugo to v0.115.1 [staging] 2023-07-03 23:08:34 +00:00
GitHub Actions e4ac571acf 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 7aef9a9eeb
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 06197436e8
chore: refresh resume 2023-07-01 20:27:47 +05:30
renovate[bot] a4d331c891
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] 625473961a
chore(deps): update dependency gohugoio/hugo to v0.115.0 [staging] 2023-06-29 19:43:51 +00:00
renovate[bot] cc568db93b
chore(deps): update dependency netlify-cli to v15.7.0 [staging] 2023-06-27 15:18:04 +00:00
GitHub Actions 7d193d0f0b 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] 05066e0e0e
chore(deps): update dependency gohugoio/hugo to v0.114.1 [staging] 2023-06-23 14:00:17 +00:00
renovate[bot] 7dfbb3b677
chore(deps): lock file maintenance [staging] 2023-06-21 01:38:34 +00:00
renovate[bot] 379a812bc4
chore(deps): update dependency gohugoio/hugo to v0.114.0 [staging] 2023-06-19 20:13:40 +00:00
GitHub Actions 9f8c7fd136 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] 9953596f11
chore(deps): update dependency netlify-cli to v15.6.0 [staging] 2023-06-14 17:32:49 +00:00
renovate[bot] 0e3f46a1f3
chore(deps): update dependency netlify-cli to v15.5.1 [staging] 2023-06-13 17:20:51 +00:00
Harsh Shandilya 970ab0b504
fix(flakes): add back JS tooling 2023-06-13 16:07:26 +05:30
renovate[bot] 2a36e160e1
chore(deps): update dependency netlify-cli to v15.4.2 [staging] 2023-06-12 16:05:32 +00:00
GitHub Actions 21f9a442fb 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] 2aedc3658d
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] c0e85b3801
chore(deps): update actions/checkout digest to c85c95e [staging] 2023-06-09 17:38:01 +00:00
renovate[bot] f8156dbe8e
chore(deps): update dependency netlify-cli to v15.4.1 [staging] 2023-06-08 14:30:26 +00:00
renovate[bot] ec0fcd9673
chore(deps): update dependency netlify-cli to v15.4.0 [staging] 2023-06-07 14:05:20 +00:00
renovate[bot] bc128a2461
chore(deps): update dependency gohugoio/hugo to v0.113.0 [staging] 2023-06-05 18:07:05 +00:00
GitHub Actions e754dbda1a 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] 2ea2dac3af
chore(deps): update dependency netlify-cli to v15.3.1 [staging] 2023-06-02 19:59:47 +00:00
renovate[bot] f487e5c763
chore(deps): update dependency gohugoio/hugo to v0.112.7 [staging] 2023-06-02 17:21:19 +00:00
renovate[bot] 8184f7f7a0
chore(deps): update dependency gohugoio/hugo to v0.112.5 [staging] 2023-05-29 09:53:20 +00:00
renovate[bot] f92790dc16
chore(deps): update dependency gohugoio/hugo to v0.112.4 [staging] 2023-05-28 13:49:44 +00:00
GitHub Actions c39d403ceb 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] c7ae4aa15b
chore(deps): update dependency netlify-cli to v15.2.0 [staging] 2023-05-26 09:58:49 +00:00
renovate[bot] a0e20eb3d6
chore(deps): update dependency gohugoio/hugo to v0.112.3 [staging] 2023-05-24 16:17:59 +00:00
renovate[bot] 6386956a9f
chore(deps): update dependency gohugoio/hugo to v0.112.1 [staging] 2023-05-23 17:47:49 +00:00
renovate[bot] 8803b40adb
chore(deps): update dependency gohugoio/hugo to v0.112.0 [staging] 2023-05-23 08:27:59 +00:00
GitHub Actions 0156eaaeaf 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] 9cd2bfb67b
chore(deps): update dependency netlify-cli to v15.1.1 [staging] 2023-05-17 10:19:27 +00:00
renovate[bot] 77c5aebbc2
chore(deps): update dependency netlify-cli to v15.1.0 [staging] 2023-05-15 20:58:23 +00:00
renovate[bot] 8cfc6546c4
chore(deps): update actions/setup-go digest to fac708d [staging] 2023-05-15 17:49:44 +00:00
GitHub Actions 61c4350253 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 cb1210bea9
fix(flakes): remove flake-utils from devshell 2023-05-12 12:21:45 +05:30
Harsh Shandilya f3f91f5f84
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] b3e30d2b21
chore(deps): update dependency netlify-cli to v15.0.2 [staging] 2023-05-08 17:02:27 +00:00
GitHub Actions a4113fa743 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] af0ac1be98
chore(deps): update dependency netlify-cli to v15 [staging] 2023-05-05 17:00:29 +00:00
renovate[bot] 1372b4db19
chore(deps): update dependency netlify-cli to v14.4.0 [staging] 2023-05-03 17:44:00 +00:00
GitHub Actions 31f2235b02 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] f4db7794fd
chore(deps): update dependency netlify-cli to v14.3.1 [staging] 2023-04-26 20:14:08 +00:00
renovate[bot] f2033647f9
chore(deps): update dependency netlify-cli to v14.3.0 [staging] 2023-04-25 12:31:27 +00:00
renovate[bot] d13b6f30e2
chore(deps): update dependency prettier to v2.8.8 [staging] 2023-04-23 08:51:28 +00:00
GitHub Actions 3b0bd807e2 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] b69ca27b2b
chore(deps): update dependency netlify-cli to v14.2.1 [staging] 2023-04-20 15:09:36 +00:00
renovate[bot] 7b2534d082
chore(deps): update dependency netlify-cli to v14.1.0 [staging] 2023-04-19 17:29:43 +00:00
renovate[bot] 5ef09614ee
chore(deps): update dependency netlify-cli to v14 [staging] 2023-04-17 14:27:27 +00:00
GitHub Actions 637ea1740c 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] e099b27aab
chore(deps): update actions/checkout digest to 8e5e7e5 [staging] 2023-04-13 14:17:35 +00:00
renovate[bot] f5b92ff5e1
chore(deps): update actions/checkout digest to 83b7061 [staging] 2023-04-12 17:27:44 +00:00
GitHub Actions 7980f205fc 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 8f900ffa6b
fix: adjust Flake for updated devshell 2023-04-01 12:11:32 +05:30
Harsh Shandilya 16a5545cdb
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 0d68bd20ae
fix: remove explicit branches from inputs 2023-04-01 12:07:41 +05:30
Harsh Shandilya 024bc043fe
feat: add GitHub workflow for update `flake.lock` 2023-04-01 12:06:25 +05:30
Harsh Shandilya dbba5f2eb8
feat: restore full-text RSS feed 2023-04-01 12:05:42 +05:30
Harsh Shandilya 6a2e56fccb
fix: update content 2023-04-01 12:00:01 +05:30
Harsh Shandilya 05fefec352
feat: rework home page 2023-04-01 12:00:01 +05:30
Harsh Shandilya 51d810a866
feat: include Dracula code style for Chroma 2023-04-01 11:30:19 +05:30
renovate[bot] 080492f7f0
chore(deps): update dependency netlify-cli to v13.2.2 [staging] 2023-03-28 13:26:48 +00:00
Harsh Shandilya a37e306c05
rip twitter 2023-03-27 13:37:46 +05:30
renovate[bot] bb4e4173bd
chore(deps): update dependency prettier to v2.8.7 [staging] 2023-03-24 09:17:13 +00:00
renovate[bot] fcdda605d8
chore(deps): update actions/checkout digest to 8f4b7f8 [staging] 2023-03-24 06:26:10 +00:00
renovate[bot] b95b79c6c1
chore(deps): update dependency netlify-cli to v13.2.1 [staging] 2023-03-22 16:30:07 +00:00
renovate[bot] c1bfafe9d4
chore(deps): update dependency netlify-cli to v13.2.0 [staging] 2023-03-21 14:47:43 +00:00
renovate[bot] 7cc149a93f
chore(deps): update dependency prettier to v2.8.6 [staging] 2023-03-21 08:59:12 +00:00
renovate[bot] 0624a52ddf
chore(deps): update dependency prettier to v2.8.5 [staging] 2023-03-20 08:12:32 +00:00
Harsh Shandilya 8003029beb
chore: slim down Flake closure size 2023-03-18 11:49:56 +05:30
Harsh Shandilya 6e88db4f20
chore: adjust config 2023-03-18 11:49:46 +05:30
renovate[bot] e901de008b
chore(deps): update actions/setup-go action to v4 [staging] 2023-03-16 01:21:45 +00:00
renovate[bot] 130b413b38
chore(deps): update dependency prettier to v2.8.4 [staging] 2023-03-15 23:33:27 +00:00
renovate[bot] 4cc5b5a97e
chore(deps): update actions/checkout digest to 24cb908 [staging] 2023-03-15 20:14:47 +00:00
renovate[bot] 347c958fc1
chore(deps): update dependency netlify-cli to v13.1.6 [staging] 2023-03-15 16:40:23 +00:00
Harsh Shandilya 5d9d60b709
games 2023-03-12 23:34:06 +05:30
renovate[bot] 0839676c12
chore(deps): update dependency gohugoio/hugo to v0.111.3 [staging] 2023-03-12 12:18:36 +00:00
renovate[bot] 39e1a03158
chore(deps): update dependency gohugoio/hugo to v0.111.2 [staging] 2023-03-05 15:39:16 +00:00
renovate[bot] 8e0f3ea93f
chore(deps): update dependency gohugoio/hugo to v0.111.1 [staging] 2023-03-02 12:29:32 +00:00
renovate[bot] a4b3008b66
chore(deps): update dependency gohugoio/hugo to v0.111.0 [staging] 2023-03-01 21:44:30 +00:00
renovate[bot] 6e5df661a6
chore(deps): update dependency netlify-cli to v13 [staging] 2023-02-21 18:15:31 +00:00
Harsh Shandilya 675ccfa598 feat: upgrade to PaperMod 7.0 2023-02-12 07:36:31 +00:00
Harsh Shandilya 40d03ee2ed
Step 1 of excising Twitter 2023-02-03 19:25:51 +05:30
Harsh Shandilya 6422c1069a
. 2023-01-18 01:06:12 +05:30
Harsh Shandilya eb84217624 Update Blog “tips-and-tricks-for-using-renovate” 2023-01-17 19:32:23 +00:00
Harsh Shandilya b85061188d
. 2023-01-18 00:57:58 +05:30
Harsh Shandilya c9c76ce045 Update Blog “tips-and-tricks-for-using-renovate” 2023-01-17 19:10:37 +00:00
renovate[bot] e24ce125e2
chore(deps): update dependency gohugoio/hugo to v0.110.0 [staging] 2023-01-17 12:48:53 +00:00
Harsh Shandilya 05706914a0
fix: add draft status 2023-01-15 15:29:02 +05:30
Harsh Shandilya 5caf161f7b Update Blog “tips-and-tricks-for-using-renovate” 2023-01-15 09:54:54 +00:00
Harsh Shandilya 98ba2d16be Update Blog “tips-and-tricks-for-using-renovate” 2023-01-15 09:54:13 +00:00
Harsh Shandilya a5059a39d8 Update Blog “tips-and-tricks-for-using-renovate” 2023-01-15 09:53:16 +00:00
Harsh Shandilya 5420bcd08b
feat: set up Netlify CMS 2023-01-15 14:40:43 +05:30
Harsh Shandilya 1c80715a24
chore(nix): bump flake inputs 2023-01-15 14:18:15 +05:30
Harsh Shandilya 7c78e75972
. 2023-01-10 01:46:05 +05:30
Harsh Shandilya 8baa794d9c
chore(nix): bump flake inputs 2023-01-10 01:20:43 +05:30
Harsh Shandilya 618e195b95
feat(nix): set up flake-compat 2023-01-10 01:20:38 +05:30
Harsh Shandilya bf31b7f1b5
. 2023-01-08 19:33:44 +05:30
renovate[bot] 808054c5db
chore(deps): update actions/checkout digest to ac59398 [staging] 2023-01-05 16:43:30 +00:00
Harsh Shandilya 25b6348dbe
💀 2022-12-27 20:24:35 +05:30
Harsh Shandilya 017d652214
. 2022-12-26 15:13:11 +05:30
Harsh Shandilya 1f5aa3a1de
👻 2022-12-26 14:56:08 +05:30
Harsh Shandilya 288cda8da4
:fingers-crossed: 2022-12-26 14:35:15 +05:30
renovate[bot] 767cbc87a4
chore(deps): update dependency gohugoio/hugo to v0.109.0 [staging] 2022-12-23 12:12:04 +00:00
Harsh Shandilya e896ad68f3
plaintext? 2022-12-23 17:41:22 +05:30
Harsh Shandilya 1b10620377
Explain `concatStringsSep` 2022-12-23 17:13:51 +05:30
Harsh Shandilya 0e7072e44e
static: cleanup 2022-12-23 17:06:43 +05:30
Harsh Shandilya 3344001796
treewide: fix typos 2022-12-23 17:06:11 +05:30
Harsh Shandilya bb08f41487
undraft post 2022-12-23 16:52:29 +05:30
Harsh Shandilya 3e2c75109b
`nix flake check`
Fixes SDP-36
2022-12-23 16:51:25 +05:30
Harsh Shandilya 433dc71b74
fix(flakes): skip ntl dev 2022-12-23 16:07:21 +05:30
Harsh Shandilya c700c8cf61
fix: disable special 1st post config 2022-12-20 01:12:50 +05:30
Harsh Shandilya 87634889b9
fix: remove stray closing tag 2022-12-20 01:12:11 +05:30
Harsh Shandilya d285ed9a3b
chore: replace imagemagick with libwebp 2022-12-19 10:31:08 +05:30
renovate[bot] ee5dac244f
chore(deps): update actions/setup-go digest to 6edd440 [staging] 2022-12-13 17:20:23 +00:00
renovate[bot] eb0f90e87e
chore(deps): update actions/checkout digest to 755da8c [staging] 2022-12-13 15:08:35 +00:00
renovate[bot] e6a6d2ff91
chore(deps): update actions/checkout digest to 7dd9e2a [staging] 2022-12-12 20:05:16 +00:00
Harsh Shandilya bb6523d7da
fix: add missing quote breaking highlighting 2022-12-08 11:25:48 +05:30
Harsh Shandilya 7cbff3c49e
chore: tweak config 2022-12-08 11:23:54 +05:30
Harsh Shandilya 9646777669
chore: add status badge 2022-12-08 11:13:30 +05:30
Harsh Shandilya 7f8d16d471
chore: refresh about page 2022-12-08 11:11:00 +05:30
Harsh Shandilya b354796a22
chore: update resume 2022-12-08 10:53:49 +05:30
renovate[bot] 02286c5712
chore(deps): update dependency gohugoio/hugo to v0.108.0 [staging] 2022-12-06 15:41:53 +00:00
Harsh Shandilya 9f689921f2
chore(nix): bump flake inputs 2022-12-02 14:20:54 +05:30
renovate[bot] efe98c5539
chore(deps): update actions/setup-go digest to d0a58c1 [staging] 2022-12-01 16:32:14 +00:00
Harsh Shandilya 71ee12501d
Fix broken link 2022-11-28 14:15:01 +05:30
Harsh Shandilya 131a32d2ab
flake.lock: update 2022-11-28 14:06:23 +05:30
Harsh Shandilya 8390cc60e0
fix: prevent Googlebot from poking at WebFinger 2022-11-28 11:16:03 +05:30
Harsh Shandilya 351ac81a2d
fix: avoid duplicate inputs 2022-11-25 01:31:03 +05:30
renovate[bot] dbc7b1a067
chore(deps): update dependency gohugoio/hugo to v0.107.0 [staging] 2022-11-24 14:33:35 +00:00
Harsh Shandilya bd13373b7d
chore: update uses 2022-11-22 10:45:23 +05:30
Harsh Shandilya 1d4ec83c1e
feat: properly configure Netlify dev command 2022-11-22 10:44:02 +05:30
Harsh Shandilya ae01503f87
chore(deps): update Netlify CLI and other dependencies 2022-11-22 00:39:12 +05:30
renovate[bot] b5e2bf4e72
chore(deps): update dependency gohugoio/hugo to v0.106.0 [staging] 2022-11-17 20:20:32 +00:00
Harsh Shandilya 4ab0be0442
fix(nix): directly use hugo for devshell commands 2022-11-17 21:20:51 +05:30
Harsh Shandilya 32761f61d2
fix(nix): add help text to commands 2022-11-17 19:55:08 +05:30
Harsh Shandilya ba0f2ec668
feat(nix): add build command 2022-11-17 02:04:13 +05:30
Harsh Shandilya 5688ca352d
feat(nix): migrate to Flakes 2022-11-16 17:27:38 +05:30
Harsh Shandilya 6c320239b0
chore: update README 2022-11-16 17:07:42 +05:30
Harsh Shandilya 8eb97ad551
config: tweak description 2022-11-16 17:00:52 +05:30
Harsh Shandilya 802d87cc61
whoops 2022-11-16 14:58:47 +05:30
Harsh Shandilya 993298621c
New post 2022-11-16 14:52:09 +05:30
Harsh Shandilya 76b0da1983
fix(webfinger): restrict valid identities 2022-11-16 14:31:12 +05:30
Harsh Shandilya 0aad6fff30
refactor(webfinger): put failure conditions first 2022-11-16 14:02:29 +05:30
Harsh Shandilya 90587e878f
chore: add Yarn lockfile 2022-11-16 12:04:38 +05:30
Harsh Shandilya 801aff819b
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 8f9ff89e2a
refactor(netlify): rework the webfinger edge function 2022-11-16 11:59:00 +05:30
Harsh Shandilya 9d377280a7
feat(netlify): add an edge function for WebFinger 2022-11-16 00:51:53 +05:30
Harsh Shandilya 4c9009d36c
chore: flesh out development setup 2022-11-16 00:51:27 +05:30
Harsh Shandilya e9f464c942
chore: remove useless `tsconfig.json` 2022-11-16 00:22:19 +05:30
Harsh Shandilya 14d8a43996
fixup! feat: add fediverse info 2022-11-11 15:57:04 +05:30
Harsh Shandilya e3ac219cf3
fix(content): adjust tags 2022-11-11 15:33:59 +05:30
Harsh Shandilya 9dbe1ab49f
feat: add fediverse info 2022-11-02 22:54:43 +05:30
renovate[bot] 1c16cd7a2c
chore(deps): update dependency gohugoio/hugo to v0.105.0 [staging] 2022-10-28 12:58:44 +00:00
Harsh Shandilya a291e196e8
fix(netlify): remove unnecessary logging 2022-10-26 23:31:49 +05:30
renovate[bot] e96f46ebdb
chore(deps): update peaceiris/actions-hugo digest to 16361eb [staging] 2022-10-23 17:01:48 +00:00
renovate[bot] 16a7c2d863
chore(deps): update actions/setup-go digest to c4a742c [staging] 2022-10-18 13:43:46 +00:00
Harsh Shandilya 6e46e25125
fix(nix): remove wrangler 2022-10-12 01:06:56 +05:30
renovate[bot] 8a962fddc0
chore(deps): update actions/checkout digest to 93ea575 [staging] 2022-10-11 12:30:24 +00:00
Harsh Shandilya 7f0e9d7099
all: remove Cloudflare Workers functionality 2022-10-08 20:19:37 +05:30
Harsh Shandilya ca773db943
netlify: add an edge function to handle redirects 2022-10-08 20:13:57 +05:30
Harsh Shandilya 68023467e1
netlify: init 2022-10-06 19:42:24 +05:30
renovate[bot] b62f8a453b
chore(deps): update actions/checkout digest to 2541b12 [staging] 2022-10-05 10:56:38 +00:00
renovate[bot] 537a7f611e
chore(deps): update dependency gohugoio/hugo to v0.104.3 [staging] 2022-10-04 19:32:35 +00:00
renovate[bot] 64abc63b53
chore(deps): update actions/checkout digest to 93ea575 [staging] 2022-10-04 15:23:12 +00:00
renovate[bot] 363c877ecd
chore(deps): update dependency gohugoio/hugo to v0.104.2 [staging] 2022-09-29 13:22:32 +00:00
renovate[bot] fb3a9b2a34
chore(deps): update dependency typescript to v4.8.4 [staging] 2022-09-27 23:10:52 +00:00
Harsh Shandilya d5b52a7309
fix(renovate): remove invalid trailing comma 2022-09-27 18:27:02 +05:30
renovate[bot] ea6036e914
chore(deps): update dependency gohugoio/hugo to v0.104.1 [staging] 2022-09-26 20:39:31 +00:00
renovate[bot] 256c305c6f
chore(deps): update dependency gohugoio/hugo to v0.104.0 [staging] 2022-09-23 16:37:07 +00:00
renovate[bot] b32376756f
chore(deps): update dependency gohugoio/hugo to v0.103.1 [staging] 2022-09-18 16:01:10 +00:00
renovate[bot] d00d0cc41d
chore(deps): update dependency gohugoio/hugo to v0.103.0 [staging] 2022-09-15 18:15:41 +00:00
renovate[bot] 7fc81b1e1c
chore(deps): update dependency typescript to v4.8.3 [staging] 2022-09-08 19:33:56 +00:00
renovate[bot] 3f581fe8c7
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 fb7ed432aa
fix(ci): use correct version of wrangler action
[staging] [deploy]
2022-09-02 00:31:12 +05:30
renovate[bot] e4c8ba0ed7
chore(deps): update dependency @cloudflare/workers-types to v3.16.0 [staging] 2022-09-01 15:00:09 +00:00
renovate[bot] f50a525d5c
chore(deps): update dependency gohugoio/hugo to v0.102.3 [staging] 2022-09-01 11:17:10 +00:00
renovate[bot] f9e102470e
chore(deps): update dependency gohugoio/hugo to v0.102.2 [staging] 2022-08-31 13:20:25 +00:00
renovate[bot] da2e637285
chore(deps): update dependency @cloudflare/workers-types to v3.15.0 [staging] 2022-08-30 15:59:32 +00:00
renovate[bot] cada603a41
chore(deps): update dependency gohugoio/hugo to v0.102.1 [staging] 2022-08-29 15:46:34 +00:00
renovate[bot] 610f689693
chore(deps): update dependency gohugoio/hugo to v0.102.0 [staging] 2022-08-28 18:29:04 +00:00
Harsh Shandilya 1e06568b7a
feat(wrangler): add a preview namespace for local dev 2022-08-26 12:34:37 +05:30
Harsh Shandilya f2e5710a55
feat(node): bump package versions 2022-08-26 12:34:24 +05:30
Harsh Shandilya 5b7e6f1a54
feat(wrangler): migrate to Wrangler 2 [deploy] 2022-08-26 12:25:04 +05:30
renovate[bot] 1b42f5a9bd
chore(deps): update dependency typescript to v4.8.2 [staging] 2022-08-26 00:14:40 +00:00
renovate[bot] 00e11c0aec
chore(deps): update module go to 1.19 [staging] 2022-08-02 17:17:55 +00:00
Harsh Shandilya e040a3c575
fix(deps): setup Renovate to pin GHA digests 2022-07-28 00:33:29 +05:30
Harsh Shandilya 82e70e5316 Fix utterances theme [deploy] 2022-07-27 10:18:14 +00:00
Harsh Shandilya 6fc9990b53 Try fixing CSP again [deploy] 2022-07-27 10:08:00 +00:00
Harsh Shandilya 28f5453ea1 Add share buttons to posts [deploy] 2022-07-27 10:00:01 +00:00
renovate[bot] f7e583c63e
chore(deps): update dependency gohugoio/hugo to v0.101.0 [staging] 2022-07-23 08:44:30 +00:00
Harsh Shandilya e56300ac36
fix(deps): try out a more manual way of updating GHA deps 2022-07-23 14:14:04 +05:30
Harsh Shandilya 3c4367f799
fix(deps): bump PaperMod [deploy] 2022-07-21 18:59:44 +05:30
renovate[bot] dfc91dfdac
chore(deps): update module go to 1.18 [staging] 2022-07-21 05:51:50 +00:00
Harsh Shandilya d2277e05ef
workers-site: also set `frame-ancesors` in CSP [deploy][staging] 2022-07-20 01:51:45 +05:30
renovate[bot] 902ad4fd5d
chore(deps): update dependency @cloudflare/workers-types to v3.14.1 [staging] 2022-07-10 10:39:25 +00:00
Harsh Shandilya 5e1be3e308
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 9d4a906e55.
2022-07-09 19:13:58 +05:30
Harsh Shandilya bf3051d400
Enable code highlighting for paparazzi post [deploy] 2022-07-09 19:02:48 +05:30
Harsh Shandilya 9d4a906e55
paparazzi: add note about Kotlin 1.7.0 compat [deploy] 2022-07-09 19:02:48 +05:30
Harsh Shandilya 3769eeee8b
renovate: disallow breakage-inducing updates 2022-07-09 19:02:48 +05:30
Harsh Shandilya 316d6d1cb7
renovate: setup a regex manager for versions in GHA files 2022-07-05 01:12:01 +05:30
renovate[bot] 1469675abe
chore(deps): update actions/checkout action to v3 [staging] 2022-07-04 18:53:23 +00:00
renovate[bot] f9f035700c
chore(deps): update actions/setup-go action to v3 [staging] 2022-07-04 18:38:44 +00:00
renovate[bot] 6d59955c03
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] 41d32af67b
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 2ea263c08b
github: add a build test job for renovate checks 2022-07-05 00:05:43 +05:30
Harsh Shandilya 7315d5dc9b
github: allow manual deploys 2022-07-04 11:59:02 +05:30
Harsh Shandilya 334e5c4be2
renovate: add [staging] suffix to commit messages for auto-deploy 2022-07-04 11:56:55 +05:30
Harsh Shandilya 47e63106e2
renovate: configure branch automerge 2022-07-04 11:53:54 +05:30
renovate[bot] 349b635a0f
chore(deps): add renovate.json 2022-07-04 06:22:14 +00:00
Harsh Shandilya 65a2b13978
uses: update [deploy] 2022-07-04 11:11:32 +05:30
Harsh Shandilya 776406e780
content: fmt [deploy] 2022-06-29 02:32:08 +05:30
Harsh Shandilya 14c43e12cd
uses: RAM died Sadgers [deploy] 2022-06-29 02:30:54 +05:30
Harsh Shandilya 742c44cd5d
fix missing brace [deploy] 2022-06-29 02:21:53 +05:30
Harsh Shandilya d4a7ec0c42
Revert "Revert "content: release KMP post [deploy]""
Fixed lol

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

This reverts commit 5ed3694c92.
2022-06-29 01:40:48 +05:30
Harsh Shandilya b2e739f8cb
content: fix incorrect code snippet 2022-06-29 01:40:16 +05:30
Harsh Shandilya 5ed3694c92
content: release KMP post [deploy] 2022-06-28 13:35:47 +05:30
Harsh Shandilya 9ba300724a
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 d5603dd8a7
forestry: yeet 2022-06-27 17:25:19 +05:30
Harsh Shandilya abea29bb27
content: add Paparazzi w/ KMP post [deploy] 2022-06-27 17:22:29 +05:30
Harsh Shandilya a8989fbe00
content: `s/description/summary/` 2022-06-27 17:21:05 +05:30
Harsh Shandilya 79543e0012
scripts: `s/description/summary/` 2022-06-27 17:21:03 +05:30
Harsh Shandilya e7ae93d8f8
hugo: upgrade PaperMod 2022-06-27 17:19:29 +05:30
Harsh Shandilya 3e2e3cc02c
all: switch to Yarn 2022-05-27 16:35:35 +05:30
Harsh Shandilya c46e6e15d5
Publish convention plugins post [deploy] 2022-04-17 22:34:12 +05:30
Harsh Shandilya 25fe23118d
Tweak some wording [staging] 2022-04-17 20:50:24 +05:30
Harsh Shandilya 6a0ce4f501
Add convention plugins post [staging] 2022-04-17 20:37:04 +05:30
Harsh Shandilya 5ce5340e41
workers-site: record page visits to KV [deploy][staging] 2022-04-09 22:19:11 +05:30
Harsh Shandilya d6c89bbd69
wrangler: add KV namespaces 2022-04-06 16:04:13 +05:30
Harsh Shandilya 2dd59c698b
content: run prettier 2022-04-06 16:03:54 +05:30
Harsh Shandilya b79cdd97c0
workers-site: add updated hashes [deploy][staging] 2022-04-05 12:58:16 +05:30
Harsh Shandilya 129e909ab5
content: undraft gphotos post [deploy][staging] 2022-04-05 12:13:29 +05:30
Harsh Shandilya 3589295fec
content: cleanup gphotos backup post [staging] 2022-04-05 12:12:56 +05:30
Harsh Shandilya 4d32d5bfbf
content: run prettier and fix links [staging] 2022-04-05 01:35:20 +05:30
Harsh Shandilya e4e8d861f4
hugo: update PaperMod [deploy] 2022-04-05 01:33:38 +05:30
Harsh Shandilya 599209dd09
content: add photos backup post [staging] 2022-04-05 01:31:00 +05:30
Harsh Shandilya 56c883d635
config: set utterances theme to proton-dark [deploy] [staging] 2022-04-04 08:30:33 +05:30
Harsh Shandilya 6b9d2f1109
content: remove hopeless draft [staging] 2022-03-08 15:50:45 +05:30
Harsh Shandilya 1e8f9e1826
npm: remove transpile script 2022-03-05 01:57:28 +05:30
Harsh Shandilya 7447b4ef2f
node: use gitignore to limit prettier scope 2022-03-05 01:54:13 +05:30
Harsh Shandilya bd81a48514
content: rewrite about page [deploy] 2022-03-05 01:44:33 +05:30
Harsh Shandilya 7b268840bb
github: notify search engines of sitemap updates [deploy] 2022-02-27 18:29:55 +05:30
Harsh Shandilya cff435003a
workers-site: remove invalid permissions policy entry [staging] 2022-02-27 10:07:46 +05:30
Harsh Shandilya 8fe653bb04
all: switch to Hugo PaperMod [staging] 2022-02-27 10:07:46 +05:30
Harsh Shandilya 4c5f4a06d0
Revert "config: set theme mode to auto [deploy][staging]"
Causes a white flash on page navigations, not worth it.

This reverts commit 8be99a6263.
2022-02-27 02:02:21 +05:30
Harsh Shandilya d628d6432e
layouts: no comments for pages [deploy] 2022-02-01 15:30:53 +05:30
Harsh Shandilya 75e8e68a34
content: remove stray date [deploy] 2022-02-01 15:06:01 +05:30
Harsh Shandilya c4ff7595a0
modules: force upgrade hugo-ink [deploy][staging] 2022-01-24 23:22:32 +05:30
Harsh Shandilya 8be99a6263
config: set theme mode to auto [deploy][staging] 2022-01-23 16:19:09 +05:30
Harsh Shandilya f63c9fedf5
workers-site: redirect /apsg to APS org [deploy] 2022-01-08 01:01:53 +05:30
Harsh Shandilya 0565e41ac3
root: reformat with prettier 2022-01-08 01:01:41 +05:30
Harsh Shandilya 3fa2b317cf
workers-site: reformat with prettier 2022-01-07 20:17:27 +05:30
Harsh Shandilya 1ac24d3f60
content: reformat with prettier 2022-01-07 20:16:47 +05:30
Harsh Shandilya e8e3a15cce
content: get rid of projects page [deploy] 2022-01-06 14:11:48 +05:30
Harsh Shandilya 0eac24e254
uses: rewrite and update [deploy] 2022-01-06 14:11:22 +05:30
Harsh Shandilya f5239a0580
workers-site: update CSP [deploy] [staging] 2022-01-06 11:26:30 +05:30
Harsh Shandilya 5289ab5aed
layouts: overlay hugo-ink layouts for SA and Utterances [deploy] 2022-01-06 11:15:18 +05:30
Harsh Shandilya 6fbac1cc22
[deploy]
(cherry picked from commit 9a1bcd8bc9)
2022-01-06 10:41:03 +05:30
Harsh Shandilya b7dff20c92
all: switch theme to hugo-ink [staging] 2022-01-06 09:57:26 +05:30
Harsh Shandilya 06fe622ac6
content: reorganize tags and categories to remove duplication [deploy] 2022-01-06 09:56:53 +05:30
Harsh Shandilya 7edf636c65
content: bend to the SEO gods [deploy] 2022-01-04 09:59:01 +05:30
Harsh Shandilya a3f14329ba
themes/ezhil: link categories rather than tags 2022-01-04 09:55:39 +05:30
Harsh Shandilya c16f24ab08
nix: add git to build inputs
`go mod download` requires Git
2022-01-04 09:53:44 +05:30
Harsh Shandilya 9a1bcd8bc9
[deploy] 2022-01-02 18:35:15 +05:30
Harsh Shandilya 18741b81f9
workers-site: allow redirecting to other APS repos [staging] 2022-01-02 18:00:30 +05:30
Harsh Shandilya 27574d7f64
workers-site: fix type errors 2022-01-02 17:52:53 +05:30
Harsh Shandilya 45d4d26a30
github: migrate prod to wrangler-action [deploy] 2021-12-22 10:42:00 +05:30
Harsh Shandilya 33a916b32f
github: test wrangler-action deployment [staging] 2021-12-22 10:39:00 +05:30
Harsh Shandilya 2e43c62dbe
github: switch Actions to use moving tags 2021-12-22 10:36:07 +05:30
Harsh Shandilya 16590ab523
all: upgrade to Hugo v0.91.0 [staging] [deploy] 2021-12-22 10:36:07 +05:30
Harsh Shandilya aafd8b6e6a
hugo: convert hugo-social-metadata to a Hugo module [deploy][staging] 2021-12-08 13:18:40 +05:30
Harsh Shandilya d915528e1b
npm: update config and dependencies 2021-11-20 18:13:36 +05:30
Harsh Shandilya a5717cc1f0
Add screenshots [deploy] 2021-11-08 11:41:27 +05:30
Harsh Shandilya 920b3212d2
wrangler: add compatibility_date [staging] 2021-11-08 10:27:37 +05:30
Harsh Shandilya 27bf06cf34
Undraft M3 migration post [deploy] 2021-11-08 10:26:23 +05:30
Harsh Shandilya 5283b7f369
Final shoutouts [staging] 2021-11-08 10:09:14 +05:30
Harsh Shandilya 3aa09750d5
nix: update shell config 2021-11-06 15:33:03 +05:30
Harsh Shandilya 6c422e0617
M3 migration for APS [staging] 2021-11-06 14:49:03 +05:30
Harsh Shandilya 8eaa24d6dd
static: update resume [staging][deploy] 2021-10-20 18:15:51 +05:30
Harsh Shandilya 7e4ef269c9
Publish static linking post [deploy][staging] 2021-10-17 21:58:24 +05:30
Harsh Shandilya ac7050b04f
Finally add the static linking post [staging] 2021-10-15 03:21:55 +05:30
Harsh Shandilya 442f4b5148
Fix outdated Twitter handle 2021-10-15 03:18:38 +05:30
Harsh Shandilya 5ccff1d714
bye felicia [deploy][staging] 2021-08-19 14:43:52 +05:30
Harsh Shandilya eded45a291
content: flesh out Git post some more 2021-08-19 14:43:26 +05:30
Harsh Shandilya 7ba3dc4eee
shell.nix: add imagemagick 2021-08-14 05:42:13 +05:30
Harsh Shandilya 5179ddf767
content: debut Git post [staging] 2021-08-14 05:42:03 +05:30
Harsh Shandilya f507619a13
config: fix Twitter username [staging] [deploy] 2021-07-20 02:42:11 +05:30
Harsh Shandilya bede886699
nix: add nix-shell configuration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-06-16 05:30:32 +05:30
Harsh Shandilya fd7249763e
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 8c074408f1
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 0485c59aef
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 6f309dacb6
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 f3ff524178
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 3eae5d7094
workers: add types
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-19 21:44:14 +05:30
Harsh Shandilya 130d94a8ff
npm: bump dependencies
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-19 21:38:15 +05:30
Harsh Shandilya 59dd45beb8
Learning Zig - Day 4 [deploy][staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-18 22:54:00 +05:30
Harsh Shandilya 1750c6ed5c
Learning Zig, Day 3 [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-16 22:30:03 +05:30
Harsh Shandilya b66cc83366
Bigger heading [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-15 23:16:46 +05:30
Harsh Shandilya 9fcf81892e
Learning Zig, day 2 [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-15 23:14:32 +05:30
Harsh Shandilya f6276ffb0b
Add clarification about syntax highlighting [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-14 20:53:47 +05:30
Harsh Shandilya 8a89e482fc
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 18cf4bbf32
Add first steps with zig [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-05-14 16:45:44 +05:30
Harsh Shandilya a5d100dbbe
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 bf1ce77611
content: fix links [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-04-08 19:31:36 +05:30
Harsh Shandilya fcfad003ce
remove scrapped drafts [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-04-01 11:57:04 +05:30
Harsh Shandilya 0e21a6bd33
Just obliterate the flutter post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-17 17:13:06 +05:30
Harsh Shandilya b72d3ff41e
Fix typo in moshi post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-17 09:35:06 +05:30
Harsh Shandilya 4494624ea3
Docs are really important [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-15 12:58:55 +05:30
Harsh Shandilya ffdaaba260
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 7d9868530b
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 c7aca8dfca
Generics are footguns in Dart [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-08 16:38:07 +05:30
Harsh Shandilya 2192d438e7
Extension function visibility in Dart [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-08 12:01:53 +05:30
Harsh Shandilya 5510da43b7
Type unsafety in Flutter [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-08 11:07:45 +05:30
Harsh Shandilya 51260617bd
Slightly expand on widgets [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 23:02:31 +05:30
Harsh Shandilya 469af88589
Tweaks [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 22:56:09 +05:30
Harsh Shandilya 57a53e5e91
More words on Flutter [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-07 22:55:21 +05:30
Harsh Shandilya af6859b234
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 574105cf16
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 7bea1240ec
First wisps of Flutter post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-03-01 16:41:18 +05:30
Harsh Shandilya 738f0e593d
partials/sponsors: set rel=noopener [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-28 14:22:04 +05:30
Harsh Shandilya 8b40a8d8f7
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 ee3ceef325
More content on init scripts [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-15 16:11:15 +05:30
Harsh Shandilya ef3603f720
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 24c12f87b9
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 23b21bc629
Add init scripts post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 14:05:17 +05:30
Harsh Shandilya 4fea884ec3
all: revert social tags experiments [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-02-09 13:03:24 +05:30
Harsh Shandilya 9cf50efba8
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 da7dba0fc5
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 4e9a6c3c41
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 36bef408fe
github: add step name to checkout
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 13:48:45 +05:30
Harsh Shandilya cd64c7e1fd
content/uses: update [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-23 13:45:57 +05:30
Harsh Shandilya 80368bfdac
Revert "github: allow manually running deployments"
This reverts commit 3e1e112306.
2021-01-23 13:44:51 +05:30
Harsh Shandilya 3e1e112306
github: allow manually running deployments 2021-01-20 21:48:49 +05:30
Harsh Shandilya 22ac30f400
themes/ezhil: tweak dark theme CSS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-13 22:32:32 +05:30
Harsh Shandilya fbe23ee7bc
workers-site: fix 404 fallback [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-11 02:16:01 +05:30
Harsh Shandilya 087665f172
posts: fix precompiled script confusion [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-11 01:25:12 +05:30
Harsh Shandilya 12f5bd236a
posts: fix links [staging] 2021-01-09 03:24:21 +05:30
Harsh Shandilya 734ded1b7e
posts: update buildSrc post with next heading 2021-01-09 03:19:02 +05:30
Harsh Shandilya ed3d0d24e8
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 b2914f8761
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 9dadf1dfa4
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 708376b226
package.json: add repository field
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-06 17:49:16 +05:30
Harsh Shandilya 5dc2bfa083
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 477a2f9637
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 2111d258fa
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 e053a83ef7
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 91764cf10d
content: publish GHA tips post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-04 10:59:12 +05:30
Harsh Shandilya 30407639bd
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 65bca188c6
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 26af488efb
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 d66ef509c1
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 15fc9bbc73
scripts/pngtowebp: fail-fast on errors
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 11:04:59 +05:30
Harsh Shandilya 458644eaa1
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 309d405656
layouts/shortcodes: add horizontal_line
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 06:46:57 +05:30
Harsh Shandilya fc881bda2e
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 89c20313c9
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 b156b49c16
layouts: add a sub shortcode
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2021-01-03 00:29:45 +05:30
Nishith Khanna 491e328f90
content/uses: fix links to cli tooling (#41) [deploy] 2021-01-02 12:46:26 +05:30
Harsh Shandilya 6c4458539f
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 6567b874b6
Revert "themes/ezhil: improve link styling for accessibility [deploy]"
This reverts commit 3aba297088.
2021-01-01 14:48:36 +05:30
Harsh Shandilya 3aba297088
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 cac95014b9
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 427d327df0
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 1000e8dd24
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 ae66ecab87
simple_analytics: drop events [deploy] [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-28 23:30:15 +05:30
Harsh Shandilya d0e5e9ed64
github: rename default branch to main
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-28 22:58:46 +05:30
Harsh Shandilya cb39d172bb
assets: remove unused syntax highlighting definition
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-28 02:35:40 +05:30
Harsh Shandilya 4618712041
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 cb0cb4ea7b
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 c70b6649e9
simple_analytics: desperate times
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-27 15:20:17 +05:30
Harsh Shandilya 2402fd41f4
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 ed0a2cd9d5
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 c6c56b0b71
simple_analytics: ignore DNT [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-25 10:19:59 +05:30
Harsh Shandilya f7efc9ad0d
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 a1ec11d0d9
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 cb40b6b2fb
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 b643da68e8
themes/codex: remove 2020-12-23 15:49:31 +05:30
Harsh Shandilya 0889074e64
Slight wording tweaks [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-23 11:56:04 +05:30
Harsh Shandilya c471d8b48b
Publish inline classes post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:54:48 +05:30
Harsh Shandilya 6a7edd0d1c
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 72aa6fb8d2
fixup! layouts: add simpleanalytics [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:38:57 +05:30
Harsh Shandilya 644539cfdd
fixup! layouts: add simpleanalytics [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 20:32:16 +05:30
Harsh Shandilya 9dab387404
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 150d5a1084
package.json: add webpack-cli
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 17:21:37 +05:30
Harsh Shandilya 679067fbb3
layouts: add simpleanalytics [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-22 16:54:26 +05:30
Harsh Shandilya 00d52d7200
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 e44726e4ef
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 847c5c36ee
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 0de2ea12d9
layouts: use direct permalink
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 22:05:28 +05:30
Harsh Shandilya 0e3ca95568
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 2ffeda4002
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 e180bcfd91
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 b55c352152
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 9b5e2225d4
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 ab80ddbd6e
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 5fd672fa0a
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 32d8c0e366
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 a6e81c13c7
content: publish moshi post [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-21 12:23:39 +05:30
Harsh Shandilya 19fef28dc8
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 8fc9ceede6
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 0088729649
workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:20:46 +05:30
Harsh Shandilya 20e9368b29
workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:12:35 +05:30
Harsh Shandilya 32149c739b
workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:04:57 +05:30
Harsh Shandilya b645de9af0
workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 12:00:06 +05:30
Harsh Shandilya 826537208c
workers-site: update CSP [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:54:04 +05:30
Harsh Shandilya a7c4c334c6
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 4e47d8e39f
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 648aa3c8f4
workers-site: formatting fixup
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:42:11 +05:30
Harsh Shandilya 6c322d5379
workers-site: update CSP [staging] [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-19 11:39:49 +05:30
Harsh Shandilya f2fe391b92 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 41c1f4c551
workers-site: sync from redirekt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-18 00:31:06 +05:30
Harsh Shandilya 5f4489553d
npm: update packages
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-18 00:30:47 +05:30
Harsh Shandilya 4566d786a8
Revert "all: enable automatic dark theme switching [staging]"
This reverts commit 60c08bbf15.
2020-12-18 00:26:33 +05:30
Harsh Shandilya 60c08bbf15
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 e855345351
taxonomies: enable categories
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:24:19 +05:30
Harsh Shandilya 4a44f3d4ba
github: fix staging deployment command [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:21:31 +05:30
Harsh Shandilya 07556a3670
fix tags and RSS [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:13:16 +05:30
Harsh Shandilya 93bfcb8470
all: switch to ezhil
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-17 15:10:29 +05:30
Harsh Shandilya 2a3cd52758
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 8ad66913f2
trigger prod build [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-16 22:41:07 +05:30
Harsh Shandilya ecabc9b48a
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 01c6314f5d
More tweaks to Moshi post [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-16 22:26:32 +05:30
Harsh Shandilya 942150b2b1 More work on Moshi post [staging] 2020-12-14 06:53:33 -08:00
Harsh Shandilya 2c5901e4b6 Add moshi parsing post [staging] 2020-12-13 11:13:18 -08:00
Harsh Shandilya 54967069f1
More words
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-12 14:54:11 +05:30
Harsh Shandilya c50afe01f8
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 72b00b085a 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 4435c44794 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 a2ced5d2b1 Update from Forestry.io
Harsh Shandilya created static/uploads/actions.png
2020-12-11 18:23:13 +00:00
Harsh Shandilya de91ca8e10
Revert "layouts: enable CWA [deploy]"
This reverts commit 3bc69ea8e4.
2020-12-11 15:29:31 +05:30
Harsh Shandilya 3bc69ea8e4
layouts: enable CWA [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-12-10 21:37:32 +05:30
Harsh Shandilya 6891c69cd6 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 6049c39def
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 01a1aa4e04
openring: remove [staging]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-22 16:15:16 +05:30
Harsh Shandilya c35b985cdc
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 0a615a2c17
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 a968742920
hugo: mark theme as a module
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 15:55:16 +05:30
Harsh Shandilya 3be1942cfd
theme: update branch
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 15:50:29 +05:30
Harsh Shandilya 5c3436295c
content: tweak some wording [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 14:42:35 +05:30
Harsh Shandilya 2fa3addf5e
themes: remove hugo-cloak-email [deploy]
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-21 14:33:17 +05:30
Harsh Shandilya 0ebcd2f3c4
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 1dd65b0cb5
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 de57197a10
[deploy] layouts/baseof: ignore DNT virtue signal 2020-11-19 19:54:42 +05:30
Harsh Shandilya 17b0a00f38
wrangler: extract BASE_URL into config
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-19 14:15:49 +05:30
Harsh Shandilya 8157bf5e5e
wrangler: leverage env and secrets
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-19 14:15:17 +05:30
Harsh Shandilya 76846d81b1
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 e329c1e209
Remove stale files
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:38:42 +05:30
Harsh Shandilya e4a1f61cf6
config: update for new realities
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:37:42 +05:30
Harsh Shandilya 4477e07b7c
workers-site: bring back redirekt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-18 13:31:24 +05:30
Harsh Shandilya bd20407ddd
static: desperate hackery
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-17 08:57:33 +05:30
Harsh Shandilya d050e7eb1a
Cleanup for Netlify departure
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-17 08:29:52 +05:30
Harsh Shandilya e3e9b0b7f1
Switch deployment to Cloudflare Workers
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-17 08:16:43 +05:30
Harsh Shandilya c80e3e37e0
layouts/asciinema: test analytics event
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-10 09:28:08 +05:30
Harsh Shandilya b155bc6d11
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 ec78746869
Fix formatting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-07 18:52:27 +05:30
Harsh Shandilya 7c5eb42bc1
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 fae812e382
Tweak wording further 2020-11-06 18:00:17 +05:30
Harsh Shandilya 46e296771a
Fix code sample 2020-11-06 17:53:37 +05:30
Harsh Shandilya 03e3e6c827
Update language in GitHub Packages post 2020-11-06 17:52:36 +05:30
Harsh Shandilya a1c5cddfb1
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 34c672740e
Update GitHub packages post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-06 17:48:58 +05:30
Harsh Shandilya 21b6d658f6
themes/codex: better highlight blockquotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-11-06 17:39:23 +05:30
Harsh Shandilya b8d6f90812 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 c649e43887 Update from Forestry.io - Updated Forestry configuration 2020-11-03 06:23:34 +00:00
Harsh Shandilya 662db395b2
README: update Netlify badge URL 2020-11-03 10:50:53 +05:30
Harsh Shandilya 6c84d6e28a 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 bbf2798b45 Update from Forestry.io
Harsh Shandilya created static/uploads/kotlin_800x320.png
2020-11-03 05:20:20 +00:00
github-actions[bot] 18ecaa693e
layouts: update openring data (#36)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-11-02 09:51:58 +05:30
github-actions[bot] a786e020ed
layouts: update openring data (#35)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-11-01 10:17:03 +05:30
Harsh Shandilya c2a893a6a6 Update from Forestry.io
Harsh Shandilya updated content/uses.md
2020-10-31 19:13:12 +00:00
github-actions[bot] 7614fd894a
layouts: update openring data (#34)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-10-31 09:08:24 +05:30
github-actions[bot] eab8383571
layouts: update openring data (#33)
Co-authored-by: GitHub Actions <noreply@github.com>
2020-10-29 09:08:17 +05:30
Harsh Shandilya 52fb7025f3
github: patch openring update workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-28 11:38:23 +05:30
Harsh Shandilya e0c06e3d3a
scripts/openring: update sources
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-28 11:15:31 +05:30
github-actions[bot] 1591f5af92
Periodic openring sync (#32)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-28 05:35:55 +05:30
github-actions[bot] 9dd36decc2
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] 52d5aeab44
layouts: update openring data (#30)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-25 11:36:17 +05:30
Harsh Shandilya 042476a06d
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 42f21d7e5f
netlify: update Hugo
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:59:21 +05:30
Harsh Shandilya a0903cfa7d
netlify: disable Algolia export plugin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:46:22 +05:30
Harsh Shandilya 12289add5b
Publish October release notes for APS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:34:12 +05:30
Harsh Shandilya 56b16f0daf
Remove never-published post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:31:48 +05:30
Harsh Shandilya 48a6133830
Add APS October release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-22 04:25:17 +05:30
Harsh Shandilya 360749cb30
layouts: sync after merge
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-19 00:42:28 +05:30
Harsh Shandilya fa6ae74d43
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 da2d16a4f9
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 5b102b77ba fix: toc overflow caused by improper css solution 2020-10-18 11:49:07 -04:00
Jake Wiesler e1562219cc
Merge pull request #135 from jakewies/all-contributors/add-skvale 2020-10-18 11:24:35 -04:00
allcontributors[bot] 199194671f
docs: update .all-contributorsrc [skip ci] 2020-10-18 15:24:19 +00:00
allcontributors[bot] 9e9f089f4e
docs: update README.md [skip ci] 2020-10-18 15:24:18 +00:00
Jake Wiesler 0c67073549
Merge pull request #118 from skvale/patch-1
Update post-pagination.html
2020-10-18 11:23:48 -04:00
Jake Wiesler ac5c699d85
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 f76ad38a65
Merge pull request #134 from jakewies/all-contributors/add-sdil 2020-10-18 11:18:00 -04:00
allcontributors[bot] 1a473f3bb6
docs: update .all-contributorsrc [skip ci] 2020-10-18 15:17:48 +00:00
allcontributors[bot] 7b1a76a9a5
docs: update README.md [skip ci] 2020-10-18 15:17:47 +00:00
Jake Wiesler 8d865ce215
Merge pull request #122 from sdil/master
Fix browse-by-tag link
2020-10-18 11:17:29 -04:00
Jake Wiesler fccb057ef9
Merge pull request #133 from jakewies/all-contributors/add-tommorris 2020-10-18 11:00:53 -04:00
allcontributors[bot] 9c54bf8ac1
docs: update .all-contributorsrc [skip ci] 2020-10-18 15:00:46 +00:00
allcontributors[bot] d983872500
docs: update README.md [skip ci] 2020-10-18 15:00:45 +00:00
Jake Wiesler e6dcf53366
Merge pull request #129 from tommorris/patch-1 2020-10-18 11:00:26 -04:00
Jake Wiesler 7c6985b745
Merge pull request #132 from jakewies/all-contributors/add-wilsonehusin 2020-10-18 10:59:55 -04:00
allcontributors[bot] 9cf61c3bf9
docs: update .all-contributorsrc [skip ci] 2020-10-18 14:58:04 +00:00
allcontributors[bot] 90727d3337
docs: update README.md [skip ci] 2020-10-18 14:58:03 +00:00
Jake Wiesler 1401c2ce4b
Merge pull request #131 from wilsonehusin/favicon-hooks
Extract favicon into a partial
2020-10-18 10:57:47 -04:00
Wilson E. Husin c2756a5c04 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] f4bd01399b
layouts: update openring data (#29)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-10-07 05:45:11 +05:30
Harsh Shandilya 24c3e6c235
forestry: update
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-02 04:50:12 +05:30
Harsh Shandilya 70afae7d2c
Caddyfile: remove
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-02 04:50:12 +05:30
Harsh Shandilya 022547a0e9
github: remove PR audit workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-10-02 04:50:12 +05:30
Tom Morris 040fd3e920
Add rel-me to social links 2020-10-01 19:10:49 +01:00
github-actions[bot] 884227d86a
Periodic openring sync (#28) 2020-09-30 11:40:46 +05:30
github-actions[bot] 166c3bab4a
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] c4fbca31d7
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] eb875d2312
layouts: update openring data (#25)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-26 11:25:25 +05:30
Harsh Shandilya d4d4a91dff
layouts: add analytics
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-25 16:51:59 +05:30
github-actions[bot] 7157fe4800
layouts: update openring data (#24)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-25 10:10:44 +05:30
Harsh Shandilya 379014e6e5
layouts: fix alternate outputs formatting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 22:26:19 +05:30
Harsh Shandilya dd63e8ece2
Weirdo 2020-09-24 15:48:24 +05:30
Harsh Shandilya f8446d1d2b
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 1b9b989336
Tweak headings
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 15:34:04 +05:30
Harsh Shandilya 8d41e4e090
Reword sponsors blurb
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 15:31:54 +05:30
Harsh Shandilya 75b212c11f
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] f1fd994976
layouts: update openring data (#23)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-24 10:50:23 +05:30
Harsh Shandilya 5b192de758
Tweak wording
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 00:11:10 +05:30
Harsh Shandilya f17c6c106d
layouts: reword Sponsors blurb
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-24 00:01:45 +05:30
Harsh Shandilya 2bce3aaf65
ci: remove unused script
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-23 23:59:53 +05:30
Harsh Shandilya bcaae1f92f
Add September release notes for APS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-23 23:59:36 +05:30
Harsh Shandilya 140eedf7b9
Fix july post headings
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-21 21:27:55 +05:30
Harsh Shandilya e4cfe7f719
static: fix redirect URL
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-21 13:44:04 +05:30
github-actions[bot] b29e554d92
Periodic openring sync (#22)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-19 05:37:30 +05:30
github-actions[bot] ce77db0b27
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] 384748e5bc
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] b8805ebda3
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] 791cad8763
layouts: update openring data (#18)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-12 11:25:26 +05:30
Harsh Shandilya fa4f62e948
layouts: increase top margin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-09 11:55:53 +05:30
Harsh Shandilya 0073a775a9
layouts: add GitHub sponsors card
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-09 11:52:21 +05:30
github-actions[bot] d4788b19ea
layouts: update openring data (#17)
Co-authored-by: msfjarvis <msfjarvis@users.noreply.github.com>
2020-09-09 06:38:24 +05:30
Harsh Shandilya 07dbe8d872
static: add another redirect case
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-08 14:16:05 +05:30
github-actions[bot] 33eb2e1956
Periodic openring sync (#16) 2020-09-05 05:45:57 +05:30
Harsh Shandilya 9d11464ed1
Revert "[TEMP] github: run openring workflow on pushes to openring-test branch"
This reverts commit d29189db4f.
2020-09-02 17:39:12 +05:30
Harsh Shandilya dec9f2dc29
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] 5df67a346b
Periodic openring sync (#15) 2020-09-02 17:38:33 +05:30
Harsh Shandilya 8d3cc63ea8
Don't repeat yourself
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-02 17:17:44 +05:30
Harsh Shandilya d29189db4f
[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 f0eb9dc830
Publish SDKMAN post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-09-02 17:01:30 +05:30
Harsh Shandilya 5dbb84eb2b
Add SDKMAN post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-31 22:08:22 +05:30
Harsh Shandilya 583423f177
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 ef0370a78d
netlify: add algolia export plugin
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-30 23:03:30 +05:30
Harsh Shandilya 6dd47d6961
netlify: include basic configuration
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-30 23:00:26 +05:30
Harsh Shandilya 4bbdc9cffe
Revert "layouts: remove now needless standalone type"
Unfortunately the upstream variant still unconditionally includes
pagination which we do not want.

This reverts commit 4d45c8653c.
2020-08-30 22:36:44 +05:30
Harsh Shandilya 39366b70e3
Remove commento
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 15:10:06 +05:30
Harsh Shandilya 0dc2c04194
Fixup
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 15:07:25 +05:30
Harsh Shandilya 25f04606dc
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 308714eafa
Update README
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:54:52 +05:30
Harsh Shandilya a3b852fd00
Remove deployment workflow and update README
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:53:13 +05:30
Harsh Shandilya d2400c5f02
Fix pastebin URLs in fzf post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-25 14:50:00 +05:30
Harsh Shandilya 0e198a59bf
static: add aps redirect
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:44:51 +05:30
Harsh Shandilya 138a6f177e
static: add repo redirect
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:39:10 +05:30
Harsh Shandilya c1a00162bf
static: remove commit redirect
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:38:36 +05:30
Harsh Shandilya 81ca241a88
static: add redirects for Netlify
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-24 12:37:05 +05:30
Fadhil Yaacob 01d6d78f9d Fix browse-by-tag link 2020-08-22 10:33:35 +08:00
Harsh Shandilya 6b103551eb
Publish APS August release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-19 10:46:02 +05:30
Harsh Shandilya fcbb5451f3
Reword release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-19 10:43:16 +05:30
Harsh Shandilya 262a8e5766
Update release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-19 04:00:23 +05:30
Harsh Shandilya b114649973
Caddyfile: drop proxy variant
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 23:12:52 +05:30
Harsh Shandilya 526d0aa689
WIP APS August release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 22:30:11 +05:30
Harsh Shandilya db11ccc60c
fix formatting on july release notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 22:07:20 +05:30
Harsh Shandilya 00914879f0
Publish fd post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-18 17:59:09 +05:30
Harsh Shandilya a3f9327aaf
Add fd post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-17 21:45:15 +05:30
Harsh Shandilya a3fe711494
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 2173d12548
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 2a41549309
layouts: Add markdown render hook to open links in new tab 2020-08-15 18:34:40 +05:30
GitHub Actions 7b007754ff layouts: update openring 2020-08-15 00:02:12 +00:00
Harsh Shandilya 6cfd3617d8
github: fix job name
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 15:57:28 +05:30
Harsh Shandilya 608e849b87
openring: tweak UI and regen
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 15:56:24 +05:30
GitHub Actions 73e9ea36af layouts: update openring 2020-08-14 00:02:30 +00:00
Harsh Shandilya d0d6de62c9
openring: reduce width
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 02:53:27 +05:30
Harsh Shandilya ff78ecf9d2
github: fixup openring update workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-14 02:53:17 +05:30
Harsh Shandilya 3e7a01d8f3
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 fabb18fd7e
layouts: rollback openring from prod deployment
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:48:03 +05:30
Harsh Shandilya b59dee86fd
assets: kill post footer top padding
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:29:03 +05:30
Harsh Shandilya 7764c57a41
openring: touch up layout
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:23:14 +05:30
Harsh Shandilya 2c2a6eb30a
layouts: sync openring
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:16:17 +05:30
Harsh Shandilya e9d07c1194
scripts/openring: include Pascal's blog
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-13 01:15:45 +05:30
Harsh Shandilya 4d45c8653c
layouts: remove now needless standalone type
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:11:52 +05:30
Harsh Shandilya c373c1bd81
layouts: merge post date fix
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:11:32 +05:30
Harsh Shandilya 098ceae880
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 12cf34a458
layouts: include openring in single template
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:06:58 +05:30
Harsh Shandilya 7efa6f46c2
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 aec8f04f01
layouts: insert first openring data
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:06:15 +05:30
Harsh Shandilya e77bea82cf
openring: set up an initial framework
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-12 22:05:54 +05:30
Harsh Shandilya cc6c27a053
Fix typo and publish
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-11 20:24:54 +05:30
Harsh Shandilya 97fe2a39a5
Some cleanups
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-11 14:46:25 +05:30
Harsh Shandilya b0f066dfd1
Finish up fzf post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-11 03:56:40 +05:30
Sam Kvale d6811ad5fa
Update post-pagination.html 2020-08-10 09:35:52 -05:00
Harsh Shandilya 40464c4591
Get going on fzf
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-10 03:55:44 +05:30
Jake Wiesler 4128b8474f
Merge pull request #117 from jakewies/all-contributors/add-SanchithHegde 2020-08-09 16:54:15 -04:00
allcontributors[bot] b76d9fce62
docs: update .all-contributorsrc [skip ci] 2020-08-09 20:54:06 +00:00
allcontributors[bot] 8d4c141613
docs: update README.md [skip ci] 2020-08-09 20:54:05 +00:00
Jake Wiesler 017280c912
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 119a140caa
Merge pull request #116 from jakewies/all-contributors/add-jdl031 2020-08-09 16:52:43 -04:00
allcontributors[bot] dab853b65a
docs: update .all-contributorsrc [skip ci] 2020-08-09 20:52:36 +00:00
allcontributors[bot] f66d4d00b7
docs: update README.md [skip ci] 2020-08-09 20:52:35 +00:00
Jake Wiesler ba5bb2bcf3
Merge pull request #111 from jdl031/patch-1
Allow for omitting date on post
2020-08-09 16:52:17 -04:00
Sanchith Hegde 5644729dd6
docs: Document showPageTitleInTOC in README.md and config.toml 2020-08-08 17:02:37 +05:30
Harsh Shandilya 4c68620b1e
Expand tags
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-05 01:36:30 +05:30
Harsh Shandilya de86ba9f21
Reword some things
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:44:26 +05:30
Harsh Shandilya 4d49d0e932
Undraft post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:36:16 +05:30
Harsh Shandilya 68c91d181e
Fix social image url
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 14:27:55 +05:30
Harsh Shandilya 1f95dd27ff
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 46d335a751
Caddyfile: update CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 13:07:50 +05:30
Harsh Shandilya fbdaf8eb5c
layouts/shortcodes: add asciinema embed
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-04 12:41:25 +05:30
Harsh Shandilya 813b6ed4a0
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 ab0f080a93
functions: remove
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 03:13:03 +05:30
Harsh Shandilya 538e2d2e07
functions: fixup urls
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 03:09:36 +05:30
Harsh Shandilya 1cf62e364e
github: remove staging deploy
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 02:54:14 +05:30
Harsh Shandilya 5495784921
functions: init
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-08-02 02:53:45 +05:30
Harsh Shandilya 2817200ab2
Init terminal deep dive post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-30 16:41:30 +05:30
Harsh Shandilya 813a644659
Undraft APS v1.10.2 relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-30 14:51:35 +05:30
Harsh Shandilya 06af71262e
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 af8b36055b
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 228d950e3d
Merge pull request #109 from jakewies/all-contributors/add-CER10TY 2020-07-29 09:39:59 -04:00
allcontributors[bot] 2f643d447c
docs: update .all-contributorsrc [skip ci] 2020-07-29 13:39:46 +00:00
allcontributors[bot] 88bede5715
docs: update README.md [skip ci] 2020-07-29 13:39:45 +00:00
Jake Wiesler 37523c1b5f
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 2f30698261 change hardcoded colors to variable 2020-07-29 15:06:22 +02:00
Jake Wiesler 0554b6b629
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 3ad9209c01
_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 d0642bdebe
Merge pull request #105 from jakewies/all-contributors/add-SanchithHegde 2020-07-28 13:54:03 -04:00
allcontributors[bot] 1948e65b8f
docs: update .all-contributorsrc [skip ci] 2020-07-28 17:53:54 +00:00
allcontributors[bot] 35219cf66f
docs: update README.md [skip ci] 2020-07-28 17:53:53 +00:00
Jake Wiesler 7d67bf84cf
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 6dab609cb9
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 fa7ae3103a
docs: Use iconOrder when stating desired icon order 2020-07-24 23:47:20 +05:30
Harsh Shandilya e1a6a68fb0
Publish 'Why upgrade Android?' to DEV
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-24 16:37:28 +05:30
Harsh Shandilya 764761ec62
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 fd3d4ab0ed
I can never get this right
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 13:34:05 +05:30
Harsh Shandilya 50986121bb
Publish 'Why upgrade Android?'
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 13:18:18 +05:30
Harsh Shandilya e8ae17947e
static: update social image
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 13:18:08 +05:30
Harsh Shandilya 7a1f1a21b8
Fix release notes post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-23 10:13:42 +05:30
Harsh Shandilya 546c335355
Grammar nits
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 16:33:27 +05:30
Harsh Shandilya 15329f12e9
Publish APS July notes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 15:14:09 +05:30
Harsh Shandilya 1c57a11029
use cloakemail shortcode
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:32:45 +05:30
Harsh Shandilya 258edf7568
Bump date for APS post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:19:50 +05:30
Harsh Shandilya ef2f16a696
Make url format consistent
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:19:30 +05:30
Harsh Shandilya e819d371d2
Add new post: Why upgrade Android?
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 09:19:08 +05:30
Harsh Shandilya 9421ecf637
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 e9e28be967
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 3d40abca24
Merge pull request #99 from jakewies/all-contributors/add-dgnicholson 2020-07-21 16:29:20 -04:00
allcontributors[bot] bd8f454739
docs: update .all-contributorsrc [skip ci] 2020-07-21 20:29:00 +00:00
allcontributors[bot] 6badb4dac4
docs: update README.md [skip ci] 2020-07-21 20:28:59 +00:00
Harsh Shandilya 793cec506d
Reword a few things in relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 01:58:45 +05:30
Jake Wiesler 8f32dfad6f
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 ead1569ee2
Add sponsorship blurb to relnotes post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 01:41:33 +05:30
Harsh Shandilya 5384bf8daf
layouts/taxonomy: fix hardcoded /blog link
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-22 01:30:07 +05:30
Harsh Shandilya 68e17bc3b0
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 b9113a909b Update post.scss with _gen assets 2020-07-21 08:57:53 -07:00
Jake Wiesler 9b5393b5e8
Merge pull request #96 from jakewies/all-contributors/add-ewenme 2020-07-21 11:36:36 -04:00
allcontributors[bot] 23ffd09d87
docs: update .all-contributorsrc [skip ci] 2020-07-21 15:36:27 +00:00
allcontributors[bot] 88b479b54d
docs: update README.md [skip ci] 2020-07-21 15:36:26 +00:00
Jake Wiesler 0951ef3058
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 1ae65a543a
Update relnotes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-21 02:21:43 +05:30
Jake Wiesler bc6a040127
Merge pull request #93 from jakewies/all-contributors/add-msfjarvis 2020-07-20 16:22:17 -04:00
allcontributors[bot] 4b7ce643fe
docs: update .all-contributorsrc [skip ci] 2020-07-20 20:20:42 +00:00
allcontributors[bot] 75015ab1e1
docs: update README.md [skip ci] 2020-07-20 20:20:40 +00:00
Jake Wiesler 50865bb4fc
Merge pull request #90 from msfjarvis/fixup-aria-controls
nav: fix aria attributes
2020-07-20 16:20:24 -04:00
Harsh Shandilya e73c3ae9a7
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 94920ddc6f
layouts: remove image render hook
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-20 19:11:01 +05:30
ewen aae2a1a821
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 9e0056e072
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 f82d75e23b
themes/codex: try fixing aria attributes
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-18 21:45:13 +05:30
Harsh Shandilya c88117ad68
content/uses: fix link to diskus
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-18 21:31:00 +05:30
Harsh Shandilya a6fdc87881
Caddyfile: update CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 19:24:50 +05:30
Harsh Shandilya 64675bbb76
Undraft BT post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 18:57:48 +05:30
Harsh Shandilya d6c4601d21
content: remove breaking tag
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 18:56:02 +05:30
Harsh Shandilya b806eeec1b
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 dcb0958351
Add social image
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 18:23:55 +05:30
Harsh Shandilya 00b62183bc
Revise wording
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 15:45:33 +05:30
Harsh Shandilya 4e23141585
Flesh out post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 15:37:21 +05:30
Jake Wiesler 59b73c8179
Merge pull request #88 from jakewies/all-contributors/add-ProfessorLogout 2020-07-16 22:14:12 -04:00
allcontributors[bot] c83314ed4e
docs: update .all-contributorsrc [skip ci] 2020-07-17 02:13:59 +00:00
allcontributors[bot] 025a89d81e
docs: update README.md [skip ci] 2020-07-17 02:13:58 +00:00
Jake Wiesler 5bf93f40ba
Merge pull request #86 from ProfessorLogout/master
Twitter Meta Tags
2020-07-16 22:13:38 -04:00
Harsh Shandilya 4d66e670d6
Add initial draft
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:49:07 +05:30
Harsh Shandilya 42a84ca440
content/posts: fix build
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:37:11 +05:30
Harsh Shandilya f6537f9a08
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 dc3a5ad586
content/posts: sort frontmatter keys
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-17 01:18:46 +05:30
Harsh Shandilya 408c8a6425
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 d8553d4082 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 c9728336c1
Merge pull request #84 from jakewies/all-contributors/add-msfjarvis 2020-07-15 08:44:31 -04:00
allcontributors[bot] 0de8bba36f
docs: update .all-contributorsrc [skip ci] 2020-07-15 12:44:00 +00:00
allcontributors[bot] fc5a65e846
docs: update README.md [skip ci] 2020-07-15 12:43:59 +00:00
Jake Wiesler 16ce25a53a
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 3032be0b2e
layouts: set MIME type in my overridden version
This reverts commit 06c6976394.
2020-07-15 15:59:25 +05:30
Harsh Shandilya c5ee40fa49
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 6f329bc840
Revert "layouts: reset to theme versions"
This reverts commit b4d2bf441a.
2020-07-15 15:02:58 +05:30
Harsh Shandilya 8192bca11f
Caddyfile: update CSP
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 15:01:05 +05:30
Harsh Shandilya 06c6976394
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 62a9ff339a
github/forestry: bump Hugo version
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 14:54:13 +05:30
Harsh Shandilya f8bb205e11
Revert "github: update for codex branch"
This reverts commit bad683cabf.
2020-07-15 14:51:04 +05:30
Harsh Shandilya 19a6bc88ad
Tweak keywords
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-15 14:11:29 +05:30
Harsh Shandilya c63e49b430
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 5204072bd5
Revert "Don't use pygments"
This reverts commit bf1e348ca3.
2020-07-14 21:35:31 +05:30
Harsh Shandilya 1fec5d1a42
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 be71ca85ee
Merge pull request #80 from kentnek/kent-fix-width
Make wide code blocks/tables responsive
2020-07-14 11:54:31 -04:00
kentnek af57fb3eb8 make wide code blocks/tables responsive 2020-07-14 22:47:38 +08:00
Jake Wiesler e78e45840e
feat: include build:example script (#77) 2020-07-14 22:15:14 +08:00
Jake Wiesler a2bcfde240
Merge pull request #76 from jakewies/svg-filepath 2020-07-14 10:07:02 -04:00
Harsh Shandilya bf1e348ca3
Don't use pygments
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 18:59:17 +05:30
Harsh Shandilya b4d2bf441a
layouts: reset to theme versions
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 18:56:54 +05:30
Harsh Shandilya 2d48615faa
Revert "Disable commento"
Doesn't fix the problem

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

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 16:06:30 +05:30
Harsh Shandilya bad683cabf
github: update for codex branch
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-14 11:17:38 +05:30
Jake Wiesler 54f299283a docs: update README 2020-07-13 22:23:33 -04:00
Jake Wiesler f9bc5c456d style: pagination icon filepath 2020-07-13 22:23:06 -04:00
Jake Wiesler 59ac3a9bce refactor: move svg icons to static/svg/ 2020-07-13 22:22:42 -04:00
Harsh Shandilya 3c82060dfd
Fix typo in Rust post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 22:56:32 +05:30
Harsh Shandilya 02238be02a
[skip prod] more layout tweaks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:10:59 +05:30
Harsh Shandilya 15f7a4edb9
[skip prod] fix comments layout
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:08:55 +05:30
Harsh Shandilya 04cae93eec
[skip prod] remove commento checks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:06:19 +05:30
Harsh Shandilya 1d8e596437
[skip prod] layouts: add back commento
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 03:02:58 +05:30
Harsh Shandilya 1a329b36a0
[skip prod] lowercase description
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-13 02:33:43 +05:30
Harsh Shandilya 966744caa7
[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 54b391b4b3
[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 d00026b179
[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 a90c15fb4f
[skip prod] bring back standalone type
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 19:16:59 +05:30
Harsh Shandilya b544801d42
[skip prod] Switch to Codex
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 03:24:45 +05:30
Harsh Shandilya 5aec6f87ea
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 2503ddc808
Add social image to Rust post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 02:18:23 +05:30
Harsh Shandilya 50cfec5f91
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 2c69a6eed9
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 a57a1ad383
Write about cows
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-12 01:32:10 +05:30
Jake Wiesler 2e2f558a81
Merge pull request #72 from jakewies/all-contributors/add-dgnicholson 2020-07-08 08:26:23 -04:00
allcontributors[bot] d2fa5e1d9d
docs: update .all-contributorsrc [skip ci] 2020-07-08 12:26:14 +00:00
allcontributors[bot] dd690f314d
docs: update README.md [skip ci] 2020-07-08 12:26:13 +00:00
Jake Wiesler b0adb39b2f
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 de265f1763 Fix nav display error when expanding window with open burger. 2020-07-07 20:26:04 -07:00
Jake Wiesler f990d6e971
Merge pull request #70 from kentnek/kent-fix-icon-size 2020-07-05 21:51:56 -04:00
kentnek a92b7f7dc4 fix icon sizes 2020-07-06 04:38:47 +08:00
Jake Wiesler f1c0d6c691
Merge pull request #68 from jakewies/all-contributors/add-aareet 2020-07-05 15:57:05 -04:00
allcontributors[bot] fb70dd5451
docs: update .all-contributorsrc [skip ci] 2020-07-05 19:56:55 +00:00
allcontributors[bot] 343af2728a
docs: update README.md [skip ci] 2020-07-05 19:56:54 +00:00
Jake Wiesler 99aa9e2516
Merge pull request #67 from aareet/patch-1 2020-07-05 15:56:35 -04:00
Aareet Shermon 654c18cec1
Conform icons to Google's mobile usability reqs 2020-07-05 12:33:21 -07:00
Harsh Shandilya c36fa49c5f
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 2d484334c7
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 8a33e809c6
scripts: use env-backed shebang
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-05 15:22:00 +05:30
Jake Wiesler 50a221149d
Merge pull request #66 from kentnek/kent-fix-urls
Fix relative icon issue + add title
2020-07-04 14:20:29 -04:00
kentnek a562e4bf02 fix relative icon issue + add title 2020-07-05 02:18:37 +08:00
Jake Wiesler 0459931d1f
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 b42f2db1b6
static: update resume
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-07-04 19:33:57 +05:30
Jake Wiesler 195f0e0546
Merge pull request #63 from kentnek/kent-add-screenshot
Update screenshot and add to README
2020-07-02 17:54:18 -04:00
kentnek 1efde0e27f update screenshot and add to README 2020-07-03 01:54:48 +08:00
Jake Wiesler 844f5a2fa6 v1.5.0 2020-07-02 10:03:58 -04:00
Jake Wiesler 4cd72bbabe
Merge pull request #62 from kentnek/kent-fix-demo
Add resources folder back
2020-07-02 08:19:01 -04:00
kentnek 439e7da253 added resources folder back 2020-07-02 20:12:04 +08:00
Kent 2721e4dec3
Merge pull request #57 from jakewies/prettier
Add prettier
2020-07-01 02:53:44 +08:00
Jake Wiesler 1356d79861 refactor: revert md/js files 2020-06-28 21:59:54 -04:00
Harsh Shandilya 0cb2e0a3fd
Escape HTML correctly in images
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-28 21:19:33 +05:30
Harsh Shandilya 307c026459
layouts/sidebar: bring back description
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-28 20:06:28 +05:30
Jake Wiesler 9b5950ff3e
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 1231d79de1 refactor: use semicolon in js 2020-06-27 18:39:04 -04:00
Jake Wiesler 4588bdd81b refactor: ignore exampleSite/content dir 2020-06-27 18:38:49 -04:00
kentnek 61b1964c53 change bottom padding of pages to 1rem 2020-06-28 04:35:06 +08:00
Jake Wiesler 340f648353 update CONTRIBUTING.md 2020-06-27 10:56:37 -04:00
Jake Wiesler 5f30c22848 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 742baede65 v1.4.0 2020-06-27 10:14:02 -04:00
Jake Wiesler 5ccd999211
Merge pull request #56 from jakewies/fix-scripts 2020-06-27 10:08:07 -04:00
Jake Wiesler 72d5a0b680 fix script block 2020-06-27 10:09:02 -04:00
Jake Wiesler 8fb9f3a801
Merge pull request #55 from jakewies/all-contributors/add-xvallspl 2020-06-27 10:04:13 -04:00
allcontributors[bot] bc452d025b
docs: update .all-contributorsrc [skip ci] 2020-06-27 14:04:04 +00:00
allcontributors[bot] 278e6a9f37
docs: update README.md [skip ci] 2020-06-27 14:04:03 +00:00
Jake Wiesler 1040745106
Merge pull request #10 from xvallspl/TableOfContents 2020-06-27 10:03:25 -04:00
Jake Wiesler ba57596809
Merge branch 'master' into TableOfContents 2020-06-27 10:00:42 -04:00
Jake Wiesler 72dfb5e7c4 update single.html 2020-06-27 10:00:52 -04:00
Jake Wiesler fe4f0f001d update README 2020-06-26 09:36:14 -04:00
Jake Wiesler aed1429538 docs: document toc on desktop only 2020-06-26 09:27:37 -04:00
Jake Wiesler 4d446adb19 refactor: check toc in post frontmatter 2020-06-26 09:22:38 -04:00
Harsh Shandilya ee9d2ceef9
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 2a55786893
Remove dark theme
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-26 18:08:11 +05:30
Harsh Shandilya 80ab485108
Caddyfile: fix CSP derp
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-26 17:53:05 +05:30
kentnek d20680efd4 add option to show/hide title in TOC, and add margin-bottom to title 2020-06-26 00:40:58 +08:00
Jake Wiesler 95c820e4cd refactor: add post-title to ToC 2020-06-25 12:21:47 -04:00
Jake Wiesler 9a4b63d22b 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 9dcdacfd2e 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 74c0fe9094 hide the toc at 1k px 2020-06-25 15:39:09 +02:00
Xavier Valls Pla c42aeb8076 fix indentation 2020-06-25 15:35:11 +02:00
Xavier Valls Pla 8e307d837d reduce time complexity of toc highlighting
and solve no highlighting when heading not on sight
2020-06-25 15:34:19 +02:00
Kent 2f0e2c1099
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] f629427ed7
docs: update .all-contributorsrc [skip ci] 2020-06-24 18:11:16 +00:00
allcontributors[bot] 905edc259b
docs: update README.md [skip ci] 2020-06-24 18:11:15 +00:00
Kent d713ed3ed5
Merge pull request #50 from jlebar/prismjs
Change how prismjs is loaded.
2020-06-25 02:10:47 +08:00
Xavier Valls Pla 1c27b43ab1 load the toc js conditionally 2020-06-24 19:04:08 +02:00
Justin Lebar ae59e12798
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 b3b898050c
Merge pull request #49 from jakewies/all-contributors/add-pyvain 2020-06-24 12:58:51 -04:00
allcontributors[bot] 46a1a629dd
docs: update .all-contributorsrc [skip ci] 2020-06-24 16:58:36 +00:00
allcontributors[bot] 43f89b2aed
docs: update README.md [skip ci] 2020-06-24 16:58:35 +00:00
Jake Wiesler edeca91614
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 2b8e779abb 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 efe78af487 Document the toc parameter 2020-06-24 18:37:14 +02:00
Xavier Valls Pla 5112b4a758 make the toc optional 2020-06-24 18:37:02 +02:00
Xavier Valls Pla 705e50befa add the post title into the toc 2020-06-24 18:35:33 +02:00
Xavier Valls Pla c1a9553784 signal in toc the current section 2020-06-24 18:34:50 +02:00
Xavier Valls Pla 286b693f3f add table of contents to post 2020-06-24 18:31:03 +02:00
Pyvain ac646dfdbe update readme section for new social icons 2020-06-24 18:28:11 +02:00
Pyvain 56e6f6d923 pagination chevron is just an image 2020-06-24 18:18:03 +02:00
Pyvain 6883ebba41 move social icons to /static/images/social/ for better compatibility with Apache2 (Issue #47) 2020-06-24 17:37:58 +02:00
Harsh Shandilya 50aa2e8b56
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 b9619708c3
Caddyfile: sync from server-config
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-24 20:35:05 +05:30
Jake Wiesler a9a6f0c92b
Merge pull request #45 from kentnek/kent-disqus-ga 2020-06-24 09:44:38 -04:00
kentnek 793cee04f0 add support for disqus and Google Analytics 2020-06-24 15:39:32 +08:00
Jake Wiesler 4974471f6a
Merge pull request #44 from kentnek/kent-raw-html 2020-06-23 15:30:49 -04:00
kentnek 70785ea1fe fix cite example 2020-06-24 00:20:59 +08:00
kentnek 21cb64b308 modify blockquote style 2020-06-24 00:19:05 +08:00
kentnek 08ceb1672f enable raw HTML by default and add some styling 2020-06-23 23:50:13 +08:00
Jake Wiesler 904eaee47f
Merge pull request #43 from kentnek/kent-date-format 2020-06-23 11:30:41 -04:00
kentnek 4f991f0609 add docs to config 2020-06-23 23:21:46 +08:00
kentnek c5da21d161 make dateFormat configurable 2020-06-23 23:20:02 +08:00
Jake Wiesler 9d2323cb63 v1.3.0 2020-06-23 10:35:00 -04:00
Jake Wiesler 0bab7d47d5
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 edf4a0e735
Merge pull request #40 from kentnek/kent-social-icons 2020-06-23 10:29:07 -04:00
kentnek e2cff9ae54 fix title 2020-06-23 22:24:43 +08:00
kentnek 2651ba9747 fix readme 2020-06-23 21:51:36 +08:00
kentnek 73872e420d Add more social icons, and an easy way to configure them 2020-06-23 21:48:49 +08:00
Jake Wiesler 219f74fe50
Merge pull request #39 from kentnek/kent-add-docs-hugo-extended 2020-06-22 16:12:30 -04:00
kentnek 6be644351e surround choco in code block 2020-06-23 04:00:19 +08:00
kentnek 11ba9f4640 explain more on hugo-extended, and sprinkle in some emojis 2020-06-23 03:58:30 +08:00
Jake Wiesler 537481328f
Merge pull request #38 from jakewies/all-contributors/add-kentnek 2020-06-22 15:49:17 -04:00
allcontributors[bot] a7bf451b3b
docs: update .all-contributorsrc [skip ci] 2020-06-22 19:49:09 +00:00
allcontributors[bot] cc20fa1926
docs: update README.md [skip ci] 2020-06-22 19:49:08 +00:00
Jake Wiesler 08dc7f195e
Merge pull request #37 from jakewies/all-contributors/add-kentnek 2020-06-22 15:48:35 -04:00
allcontributors[bot] 6e50611399
docs: update .all-contributorsrc [skip ci] 2020-06-22 19:48:28 +00:00
allcontributors[bot] aaa4b9c352
docs: update README.md [skip ci] 2020-06-22 19:48:27 +00:00
Jake Wiesler 596c3b9093 v1.2.1 2020-06-22 15:47:24 -04:00
Jake Wiesler 2efa75baf2
Merge pull request #36 from kentnek/kent-fix-resources-links 2020-06-22 15:45:10 -04:00
kentnek 24806d1a44 use RelPermalink instead of Permalink 2020-06-23 03:38:36 +08:00
Jake Wiesler 6fe776be5d v1.2.0 2020-06-22 10:43:03 -04:00
Jake Wiesler ee446ad72e
Merge pull request #33 from kentnek/kent-scss 2020-06-22 10:20:14 -04:00
kentnek bef5fd43c8 - 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 2e0af76e63 fix heading styles (#28) and remove stylus files 2020-06-21 05:30:31 +08:00
kentnek 88ab34da0c migrate to SCSS 2020-06-21 05:19:49 +08:00
Jake Wiesler f7fa4e6ee0
Merge pull request #30 from jakewies/all-contributors/add-xvallspl 2020-06-19 15:28:00 -04:00
allcontributors[bot] 344d3b12f1
docs: update .all-contributorsrc [skip ci] 2020-06-19 19:27:51 +00:00
allcontributors[bot] 6d1674c967
docs: update README.md [skip ci] 2020-06-19 19:27:50 +00:00
Jake Wiesler 644d5aa402
Merge pull request #17 from xvallspl/master
update CONTRIBUTING.md
2020-06-19 15:27:34 -04:00
Jake Wiesler 1f9a849c4a
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 a7ea8e9748 moving list and single templates to _default 2020-06-20 03:19:28 +08:00
Jake Wiesler 6040872e4a 1.1.0 2020-06-19 09:17:10 -04:00
Jake Wiesler 4ee21cb26c
Merge pull request #27 from jakewies/all-contributors/add-jakewies 2020-06-19 08:54:29 -04:00
allcontributors[bot] 752831d5f4
docs: update .all-contributorsrc [skip ci] 2020-06-19 12:54:14 +00:00
allcontributors[bot] 99360a78d6
docs: update README.md [skip ci] 2020-06-19 12:54:13 +00:00
Jake Wiesler 3b6509cf9f
Merge pull request #26 from jakewies/update-readme
update README
2020-06-19 08:53:56 -04:00
Jake Wiesler 418465100a update README 2020-06-19 08:54:30 -04:00
Jake Wiesler 9cecbda2dc
Merge pull request #25 from jakewies/all-contributors/add-somaniarushi 2020-06-19 08:40:19 -04:00
allcontributors[bot] d12149e7dd
docs: update .all-contributorsrc [skip ci] 2020-06-19 12:40:03 +00:00
allcontributors[bot] 798ba08b7e
docs: update README.md [skip ci] 2020-06-19 12:40:02 +00:00
Jake Wiesler 4090b398e2
Merge pull request #24 from jakewies/all-contributors/add-jakewies 2020-06-19 08:39:21 -04:00
Jake Wiesler 6026c93d16
Update README.md 2020-06-19 08:39:11 -04:00
Jake Wiesler 55936db93d
Update .all-contributorsrc 2020-06-19 08:38:21 -04:00
allcontributors[bot] c7a13b79f3
docs: update .all-contributorsrc [skip ci] 2020-06-19 12:37:54 +00:00
allcontributors[bot] 2926f47a61
docs: update README.md [skip ci] 2020-06-19 12:37:53 +00:00
Jake Wiesler 1b61bd6acc
Merge pull request #23 from jakewies/all-contributors/add-kentnek 2020-06-19 08:36:34 -04:00
allcontributors[bot] 3c4b827370
docs: update .all-contributorsrc [skip ci] 2020-06-19 12:36:26 +00:00
allcontributors[bot] 143236f951
docs: update README.md [skip ci] 2020-06-19 12:36:25 +00:00
Jake Wiesler b08f0faac4
Merge pull request #22 from jakewies/all-contributors/add-chuxinh 2020-06-19 08:35:56 -04:00
allcontributors[bot] 00c5740b6d
docs: update .all-contributorsrc [skip ci] 2020-06-19 12:35:04 +00:00
allcontributors[bot] c63510b51e
docs: update README.md [skip ci] 2020-06-19 12:35:03 +00:00
allcontributors[bot] b5af5815b9
docs: update .all-contributorsrc [skip ci] 2020-06-19 12:33:35 +00:00
allcontributors[bot] f8cb7241c1
docs: update README.md [skip ci] 2020-06-19 12:33:34 +00:00
Jake Wiesler 03afde24b7
Merge pull request #20 from jakewies/all-contributors/add-chuxinh 2020-06-19 08:32:30 -04:00
Jake Wiesler 48a9aae5d7
Update README.md 2020-06-19 08:32:03 -04:00
allcontributors[bot] ed2be6e890
docs: create .all-contributorsrc [skip ci] 2020-06-19 12:30:15 +00:00
allcontributors[bot] 44ab97ed6d
docs: update README.md [skip ci] 2020-06-19 12:30:14 +00:00
Jake Wiesler 28ccdc0b59
Merge pull request #19 from kentnek/master
Add support for creating new sections
2020-06-19 08:22:36 -04:00
Xavier Valls Pla 685459d4cc update CONTRIBUTING file 2020-06-19 08:36:55 +02:00
kentnek 2cdd3fa943 add support for creating new sections 2020-06-19 03:41:02 +08:00
Jake Wiesler adc7951a27 1.0.0 2020-06-17 11:50:55 -04:00
Jake Wiesler 656eb7b86e
Merge pull request #16 from jakewies/fixes 2020-06-17 11:46:46 -04:00
Jake Wiesler 32f1bc9313 docs: update README 2020-06-17 11:28:10 -04:00
Jake Wiesler 5b34b3c3f4 refactor: move all config to exampleSite 2020-06-17 11:16:57 -04:00
Jake Wiesler 37608f8e5c refactor: use prismjs from unpkg 2020-06-17 11:10:18 -04:00
Jake Wiesler abf1c76c90 0.3.0 2020-06-17 09:03:29 -04:00
Jake Wiesler 0b094f4866
Merge pull request #13 from jakewies/asset-pipeline 2020-06-17 08:57:37 -04:00
Jake Wiesler d0d584dd46 docs: update CONTRIBUTING.md 2020-06-17 08:53:04 -04:00
Jake Wiesler 84ebc45b93 docs: add CONTRIBUTING.md 2020-06-17 08:49:47 -04:00
Jake Wiesler 943ef6c154 feat: add asset pipepline 2020-06-17 08:40:53 -04:00
Jake Wiesler 0b68e6adaf
Merge pull request #12 from jakewies/remove-default-content 2020-06-17 07:48:39 -04:00
Jake Wiesler 137b7c1dc0 update: README 2020-06-16 14:04:51 -04:00
Jake Wiesler 6ca73e65b7 update: README 2020-06-16 14:04:22 -04:00
Jake Wiesler af0b8c1827 refactor: remove default content 2020-06-16 13:59:27 -04:00
Jake Wiesler c55645ddcb
Merge pull request #9 from jakewies/default-content 2020-06-15 11:03:01 -04:00
Jake Wiesler 1be7bd55ef fix: update filies 2020-06-15 10:47:36 -04:00
Jake Wiesler ff6fe0bea7 feat: add default content 2020-06-15 10:34:39 -04:00
Jake Wiesler 26a85582a5
Merge pull request #5 from somaniarushi/master
Update README.md to correct module addition
2020-06-11 21:55:13 -04:00
Arushi Somani 9a01ef8e69
Update README.md 2020-06-11 18:39:41 -07:00
Jake Wiesler 412a1006b8 update: theme.toml 2020-06-09 09:08:40 -04:00
Jake Wiesler 84dccf0532 update: hugo min version in theme.toml 2020-06-09 09:07:06 -04:00
Jake Wiesler 5671cde298
Merge pull request #4 from chuxinh/chuxin-readme
Updating README
2020-06-08 09:32:52 -04:00
Chuxin Huang 4353231e34 update readme 2020-06-08 19:47:03 +10:00
Chuxin Huang 7bd8acf2fb update readme 2020-06-08 19:45:16 +10:00
Harsh Shandilya ba48a34475
fix double notice
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-06 12:59:16 +05:30
Harsh Shandilya 46ab5164b4
Update GitHub Packages post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-06 12:56:37 +05:30
Jake Wiesler 2989618086 docs: update README 2020-06-05 12:00:03 -04:00
Jake Wiesler fe4dfaf4da docs: update README 2020-06-05 11:59:04 -04:00
Jake Wiesler 903e003492
Update README.md 2020-06-05 11:44:35 -04:00
Jake Wiesler 3568a0504d
Update README.md 2020-06-05 11:44:14 -04:00
Jake Wiesler 71ca720f30
Update README.md 2020-06-05 11:41:47 -04:00
Jake Wiesler a073b9b21f docs: update README 2020-06-05 11:32:11 -04:00
Jake Wiesler d2cc902ed4 docs: add comment about social handles 2020-06-05 11:30:54 -04:00
Jake Wiesler 8a9d78946f docs: add comment about why theme is declared the way it is in example 2020-06-05 11:28:32 -04:00
Jake Wiesler fd7a810242 update image sizes 2020-06-05 11:19:28 -04:00
Jake Wiesler b104c17809 update README 2020-06-05 11:14:45 -04:00
Jake Wiesler 06ee068cc8 refactor: remove deps on _index pages 2020-06-05 10:55:22 -04:00
Jake Wiesler a83f31368d
Merge pull request #1 from chuxinh/chuxin-additions 2020-06-05 09:36:38 -04:00
Harsh Shandilya 1d42fafd8a
#BlackLivesMatter
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-02 02:19:40 +05:30
Harsh Shandilya 8b4281686a
layouts/partials: style
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-06-02 02:11:48 +05:30
Harsh Shandilya ebb68d8096
Revert "css: drop custom webfonts"
This reverts commit 44767e59ee.
2020-06-02 01:58:11 +05:30
Harsh Shandilya ad57b559f6
Revert "theme: simplify device dark theme detection"
This reverts commit 0981ee9a33.
2020-06-02 01:58:08 +05:30
Harsh Shandilya 32fa45585f
github: use hugo 0.71.1
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-30 13:59:54 +05:30
Harsh Shandilya f32d7d3e3f
layouts: use heading render hook
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-30 13:59:24 +05:30
Vivek R 6477aa7a9a
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 4f12837a2a
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 af7542395d
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 0981ee9a33
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 fc305d7707 adding base tag to header to fix static file linking 2020-05-17 16:22:39 -05:00
Harsh Shandilya 44767e59ee
css: drop custom webfonts
[skip prod]

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-15 18:44:40 +05:30
Harsh Shandilya cb72587a39
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 800bd56b6f
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 4c2ed188fa
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 cc651f9e78
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 f7fd1f36ed
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 d22f02f952
tweak wording
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 18:49:42 +05:30
Harsh Shandilya 63cd318785
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 fe0744e687
undraft new post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-09 00:32:36 +05:30
Harsh Shandilya a547ea5a1d
Add new post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-08 23:50:41 +05:30
Harsh Shandilya 22d001df32
uses: homebrew is gone
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-05-06 15:42:20 +05:30
Jose R. Gonzalez 30f99b49bf render code blocks as inline-block 2020-05-03 23:44:30 -05:00
Harsh Shandilya 0a68c96710
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 6ae7ffb614
github: remove directory before next run
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-29 20:08:46 +05:30
Harsh Shandilya 382fec8098
uses: undraft
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-29 20:08:25 +05:30
Vivek R 9e5c5eb8f3
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 1efcc934d7
head: add correct type annotations
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 05:10:10 +05:30
Harsh Shandilya f12f3e1f25
config: add uses link
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 00:13:47 +05:30
Harsh Shandilya 1f282a8aa0
uses: flesh out some more
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 00:13:24 +05:30
Harsh Shandilya b44089bc57
themes/hyde: tweak table styling
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-28 00:02:56 +05:30
Harsh Shandilya ce3e400bfc
projects: grammar nit
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-25 08:55:55 +05:30
Harsh Shandilya 7e4dbd8520
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 b834c143aa
WIP: uses.tech page
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 16:22:19 +05:30
Harsh Shandilya 86c0798cb2
css: improve inline code styling
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 15:57:21 +05:30
Harsh Shandilya 470fa65021
move util scripts to subfolder
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-24 15:46:17 +05:30
Harsh Shandilya 9658d252f6
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 7123e9c0fe
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 6c764008c7
github: bump hugo version
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-22 20:34:47 +05:30
Harsh Shandilya 6753625c0f
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 730e1e7a0f
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 b9e43b5530
Publish purelymail post to dev.to
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-14 20:06:31 +05:30
Harsh Shandilya e9b4034c1c
tweak purelymail post description
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:57:30 +05:30
Harsh Shandilya 895dc67090
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 baa92094f8
Publish purelymail post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:44:11 +05:30
Harsh Shandilya 6d9289d662
tweak wording in purelymail post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 19:27:23 +05:30
Harsh Shandilya 3642e240e1
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 3920321f44
Add draft for purelymail post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-13 18:45:42 +05:30
Harsh Shandilya 09c0009034
github: Use Hugo 0.69.0
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-12 01:07:40 +05:30
Harsh Shandilya 26250bd207
layouts: make indexing logic match homepage
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-11 14:02:46 +05:30
Harsh Shandilya 43b857f0eb
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 beb7129c80
layouts: add full content RSS template
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-04-11 13:11:11 +05:30
miteigi f05125cf0f
Remove .DS_Store file 2020-03-19 19:43:55 +09:00
Harsh Shandilya f1e2c38385
Update robots.txt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-15 17:23:28 +05:30
Harsh Shandilya 9b330788da
Switch up syntax highlighting
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-07 03:44:58 +05:30
Harsh Shandilya 97b35c4bdc
Publish Dagger post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 11:04:17 +05:30
Harsh Shandilya 43f1988d48
Fix URL escaping
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:51:24 +05:30
Harsh Shandilya ca7399b803
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 08064a5330
Tweak post width for desktop view
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:27:56 +05:30
Harsh Shandilya 20f77de660
Remove unused code from baseof.html
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:19:49 +05:30
Harsh Shandilya c620556296
Add Subcomponent.Factory note
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:14:04 +05:30
Harsh Shandilya ffaa444d8b
Update Dagger part 2 post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-06 10:10:14 +05:30
Harsh Shandilya d83b4463a0
Update public key
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-05 13:00:45 +05:30
Harsh Shandilya e6de1edef7
WIP dagger part 2 update
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-04 19:15:25 +05:30
Harsh Shandilya b2a7b21e2a
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 82f444fa14
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 8e28be3c6c
Fix syntax highlighting for SELinux post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-03 20:22:42 +05:30
Harsh Shandilya e9931d002b
Finish up Dagger post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-03-03 11:59:33 +05:30
Harsh Shandilya cf30d49ebe
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 6624b5641b
Ensure bold text is themed properly
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-28 11:57:03 +05:30
Harsh Shandilya 78ad65fc3b
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 2afe5959c6
Revert "Setup Carbon ads"
And so ends the experiment.

This reverts commit 83bf9a5495.
2020-02-26 23:44:21 +05:30
Harsh Shandilya 02986604b6
[skip deploy] Update workflow name
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 18:41:56 +05:30
Harsh Shandilya d0ca221cbd
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 8c8b5f059a
css/fonts: Set font-display: swap
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 10:33:10 +05:30
Harsh Shandilya 83bf9a5495
Setup Carbon ads
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-26 10:33:10 +05:30
Harsh Shandilya 1451455517
Tweak CSS location
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 20:04:26 +05:30
Harsh Shandilya 3467af83b6
Remove Internet Explorer compat hacks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 19:25:27 +05:30
Harsh Shandilya bddd9bc165
partials/head: Load fonts stylesheet separately
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 19:18:46 +05:30
Harsh Shandilya a4b9f70d4a
Update my public key
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-25 18:57:20 +05:30
Harsh Shandilya 743093f9cd
Deploy to prod
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-23 21:22:21 +05:30
Harsh Shandilya d8e49be1cb
[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 d45c28f792
[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 9bbb541c21
Merge remote-tracking branch 'social/master' into src
* social/master:
  Add theme.toml
2020-02-20 19:36:56 +05:30
Harsh Shandilya 13c8288ad4
Add theme.toml
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-20 19:31:34 +05:30
Harsh Shandilya 2f09862e5a
Update projects page
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-20 13:53:06 +05:30
Ori c9e27c471a 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 c27caa1087
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 221182262e
Make theme toggle label dynamic
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-18 21:24:26 +05:30
Harsh Shandilya 1d771f0657
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 e987a3cafb
[skip prod] Sidebar tweaks
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-18 03:03:01 +05:30
Harsh Shandilya 341deb06e0
Cleanup custom CSS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:54:32 +05:30
Harsh Shandilya 7805c9711b
Improve dark theme button's accessibility
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:49:29 +05:30
Harsh Shandilya f71c8bcc0f
Cleanup theme toggle JS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-17 01:40:20 +05:30
Harsh Shandilya e91338d54c
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 bfb7f070e7
Add a dark theme toggle
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 22:26:49 +05:30
Harsh Shandilya a91b809e44
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 90113ea1bb
Remove useless gitkeep
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 09:42:53 +05:30
Harsh Shandilya d82ac63b79
Redesign tag entry view
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 01:09:23 +05:30
Harsh Shandilya 66e0f722fa
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 3c6762301a
Re-enable theme override
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-16 00:48:23 +05:30
Harsh Shandilya 7c8cac5492
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 4060b32d40
layouts/index: Remove stray tag
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-15 20:44:51 +05:30
Vivek R d680e98905 chore: add doc for summary length config 2020-02-14 20:38:38 +05:30
Vivek R 38751fe862
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 c2593f969a
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 3058c6c453
Reformat custom CSS
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 13:23:18 +05:30
Harsh Shandilya 3b0607c8be
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 a6e24ced38
Remove image compression workflow
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 05:54:19 +05:30
Harsh Shandilya da662a1088
Only run lighthouse when deploy succeeds
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-14 05:53:24 +05:30
Harsh Shandilya aec549a902
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 0708bd894d
Update forestry config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-14 05:48:04 +05:30
Harsh Shandilya 2b89c0f080
ci: Exit on fails
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-13 01:08:15 +05:30
Timo Ollech 2dcf88303a
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 3f544778a9
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 2ba61f686b
Revert "Add vertical spacing between menu items for appropriate tap target sizing"
This reverts commit 98142a90fc.
2020-02-11 23:53:29 +05:30
Harsh Shandilya 98142a90fc
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 fb4a210aec
Revert "Test summary card type"
My social images aren't adapted for this format and I'm lazy >:)

This reverts commit fea6233aa4.
2020-02-11 08:54:18 +05:30
Harsh Shandilya e6e86ca277
Revert "Tweak tags in commento post"
This reverts commit b93333d9cc.
2020-02-10 11:49:00 +05:30
Harsh Shandilya 831e22b318
Make tag view scrollable
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 11:48:45 +05:30
Harsh Shandilya 362c79c1a0
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 fea6233aa4
[skip prod] Test summary card type
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 11:01:19 +05:30
Harsh Shandilya 5fe9300820
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 7aa3c15e37
Allow override card type
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-10 10:58:02 +05:30
Harsh Shandilya b7ac3a1afc
Linkify headings directly
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 19:04:46 +05:30
Harsh Shandilya 0a1e0664cf
Publish Viscerion post
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 18:07:03 +05:30
Harsh Shandilya 81c4b3f522
Add post about shutting down Viscerion
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 16:44:11 +05:30
Harsh Shandilya 12f82ff9e0
Normalize config
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
2020-02-09 13:17:14 +05:30
Harsh Shandilya dbf6280c3e
[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 1c94a48241
Switch statuspage post assets to WebP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-07 21:02:14 +05:30
Harsh Shandilya c96d87c5f2
Add social metadata to statuspage post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-07 20:59:12 +05:30
Harsh Shandilya 99cfaf0c83
Finish and publish statuspage post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-07 20:38:57 +05:30
Harsh Shandilya 4db8eccead
WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-05 11:19:10 +05:30
Harsh Shandilya cb75f3ee51
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 0800098826
themes: Remove unused hello-frieng-ng
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-04 02:03:44 +05:30
Vivek R 7b9ac34f10 fix: disable custom js from sample config 2020-02-03 18:24:52 +05:30
Harsh Shandilya 537007b5ea
Tweak metadata post social image
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:43:53 +05:30
Harsh Shandilya 44232ba04f
Publish social metadata post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:34:59 +05:30
Harsh Shandilya f5319ea2d6
[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 6fcb3c9cf4
Update social metadata post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 11:26:54 +05:30
Harsh Shandilya e4d4bf056a
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 551b60dcc5
Init social metadata post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 10:13:18 +05:30
Harsh Shandilya b0bf08b59b
Update config for partial update
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:55:30 +05:30
Harsh Shandilya bc87d744ea
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 e064dfd735
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 9710123f1b
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 c9b4b3274f
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 f6c16b6adc
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 890eab219b
Don't hardcode Twitter username
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:39:16 +05:30
Harsh Shandilya f268531bed
Code drop
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:36:22 +05:30
Harsh Shandilya 87566b40fe
Initial commit
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 01:35:51 +05:30
Harsh Shandilya 2485278bd3
Use cloaked email
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-03 00:09:48 +05:30
Harsh Shandilya 2fb0218a42
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 c4d93b246d
Add social images to posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-02 19:41:51 +05:30
Harsh Shandilya cc08039a6b
Add social metadata to pages
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-02 19:35:52 +05:30
Harsh Shandilya d732295450
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 b93333d9cc
Tweak tags in commento post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-02-01 11:22:06 +05:30
Harsh Shandilya 8f81cba912
Move Lighthouse testing to deploy job
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 21:55:37 +05:30
Harsh Shandilya 8eae674bcd
Revert "ci: Tweak deployment pipeline"
This reverts commit 75064df8cf.
2020-01-31 21:52:26 +05:30
Harsh Shandilya 7a445755c7
Update
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 21:50:09 +05:30
Harsh Shandilya ffdd73b3d9
Prevent incorrect formatting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 20:22:58 +05:30
Harsh Shandilya 6881326ed4
Initial commit for Dagger part 2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-31 12:25:57 +05:30
Harsh Shandilya 73a5cd59a7
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 090a719c38
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 35fcd52a8b
Update resume
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-26 02:25:03 +05:30
Harsh Shandilya 30b1d43eb0
Cache some partials
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-23 11:26:13 +05:30
Harsh Shandilya 130010ed02
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 6ff9f038f8
Add APS privacy policy
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 21:11:56 +05:30
Harsh Shandilya 6d2ebdae30
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 f83fc1bd63
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 57ba7128ed
Fix formatting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 12:30:25 +05:30
Harsh Shandilya 1d8d3442b8
Publish dagger tutorial's part 1
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-21 11:44:42 +05:30
Harsh Shandilya 109fdbd70e
Adjust for repo cleanup
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 15:00:45 +05:30
Harsh Shandilya cbe5917872
Tweak opening for Dagger post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 14:55:20 +05:30
Harsh Shandilya 9c802f3f1a
Finish up Dagger part 1 post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 14:47:15 +05:30
Harsh Shandilya 7212f3821a
Add commento post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-20 01:38:50 +05:30
Harsh Shandilya c84824b73e
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 fa4bcb2d96
WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-18 12:16:44 +05:30
Harsh Shandilya 0cde0d4c7f
WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-17 22:51:26 +05:30
Harsh Shandilya 931be3095e
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 1d0bbd9907
Update post metadata
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-17 20:39:14 +05:30
Harsh Shandilya 9307a1c8fd
More work on Dagger tutorial
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-14 14:11:02 +05:30
Harsh Shandilya eed2c0b7c4
Only linkify h1 and h2 headings
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-14 11:37:39 +05:30
Harsh Shandilya f61592c76e
Add WIP Dagger tutorial
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-14 10:56:47 +05:30
Harsh Shandilya d447458d04
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 0ba918c69d
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 eff347432a
Add a robots.txt file
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 03:12:29 +05:30
Harsh Shandilya 4e1c3b8c89
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 edf1b9a009 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-11 21:28:13 +00:00
Harsh Shandilya dbc4aa1006
Final formatting touchups
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 02:50:31 +05:30
Harsh Shandilya fe072b41ed
Publish my dagger story
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-12 02:47:37 +05:30
Harsh Shandilya 1b8a67cec2
[skip deploy] github: Update lighthouse action
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-11 01:40:43 +05:30
Harsh Shandilya cc19701965
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 73381813c3
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 d99144e3bd
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 9ccdaa9e67
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] bf4004be98
Optimised images with calibre/image-actions 2020-01-10 21:06:28 +05:30
Harsh Shandilya 2c75d4b539
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 108387b38d
github: Simplify deploy condition
[skip deploy]

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-10 13:41:10 +05:30
Harsh Shandilya 8a4630472c
[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 0807ae53d5
[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 5447bb3625
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 55eddf2a70
[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 e09542962a
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 6a398b8250
Formatting fix
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-06 19:58:18 +05:30
Harsh Shandilya 5625d4cdaa Update from Forestry.io - Updated Forestry configuration 2020-01-06 14:26:14 +00:00
Harsh Shandilya f158a82743 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-06 14:25:09 +00:00
Harsh Shandilya e4e0fb846f Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-05 15:50:36 +00:00
Harsh Shandilya 638fc56b89 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-05 15:39:52 +00:00
Harsh Shandilya 0ffd30a381
Formatting tweaks
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-05 17:46:11 +05:30
Harsh Shandilya 59095d9bb0
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 df956ba065 Update from Forestry.io
Harsh Shandilya updated content/posts/my-dagger-story.md
2020-01-05 11:46:39 +00:00
Harsh Shandilya 9468ae21e6
Heavily expand Dagger post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2020-01-05 16:53:04 +05:30
Vivek R 28b525ab09 feat: default style for table 2020-01-05 11:55:42 +05:30
Harsh Shandilya 01f895504d
[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 1e8c46ef24
[skip deploy] Update CI badge URLs
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-31 13:55:06 +05:30
Harsh Shandilya ea82b36c0c
github: Setup deploy skipping
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-31 13:52:07 +05:30
Vivek R 7aba720e77 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 92c06a277f
WIP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-30 22:56:11 +05:30
Vivek R 76678b5559 fix: disable disqus if Site.DisqusShortname is not set 2019-12-30 19:39:09 +05:30
Vivek R 972d3cef54
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 e697a4fc06
Start up a dagger scratchpad
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-29 21:21:49 +05:30
Harsh Shandilya e5e57b3548
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 f7e38ecb19
Add description to analytics post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 01:45:38 +05:30
Harsh Shandilya eda8b12c46 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 108a4550d2 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 816d360b13 Update from Forestry.io
Harsh Shandilya created static/uploads/goaccess_terminal.png
2019-12-25 20:03:34 +00:00
Harsh Shandilya d550fc6002 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 4748854dee 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 604c82caea
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 37cd79f951
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 f67125b636
Update server-side analytics post again
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-26 00:17:24 +05:30
Harsh Shandilya f63037de51
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 2f7ddfe948.
2019-12-26 00:13:00 +05:30
Harsh Shandilya 9911895a1e
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 c51091d864
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 d65a242d8e
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 fd821ff533
Tweak formatting of github packages post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-22 23:51:45 +05:30
Harsh Shandilya 530f493fb6
WIP post update
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-20 21:23:35 +05:30
Harsh Shandilya 2848bb7864
Revert "Add Caddyfile for local testing"
Don't need it anymore since Lighthouse is run in CI

This reverts commit f83c67aac8.
2019-12-20 20:09:02 +05:30
Harsh Shandilya e273609953
Add a shortcode for gfycat embeds
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-20 20:08:37 +05:30
Harsh Shandilya d597d51ba2 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 0e3cc1f818 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 b6e1b58958 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 ac464251e5
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 5c461d3911
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 cd1455cd21
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 49427da00a
Update base URL
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-13 19:04:34 +05:30
Harsh Shandilya 6a4f83f6e4
Add binary incompatibility post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-13 01:25:22 +05:30
Harsh Shandilya 1250ac4216
Add runtime asserts to caveats post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 14:14:31 +05:30
Harsh Shandilya 36653c69f9
themes/hyde: Use correct favicon
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 13:57:36 +05:30
Harsh Shandilya 48925277a5
Cleanup static assets
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-12 13:57:12 +05:30
Harsh Shandilya 64b7707b83
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 2f7ddfe948
Use Hugo highlighting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:45:49 +05:30
Harsh Shandilya 5e1ef47beb
Update syntax highlighting CSS
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:35:23 +05:30
Harsh Shandilya a9109345a1
Enable pygments highlighting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:35:11 +05:30
Harsh Shandilya e8ac848719
Revert "themes/hyde: Use PrismJS for syntax highlighting"
This reverts commit 6aeb53db4d.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-05 23:26:59 +05:30
Harsh Shandilya c823799a6f
Revert "theme: Update prism to support more languages"
This reverts commit f90f4de0f3.
2019-12-05 23:26:36 +05:30
Harsh Shandilya 4283cb0375 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 4c2d9467f9 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 66b3a47f43 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 b78bba0954 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 b29170ae67
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 74faa52b95
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 4637048f3f
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 2dd7d72b20
Add descriptions to all posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 17:39:37 +05:30
Harsh Shandilya 3a21d31039
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 6bd8ee2b4d
Update README
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 16:25:47 +05:30
Harsh Shandilya 2804795382
Revert "themes/hyde: Respect SRI when loading prism JS"
For some reason dis is broken

This reverts commit 58ec3d6ff8.
2019-12-04 16:17:56 +05:30
Harsh Shandilya 53211835f0 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 f6b41ee981 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 9953b74ff4
Init skeleton
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-04 10:08:39 +05:30
Harsh Shandilya 58ec3d6ff8
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 fe8d2a149e
Tweak code highlight theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-02 20:15:34 +05:30
Harsh Shandilya ec3321ae54
Delete FUNDING.yml 2019-12-02 19:26:33 +05:30
Harsh Shandilya 127ce7414b
github: Separate testing and deployment pipelines
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-01 21:11:23 +05:30
Harsh Shandilya de3cc0b608
Update CV
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-12-01 21:04:08 +05:30
Harsh Shandilya 87b93f9cdf
Embed repls properly
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-30 07:28:19 +05:30
Harsh Shandilya d508d08be5
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 6aeb53db4d
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 106a464ce1
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 2966b75304
Re-introduce standalone pages
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-29 19:44:47 +05:30
Harsh Shandilya 0e86f04858
Fix baseurl
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 18:34:23 +05:30
Harsh Shandilya 2de1919bf4
Relocate standalone pages for now
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 18:09:11 +05:30
Harsh Shandilya 747a7c13cf
Switch to hyde theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 17:25:51 +05:30
Harsh Shandilya 14aec982b6
Tweak post formatting
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-28 17:25:44 +05:30
Harsh Shandilya 34f974203b Add 'themes/hyde/' from commit 'a56b6f866fe0a9e6aaf3ecaebf43bf3b2a00a88b'
git-subtree-dir: themes/hyde
git-subtree-mainline: 4757458967
git-subtree-split: a56b6f866f
2019-11-28 17:06:56 +05:30
Sorin Davidoi a56b6f866f 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 4757458967
Minor formatting tweak
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 18:12:27 +05:30
Harsh Shandilya 7a88313043
Publish github packages post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 18:02:05 +05:30
Harsh Shandilya 101384ab4a
Tweak github packages post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-22 18:01:27 +05:30
Harsh Shandilya f90f4de0f3
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 b623393fb8
Make image naming more explicit
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 20:14:00 +05:30
Harsh Shandilya c93243e30f 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 298f35f0a5 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 e5a1045799 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 404c6ef267 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 dabc1d2744 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 014c0ab2b0
Update post skeleton generator
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 11:58:23 +05:30
Harsh Shandilya ea0860f2ee
Add new post skeleton
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-21 11:58:22 +05:30
Harsh Shandilya 6f04622470
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 c8f23a57bf
Test official Lighthouse CI action
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-19 19:54:41 +05:30
Vivek R 6148bfde45 fix: update demo pygmentes style 2019-11-19 16:22:05 +05:30
Harsh Shandilya 23077e4c8a
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 a8c7a01d38 Update README.md 2019-11-14 18:22:13 +01:00
Djordje Atlialp 2580b0f9ab Update prism.js to v1.17.1 2019-11-14 18:22:11 +01:00
Djordje Atlialp 0946a5595a Update assets 2019-11-14 18:21:17 +01:00
Djordje Atlialp 464b0a3317 Update svg.html
Add kaggle icon
2019-11-14 18:16:28 +01:00
Djordje Atlialp 0a613d377b A bit cleanup 2019-11-14 17:34:53 +01:00
Djordje Atlialp 276bb50577 Fix disableReadOtherPosts feature 2019-11-14 17:34:34 +01:00
Djordje Atlialp d56680f496 Update head.html
Improve Styling
2019-11-14 16:37:36 +01:00
Djordje Atlialp a776f83fc1
Merge pull request #73 from JPYamamoto/master
Added option to disable Read Other Posts
2019-11-14 16:31:38 +01:00
Djordje Atlialp bb2c330877 Update README.md 2019-11-14 16:29:35 +01:00
Djordje Atlialp 0b6cca8ba9 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 606990e467 Update npm packkages 2019-11-14 15:19:05 +01:00
Harsh Shandilya 881fbece09
Remove subtree merge errors
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-13 22:24:29 +05:30
Harsh Shandilya f2949d9012
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 7a51d2733f
Revert "Properly configure conditions"
This doesn't help outside the initial deploy testing experiment.

This reverts commit 487542bbee.
2019-11-11 10:00:17 +05:30
Harsh Shandilya 165f69cf84
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 a905a6f457
github: Compress images through actions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-11 00:46:09 +05:30
Harsh Shandilya a78cdbd8e5
Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-10 15:10:04 +05:30
Mahito TANNO de58726d3b Disable Google Analytics when hugo server 2019-11-10 00:00:18 +09:00
Djordje Atlialp c5f4592cc3
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 ecf73d651f 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 8e74d6f691
Add skeleton for new post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 13:17:23 +05:30
Harsh Shandilya f05a7d360d 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 46a084ca1c 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 6ea4082346
Syntax highlighting fixes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 11:58:53 +05:30
Harsh Shandilya 9938b36e7c 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 90ec044c4b 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 7766c2ce86 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 79bf1d168b
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 19e34ea343
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 0072dca576
github: Properly set destination for deploys
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-06 09:25:22 +05:30
Harsh Shandilya 75064df8cf
ci: Tweak deployment pipeline
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 23:22:12 +05:30
Harsh Shandilya 7ceceaa7d1
Setup prod deployment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 23:21:30 +05:30
Harsh Shandilya 1e3b9ffb63
Setup staging deployment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 23:21:30 +05:30
Harsh Shandilya 487542bbee
Properly configure conditions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-05 20:07:24 +05:30
Vivek R 8961042aa1
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 9e5753f16f Hindi language added in langFlags and translations also added for hindi. 2019-11-02 23:51:28 +00:00
Andre Restivo 64eafb28bd [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 72b2a5560b
github: Use prebuilt Docker images
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-02 18:12:16 +05:30
Harsh Shandilya 416bd6055a
Run lighthouse testing in Actions CI
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 17:09:05 +05:30
Harsh Shandilya 1bc74677e1
Test GitHub deployment
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 16:48:33 +05:30
Harsh Shandilya 8ea23fc323
Use new download location
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-11-01 16:18:03 +05:30
Harsh Shandilya dfab3db5bb
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 20810b2afd
Merge pull request #62 from klaidliadon/master
Custom favicons color
2019-11-01 08:31:29 +01:00
Harsh Shandilya 6c7c194972
theme: Switch Google Analytics to gtag
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-31 01:18:38 +05:30
Harsh Shandilya 01e594a590
Fix analytics config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-31 00:47:26 +05:30
Harsh Shandilya 062a3c5508
Enable Google Analytics 2019-10-30 20:36:33 +05:30
Alex D. Guerrieri 66958b46eb
Merge branch 'master' into master 2019-10-28 15:15:27 +01:00
Harsh Shandilya 2a1b7b1b0b
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 3ffe8e2c69
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 836dcced3b
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 40de4919b8 Added option to disable Read Other Posts 2019-10-23 21:02:56 -05:00
Vivek R a7eca2baeb
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 1df516090c feat: load custom CSS and JS 2019-10-23 00:34:47 +05:30
Vivek R fd80089ceb
Merge pull request #25 from vividvilla/fix-readability
Fix readability
2019-10-22 23:54:31 +05:30
Vivek R e52c69a3c1 fix: anchor text color for dark theme 2019-10-22 19:52:32 +05:30
Vivek R f6d21899a2 chore: add gitignore 2019-10-22 16:02:29 +05:30
Vivek R 3bb3f06886 fix: readability fixes 2019-10-22 16:02:29 +05:30
Vivek R 4f0c28af2e
Merge pull request #19 from cgiacomi/feature/posttags
feat: add tag list to post
2019-10-19 18:07:05 +05:30
cgiacomi 28c2f28a13 fix: change layout for tags 2019-10-17 21:57:21 +02:00
cgiacomi 7d9bec3737 chore: merge from master 2019-10-17 21:04:50 +02:00
Djordje Atlialp b90c66b4e2
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 4492a5c0bd
Merge pull request #64 from JPYamamoto/master
Cursor color customization
2019-10-17 10:42:49 +02:00
Djordje Atlialp 6b198fc4a6
Merge pull request #66 from JPYamamoto/stackoverflow
Added Stackoverflow icon
2019-10-17 10:39:40 +02:00
Djordje Atlialp 6cdbc10f53
Merge pull request #67 from davidfeng88/master
Add GitBook svg
2019-10-17 10:38:55 +02:00
davidfeng88 b0eddef949 add gitbook svg 2019-10-16 13:45:43 -04:00
JPYamamoto eee26038f6 Added Stackoverflow icon 2019-10-14 11:14:42 -05:00
Artur Zylinski b6a5534d1b 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 ee9a8f2125 Cursor color customization 2019-10-12 17:18:08 -05:00
Vivek R edf7470d61 fix: readability fix for small screen devices 2019-10-13 01:23:11 +05:30
Vivek R 84ec33e02f fix: anchor tag overflow on chrome bug 2019-10-13 00:52:27 +05:30
Vivek R 1e1a59467c fix: set demo pagination to 5 items 2019-10-12 23:02:22 +05:30
Vivek R 0e51209179
Merge pull request #21 from vividvilla/feat-dark-mode
feat: add dark mode
2019-10-12 23:00:32 +05:30
Vivek R d8269da722 feat: add dark mode 2019-10-12 22:48:57 +05:30
Vivek R 10254883df
Merge pull request #18 from cgiacomi/feature/draftlabal
feat: add draft label for draft posts
2019-10-12 22:39:08 +05:30
cgiacomi 470638b4bc fix: move tags to bottom of post 2019-10-12 17:39:40 +02:00
cgiacomi 298648a63b feat: add draft label to recent articles 2019-10-12 17:24:28 +02:00
cgiacomi 186ad23333 feat: add draft label to post list 2019-10-12 17:11:34 +02:00
Vivek R e902ec0239
Merge pull request #20 from vividvilla/fix-typography
fix: increase header font weight
2019-10-12 19:30:41 +05:30
Vivek R 21e93a4dcd fix: increase header font weight 2019-10-12 19:28:34 +05:30
cgiacomi 4ccf226f91 feat: add tag list to post header 2019-10-12 09:27:08 +02:00
cgiacomi a6070f5408 feat: add draft label for draft posts 2019-10-11 21:25:17 +02:00
Vivek R 6e5bf0c053
Merge pull request #17 from cgiacomi/feature/copyright
feat: add copyright option
2019-10-10 17:19:09 +05:30
Christian Giacomi a09b1d9585 feat: add copyright option 2019-10-10 13:01:45 +02:00
Vivek R be412d7167
Merge pull request #16 from directed-graph/master
feat: allow specifying favicon via configuration
2019-10-10 11:34:09 +05:30
Travis Chen bb85c2b77f 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 b512690094
Cleanup static assets
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-04 18:48:29 +05:30
Harsh Shandilya f83c67aac8
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 397b547358 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 1cd4c9b051 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 c9f71d5139
Remove aria-role flagged by Lighthouse
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:27:44 +05:30
Harsh Shandilya 2924ef0ae6
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 446091a839
Use description parameter from site config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:26:44 +05:30
Harsh Shandilya ce4bfe8aa5
Revert "Re-add flag-icon-css"
The theme uses this but not me

This reverts commit 8c21dcde89.

Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-10-02 14:02:22 +05:30
Harsh Shandilya 8e690c5774
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 8c21dcde89
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 ec349b8bb1
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 4760f32f3d
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 8d6e2866a5
static: Update service worker cache
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 19:15:42 +05:30
Harsh Shandilya 57d0626012
Wrap up part 2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 19:12:18 +05:30
Harsh Shandilya 2805437699
Visibility modifiers topic
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-30 18:54:21 +05:30
Harsh Shandilya b102d1db5a
More progress on part 2
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-29 22:16:19 +05:30
Harsh Shandilya d544f0b3da
Disable PWA on local builds
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-29 10:38:57 +05:30
Harsh Shandilya 0e8e3062a5
Check-in empty structure for post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-29 10:20:27 +05:30
Harsh Shandilya b865e75073
Disable analytics
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-28 20:38:02 +05:30
Harsh Shandilya 0868d96502
Add Fathom analytics support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:53:41 +05:30
Harsh Shandilya 5b67a64903
Remove unused JS
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:38:15 +05:30
Harsh Shandilya 158b926d80
Codestyle cleanup for service workers
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:26:16 +05:30
Harsh Shandilya 80934c3363
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 562d5a3e79
Inject page views stats tracker
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-24 00:10:30 +05:30
Harsh Shandilya a590a2ea69
Fix typo
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 23:24:05 +05:30
Harsh Shandilya a3fdd59bd2
Refresh cache
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 15:28:10 +05:30
Harsh Shandilya 750306ee7c 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 d72fd05d8c
keybase 2019-09-23 11:27:05 +02:00
Alex Guerrieri 544081095e
favicons color 2019-09-23 11:26:57 +02:00
Harsh Shandilya dea9847b4c
Wrap up Teaching Kotlin Part 1
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 06:44:08 +05:30
Harsh Shandilya b52cd3f7c3
Properties and initialization blocks
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 06:40:34 +05:30
Harsh Shandilya b5f4d897e3
Improve code samples
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-23 06:05:46 +05:30
Harsh Shandilya f6f8d9da13
github: Add sponsors button
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 22:34:15 +05:30
Harsh Shandilya 5cedcfdc35
I'm dumb
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 01:10:03 +05:30
Harsh Shandilya 97f549ef2f
Add code examples to finality section
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 00:58:25 +05:30
Harsh Shandilya f2918bc653
Static classes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-22 00:47:27 +05:30
Harsh Shandilya b601caee85
Add subheading about finality of classes
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 23:42:17 +05:30
Harsh Shandilya 2257b1fc74
Fix replit liquid tag
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 02:45:50 +05:30
Harsh Shandilya d7eb7a8f9d
Cache new post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 02:42:09 +05:30
Harsh Shandilya 63ebcae53b
Add constructors and parameters topic
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-21 02:41:26 +05:30
Harsh Shandilya 1caa7c773c 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 0a9dc2a94f 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 9dd7692504 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 6780eb6514
README: I stan Forestry
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-20 08:19:57 +05:30
Harsh Shandilya 4d39af34c5 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 9fcc007395 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 43378f713e
Reconfigure `#DigitalClimateStrike`
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-20 08:01:34 +05:30
Harsh Shandilya 9970ca54a5 Update from Forestry.io - Updated Forestry configuration 2019-09-20 02:04:02 +00:00
Harsh Shandilya 60856aa962 Update from Forestry.io - Updated Forestry configuration 2019-09-20 02:03:52 +00:00
Vivek R 1a6e76206c
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 5f7e3184bd fix: add whitespace between title and subtitle in title header 2019-09-20 00:01:19 +05:30
Vivek R 2837a2ba62 fix: images and other media doesn't get scaled 100% width 2019-09-20 00:01:19 +05:30
Vivek R 34844c3b3d
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 c27e660062 fix: build failed due to invalid variable reference 2019-09-19 22:53:48 +05:30
Vivek R 411c986a01 fix: use site.baseurl for assets url 2019-09-19 22:44:58 +05:30
Harsh Shandilya beff631945 Update from Forestry.io - Updated Forestry configuration 2019-09-15 00:33:25 +00:00
Harsh Shandilya 7971716bf9
service-worker: Cache current posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-13 19:43:07 +05:30
Harsh Shandilya d49abfcca5
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 9b963266fa Update from Forestry.io - Updated Forestry configuration 2019-09-12 09:17:03 +00:00
Harsh Shandilya b12772a612 Update from Forestry.io - Updated Forestry configuration 2019-09-12 09:12:38 +00:00
Harsh Shandilya 9f67da498f
Add flattr meta tag
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 14:21:36 +05:30
Harsh Shandilya 9a9b278f8d
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 4a1fbc9a29
Add script to update FontAwesome
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 13:27:46 +05:30
Harsh Shandilya 520605aec8
Update FontAwesome
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-12 13:27:43 +05:30
Harsh Shandilya 482dd211ac
Revert "Re-use service worker from official hugo example"
This is not as good as I thought it would be.

This reverts commit 3215277ba6.
2019-09-12 01:58:06 +05:30
Harsh Shandilya 3215277ba6
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 271ac29cb5
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 08f07f92f3
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 a04ba54dd8
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 fc2f3612a9
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 0842ad0e24
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 e3015d4f8f
Add 384x384 icon to site manifest
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:53:23 +05:30
Harsh Shandilya c79a379b42
Convert static assets to use WebP
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:53:22 +05:30
imgbot[bot] 9fab663a20 [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 57920fa964
Complete PWA implementation
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:44:02 +05:30
Harsh Shandilya 86e7fa2755
Rename PWA manifest
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-11 04:26:22 +05:30
Harsh Shandilya 50e3090604
Prepare preliminary PWA support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-10 04:12:40 +05:30
Vivek R 31544832ad fix: remove `params.mainSections` from exampleSite config 2019-09-10 00:33:35 +05:30
Vivek R 1ab28caf4f fix: increase font weight for em inside blockquote 2019-09-10 00:29:23 +05:30
Vivek R bb28e76551 fix: paginate recent posts and use params.mainSections 2019-09-10 00:12:59 +05:30
Harsh Shandilya c92df921e7
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 2e2b491211
Join the Digital `#ClimateStrike`
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-09 22:29:19 +05:30
Djordje Atlialp b2f7b9eabf
Merge pull request #49 from agmm/master
Fixed accidental text selection
2019-09-08 20:30:44 +02:00
Djordje Atlialp ef0df73026
Merge pull request #56 from VincentTam/patch-1
Changed i18n file comment heading
2019-09-08 20:29:20 +02:00
Djordje Atlialp 6cb2a1c206
Merge pull request #57 from VincentTam/patch-2
Fixed typo in German i18n
2019-09-08 20:28:26 +02:00
Harsh Shandilya fa0a812bf2
Stick to more readable date formats
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-07 17:47:15 +05:30
Harsh Shandilya e84c6ceb72
Check in Rust tooling post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-07 12:55:36 +05:30
Harsh Shandilya cb383904d0
static: Fix favicons
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-03 11:53:17 +05:30
Harsh Shandilya dd228f2e9c
Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-03 01:43:25 +05:30
dependabot[bot] dbd2158841
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] 4562e3791a
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] db6b9ebe95
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] 3c08908753
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] c8a0c7e6ee
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] cdd0e8dbfd
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] 5b99f5d3b0
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] 4ee4af7d37
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] bcaf2f1697 [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 c116ad5271
Switch theme to hello-friend-ng
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-09-02 14:27:40 +05:30
Harsh Shandilya c18a1a23a8
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 62d338fedb Add section for Sidebar description 2019-08-30 21:12:23 +02:00
Dinesh 6190b663b6 Add example for Sidebar menus 2019-08-30 21:12:23 +02:00
Harsh Shandilya bf1b718e91
generate_post_skeleton: Add success message
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-31 00:20:17 +05:30
Harsh Shandilya 966590f911
Remove unfinished and discarded post
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-30 23:46:51 +05:30
Harsh Shandilya f5150fde9b
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 97c4ab502d
Fixed typo in German i18n 2019-08-27 22:52:53 +02:00
Vincent Tam ddb8756937
Changed i18n file comment heading
France ≠ French
2019-08-27 22:39:42 +02:00
Harsh Shandilya 383e8790bb
Remove unused Caddyfile
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-16 15:18:00 +05:30
Stephen Crane bcf6253acc 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 92aec080ee
README: Update for caddyserver migration
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-15 01:26:50 +05:30
Harsh Shandilya 04d0a950df
Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-15 01:20:00 +05:30
Bjørn Erik Pedersen 8bfa46de48
Add go.mod 2019-08-14 20:38:26 +02:00
Bjørn Erik Pedersen 3080504e92
Use .Site.RegularPages on home page 2019-08-14 20:32:15 +02:00
Arnaldo Gabriel 19fc94cd8f Fixed accidental text selection 2019-08-12 21:26:19 -04:00
Arnaldo Gabriel 1169c17518 Added rule to ignore .vscode 2019-08-12 20:39:01 -04:00
Harsh Shandilya de3de1ca6c
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 d1149d721c
Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:40:17 +05:30
Harsh Shandilya ec2916376a
Fix link to theme submodule
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:28:32 +05:30
Harsh Shandilya 65312e7130
Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:27:41 +05:30
Harsh Shandilya e2a51ae2cd
Add page desc
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 12:24:32 +05:30
Harsh Shandilya 159113994c
treewide: Update GitHub URLs
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 11:53:37 +05:30
Harsh Shandilya 815534f5f4
projects: Reword floating-action-button entry
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-08-02 11:51:51 +05:30
Harsh Shandilya 0251d8b800
Add redirect for GitHub
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-28 09:57:03 +05:30
Harsh Shandilya 98ed4b62d3
Update GitHub username
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-28 09:55:04 +05:30
Harsh Shandilya ba48ce264a
Relocate redirection config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-27 23:38:17 +05:30
Harsh Shandilya d34c6e0d37
Add Brave redirect
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-27 22:57:46 +05:30
Harsh Shandilya 10f4d0863e
Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-26 04:12:38 +05:30
Djordje Atlialp 091ba7b1d2
Update LICENSE.md 2019-07-24 10:42:44 +02:00
Djordje Atlialp e8d42ad072
Update LICENSE.md 2019-07-24 10:41:51 +02:00
Harsh Shandilya 654bc6996b
Bump theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-21 17:09:19 +05:30
Harsh Shandilya 820b329030
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 64220fe175
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 7307dfe1cd
Merge pull request #45 from vgalin/patch-1
fix typo
2019-07-19 18:53:23 +02:00
vgalin 8b81f29d34
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 51746c0811
Update contact page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-18 12:25:29 +05:30
Harsh Shandilya e782130cd8
Add resume page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-18 12:21:41 +05:30
Harsh Shandilya 3884d220db
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 7cedc03d94
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 c8879dd0ac
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 eec176a592
Merge pull request #38 from hervyqa/master
Add pre scrollbar custom like hermit
2019-07-16 08:20:13 +02:00
Christian Rebischke 588f70e8ba
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 eb58d2ad67
Update resume
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-07-13 09:20:17 +05:30
Harsh Shandilya 2a9077e1ee
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 24059c8cd6 Add pre scrollbar custom like hermit 2019-06-30 23:53:17 +07:00
Harsh Shandilya cf72dc5c9c
Add resume
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-26 16:50:20 +05:30
Harsh Shandilya eee3228745
Locally keep avatar image
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-20 19:30:59 +05:30
Harsh Shandilya bd0b656bd1
Trim down favicons even more
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-20 19:24:56 +05:30
Harsh Shandilya 5790d4dd90
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 0e06bb53c5 fix: broken Hugo site link in footer 2019-06-19 15:52:48 +05:30
Vivek R 20cc3193f6 fix: move footer scripts to footer template 2019-06-19 15:37:55 +05:30
Vivek R c3b42e321b
Merge pull request #3 from mr-karan/list
fix: inline style for list
2019-06-19 15:25:08 +05:30
Harsh Shandilya 183126af68
Trim down favicons
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-14 21:33:29 +05:30
Harsh Shandilya 5ee2944aa1
Asynchronously load font and fontawesome
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-12 23:10:50 +05:30
Harsh Shandilya 403e863f32
Fix favicon paths in app manifest
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-11 07:50:10 +05:30
ImgBotApp 82ddbb8e16 [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 e0cee9632a
Declare and use extended favicon support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-11 04:13:32 +05:30
Nicolas Martignoni 448802d66c
Update README.md 2019-06-10 22:16:41 +02:00
Nicolas Martignoni ece0864728
Add checks for address without @-symbol
- This fixes bug #5.
2019-06-10 21:58:42 +02:00
Harsh Shandilya e473dfb277
Migrate my SELinux gist to blog
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-09 18:10:10 +05:30
Harsh Shandilya b607d25385
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 8e455f9e67
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 65507b9286
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 1cabf111af
Add DEV.to badge
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-02 21:24:25 +05:30
Harsh Shandilya c85ed8ea4a
Add author name to RSS feed
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-02 15:44:10 +05:30
Harsh Shandilya c51c470eaa
Update theme
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 11:53:13 +05:30
Harsh Shandilya a9072f573a
Enable twitter share for blog posts
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 01:34:22 +05:30
Harsh Shandilya fa3021c8ce
Use FA icons on homepage
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 01:33:41 +05:30
Harsh Shandilya 4de714663e
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 6bfae06ac7
Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-06-01 00:55:07 +05:30
Harsh Shandilya 723e6511d5
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 a5ee352a33
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 519a6e5322
Add README
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 19:08:46 +05:30
Harsh Shandilya 1f8a164a6b
Replace SpammedIn with Keybase
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 19:02:44 +05:30
Harsh Shandilya 1e7c93da39
Revert "Update config"
Centered items look pretty bad on mobile.

This reverts commit 04941f1b7d.
2019-05-30 18:59:36 +05:30
Harsh Shandilya 04941f1b7d
Update config
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 18:57:27 +05:30
Harsh Shandilya 8a5afc89dd
Init blog
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 18:51:43 +05:30
Harsh Shandilya ddd96c55aa
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 8cfacf18fb
Tweak menu item weight
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 04:08:47 +05:30
Harsh Shandilya 680c86525e
Bump submodule
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-30 03:53:54 +05:30
Harsh Shandilya fc18fbac54
Switch back to theme submodule
instant.page is not enough incentive to fork and make updating the theme
a chore.

This reverts commit 713db7e449.
2019-05-30 03:53:54 +05:30
Harsh Shandilya 713db7e449
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 7d77c31c05
Update projects page
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-29 19:10:12 +05:30
Djordje Atlialp b9fd0dbe9b
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 04dad30695 Small fix on name of language 2019-05-27 18:01:22 -03:00
Djordje Atlialp fa79ddc81b
Merge pull request #34 from andrealmeid/logo_monospaced
sass: make logo font monospaced
2019-05-26 00:10:29 +02:00
Djordje Atlialp 81a41329f1
Merge pull request #33 from andrealmeid/telegram_icon
icons: add Telegram icon
2019-05-26 00:09:34 +02:00
Harsh Shandilya e9a61a7feb
Check in my Keybase proof
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-05-24 17:04:22 +05:30
André Almeida d92675d678
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 a4bca6b0d8 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 46f97f518c
Merge pull request #21 from codgician/master
Better multilingual support
2019-05-23 01:44:59 +02:00
Djordje Atlialp b6498b3346
Merge pull request #32 from andrealmeid/h1_flex
sass: fix h1 position
2019-05-23 01:41:49 +02:00
André Almeida f93303553d
sass: fix h1 position
Signed-off-by: André Almeida <andrealmeid@riseup.net>
2019-05-22 20:29:32 -03:00
Djordje Atlialp 27c69dc550
Merge pull request #23 from gabrielferreirapro/master
Add translations and support for pt-br.
2019-05-16 11:12:41 +02:00
Karan Sharma c116f7499a
fix: inline style for list 2019-05-09 01:07:21 +05:30
Gabriel Ferreira 09ceca5e39 Add translations and support for pt-br. 2019-05-05 13:38:55 -03:00
z0li e36f5799b3 Removed deprecated .Hugo and .RSSLink 2019-04-27 20:02:51 +02:00
Jimmy Zhang 6507ed7f85 Set correct theme color after page is loaded 2019-04-24 20:55:03 +08:00
Jimmy Zhang 5085524412 Better multilingual support: absURL -> absLangURL 2019-04-24 20:52:53 +08:00
Djordje Atlialp 6d12ec531f
Fix menu items are not clickable on smart devices sometimes 2019-04-22 21:04:37 +02:00
Djordje Atlialp bfb669f641
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 68577e24f1
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 e1616655a1 Added spanish support for flag and translation 2019-04-22 15:55:28 +02:00
Duncan Mackenzie cdf1cb3ac0 switching to RelPermalink instead of Permalink for JS and CSS files 2019-04-20 13:40:30 -07:00
Duncan Mackenzie 966286b96e Adding media query for reduced motion to turn off animation in that case 2019-04-20 13:19:52 -07:00
Duncan Mackenzie 15a62e764f
Merge pull request #1 from rhazdon/master
Pull in latest from upstream master
2019-04-20 12:58:19 -07:00
Vivek R dde7a0b154 fix: show 10 recent posts for exampleSite 2019-04-20 19:50:32 +05:30
Vivek R 1a96008c73 fix: minor theme.toml update and add images for hugo themes submission 2019-04-20 19:48:13 +05:30
Vivek R f8563dc36c
chore: updare credits in README 2019-04-20 14:31:13 +05:30
Vivek R 64732a09b1
chore: add demo url to README 2019-04-20 14:29:27 +05:30
Vivek R 4f855e9e1f
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 aee2001d81 Ensure spaces around span tag (#3) 2019-04-19 18:00:57 +02:00
Nicolas Martignoni af51ce46b5
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 2052f5f83a
Add main tag in homepage 2019-04-16 01:39:18 +02:00
Djordje Atlialp 1b3bb5eb85
Rename css in pipeline 2019-04-16 01:39:00 +02:00
Djordje Atlialp b38eec2bae
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 fb32addcaf
Minify assets 2019-04-15 23:14:06 +02:00
Djordje Atlialp c9915f47d1
Remove `resources` dir 2019-04-15 23:13:21 +02:00
Djordje Atlialp 8297040e33
Remove unused css 2019-04-15 23:11:21 +02:00
Djordje Atlialp 9a3f4f40d9
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 b9b2a70545
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 15c2e32940
Update usage documentation 2019-04-06 14:15:08 +02:00
Nicolas Martignoni 127ecb7e60
Add "class" parameter 2019-04-06 14:03:04 +02:00
Nicolas Martignoni d12c1f0364
Fix protocol scheme 2019-04-03 18:54:36 +02:00
Nicolas Martignoni e62294f6bb
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 7596045757
Minify js 2019-03-30 19:45:07 +01:00
Djordje Atlialp 62747aae63
Include prism.js again 2019-03-30 19:44:49 +01:00
Djordje Atlialp f7e1326806
Merge pull request #9 from metawave/master
remove unused source code pro font
2019-03-30 18:20:31 +01:00
Djordje Atlialp e08f9b64ef
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 a0fb96ec3b remove unused source code pro font 2019-03-25 14:02:43 +01:00
Duncan Mackenzie d699ec36e4
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 ab497e7221
Merge pull request #6 from Reijnn/Remove-Prism.js
Remove Prism.js
2019-03-16 00:57:45 +01:00
Reijnn 08bdf17d27 Remove Prism.js 2019-03-12 20:53:04 +01:00
Djordje Atlialp d29716197c
Merge pull request #3 from Reijnn/master
Added theme-color param for mobile devices
2019-03-05 18:50:58 +01:00
Reijnn 2f53ecf885 Fix empty description meta tag 2019-03-05 13:26:06 +01:00
Niels Reijn 26fafde0f5
Merge branch 'master' into master 2019-03-05 13:19:33 +01:00
Reijnn 22c42bbd5f theme-color now changes with site theme 2019-03-05 13:16:59 +01:00
Djordje Atlialp 64acb13aa4
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 4bb4bb00b4
feat: add ability to add custom css and js 2019-02-27 14:41:56 +00:00
Reijnn e35ede04c2 Update README.md to generate favicons 2019-02-27 12:54:16 +01:00
Reijnn f196a94f3d Added theme-color param for mobile devices 2019-02-27 12:46:39 +01:00
Djordje Atlialp f0bfed856f
Merge pull request #2 from Reijnn/master
Support for dutch language flag
2019-02-27 11:03:59 +01:00
Reijnn bd1634c05e Support for dutch language flag 2019-02-27 10:56:19 +01:00
Djordje Atlialp 3e42c47fd6
Merge pull request #1 from johnletey/pr/remove-extra-bracket
Remove extra bracket
2019-02-27 08:45:52 +01:00
John Letey ec3125bb1e
refactor(GitInfo): remove extra bracket 2019-02-27 07:02:08 +00:00
Djordje Atlialp d5d35340b0
Delete about-in-footer.md 2019-02-25 23:28:34 +01:00
Djordje Atlialp 9c7c6a7652
Exclude javascript parts into own file 2019-02-25 23:28:30 +01:00
Djordje Atlialp f1e0ff2fc1
Remove [menu.footer] 2019-02-25 23:27:44 +01:00
Djordje Atlialp a7dceab572
Add exampleSite 2019-02-25 10:31:15 +01:00
Djordje Atlialp 3fb95109d6
Add resources to theme 2019-02-22 19:21:59 +01:00
Djordje Atlialp cc81543114
Update footer.html 2019-02-22 16:42:33 +01:00
Djordje Atlialp bae3b85b1f
Add defaults for date things 2019-02-22 16:41:01 +01:00
Djordje Atlialp 4544e3c818
Add images 2019-02-22 16:40:34 +01:00
Djordje Atlialp f19aa9a5d1
Update footer.html 2019-02-22 16:11:46 +01:00
Djordje Atlialp 00020fb477
Update theme.toml 2019-02-22 16:11:42 +01:00
Djordje Atlialp f0143df51c
Update LICENSE.md 2019-02-22 15:53:47 +01:00
Djordje Atlialp bcd5f52e2c
Update head.html 2019-02-22 15:45:43 +01:00
Djordje Atlialp 22e36f853e
Update README.md 2019-02-22 15:24:17 +01:00
Djordje Atlialp 704ffcaed8
Update package.json 2019-02-22 15:22:22 +01:00
Djordje Atlialp 6d54735507
Delete webpack.config.js 2019-02-22 15:22:14 +01:00
Djordje Atlialp 14768f7c13
Use js generation from hugo instead of webpack 2019-02-22 15:22:10 +01:00
Djordje Atlialp b2d7367605
Delete hello.jpg 2019-02-22 15:21:50 +01:00
Djordje Atlialp 4f535bb006
Remove dir static/assets 2019-02-22 15:21:44 +01:00
Djordje Atlialp fdd4b8ec05
Move javascript files from dir source to assets 2019-02-22 15:21:13 +01:00
Djordje Atlialp 702e87ed7d
Move fonts from dir source to static 2019-02-22 15:20:41 +01:00
Djordje Atlialp c7bd4b4b97
Use the scss generation from hugo 2019-02-22 15:19:42 +01:00
Djordje Atlialp bd2a11d507
Move SCSS files from dir source to assets 2019-02-22 15:19:21 +01:00
Harsh Shandilya 6f99e443a1
Add instant.page support
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-02-20 14:14:41 +05:30
Harsh Shandilya 4523ef4279
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 9a71b4a2ec
Update README.md 2019-02-07 19:17:05 +01:00
Nicolas Martignoni c31606369c
Fix link 2019-02-06 08:27:27 +01:00
Nicolas Martignoni 33fd6e14a4
Added Awesome badge
- Thanks goes to @budparr for his curated list of Hugo resources.
2019-02-06 08:26:53 +01:00
Nicolas Martignoni 3566a36f5e
Create .gitignore file 2019-02-05 21:38:57 +01:00
Nicolas Martignoni 27b9c7408e
Add files to repository 2019-02-05 21:36:47 +01:00
Nicolas Martignoni 643ff54ce3
Initial commit 2019-02-05 21:35:37 +01:00
Djordje Atlialp cc4a8df347
Don not load prism.js/.css from cdn anymore 2019-02-04 14:44:49 +01:00
Djordje Atlialp c2aadd6fa3
Add prism 2019-02-04 14:31:32 +01:00
Djordje Atlialp e64403370d
Default single page also displays language flags 2019-02-03 01:36:24 +01:00
Djordje Atlialp d2318fc169
Update README.md 2019-02-02 21:03:48 +01:00
Djordje Atlialp dae2a88be5
Edit css 2019-02-02 21:02:26 +01:00
Djordje Atlialp 9b25438856
Add better support multi languages in menu 2019-02-02 21:02:02 +01:00
Djordje Atlialp 4b78ebe530
Add flag-icon.css 2019-02-02 21:00:56 +01:00
Djordje Atlialp d8440a0371
Add meta author tag 2019-02-02 21:00:40 +01:00
Djordje Atlialp 6924d5a69c
Create langFlags.yaml 2019-02-02 21:00:19 +01:00
Djordje Atlialp 7c958b1e6d
Remove pagination and reading infos from normal single pages 2019-02-02 21:00:12 +01:00
Djordje Atlialp ac471b32fc
Add extra single.html page for posts 2019-02-02 20:59:39 +01:00
Djordje Atlialp 9f48eb6245
Add translations and support for fr 2019-02-02 20:58:44 +01:00
Harsh Shandilya 18e438f133
WireGuard-KT is now Viscerion
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-02-03 00:49:21 +05:30
Djordje Atlialp dd97a04af1
Edit README.md 2019-01-28 02:12:43 +01:00
Djordje Atlialp de8e9e591e
Add comments flag to enable/disable comments per page 2019-01-28 02:12:09 +01:00
Djordje Atlialp 794340f536
Remove exampleSite 2019-01-28 02:11:38 +01:00
Djordje Atlialp 63c9a8ca44
Upload production ready js 2019-01-27 23:17:53 +01:00
Djordje Atlialp 1d942521c5
Edit theme.toml 2019-01-27 23:17:37 +01:00
Djordje Atlialp 8487fc40f4
Edit README.md 2019-01-27 23:17:21 +01:00
Djordje Atlialp 805c789ee9
The graat customizing ... 2019-01-27 23:02:55 +01:00
panr bb6fdc2493 Fix Head meta 2019-01-25 18:54:07 +01:00
panr 72e85173cf Change theme config 2019-01-25 18:30:24 +01:00
panr 5cfc6e4f29 Update meta for Hugo themes base 2019-01-25 16:49:30 +01:00
panr b0dfb769d1 Add contentTypeName to config 2019-01-25 10:21:14 +01:00
Harsh Shandilya 97ec16c145
Copy GPG key into website source
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-01-21 19:09:48 +05:30
Radek Kozieł 27a013b809
Update README.md 2019-01-21 08:54:54 +01:00
panr e0787f1e1d Add multilanguage support 2019-01-20 17:55:51 +01:00
Harsh Shandilya 8a0fc381e9
Add wahoo Caesium
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2019-01-14 11:57:58 +05:30
panr 62709b7219 Update README 2019-01-06 17:41:44 +01:00
panr fbeb2cdb8d Update README 2019-01-06 17:26:27 +01:00
panr 8a8961d965 Update readme 2019-01-06 12:01:12 +01:00
panr 2f3956252a Update screens 2019-01-06 11:59:15 +01:00
panr 6768efe286 Rebuild theme 2019-01-06 11:45:48 +01:00
panr 4a173c6320 Update and customize prism 2019-01-06 11:44:38 +01:00
panr 2ff92d6fdf Update theme for 2019 2019-01-06 11:23:25 +01:00
panr 563972fe5f Fix theme config 2019-01-06 10:25:03 +01:00
panr 4e00c93b25 Add bash/shell, toml and actionscript to highlighter 2018-12-29 17:05:55 +01:00
Radek Kozieł 0be2ed1438
Update README.md 2018-12-22 09:49:54 +01:00
panr 9532cb8285 Set default theme in config toml 2018-12-21 19:07:58 +01:00
Radek Kozieł 1974d30be0
Update README.md 2018-12-13 16:18:29 +01:00
panr aa1abb8fcd Add figure shortcode 2018-12-13 08:37:46 +01:00
panr 4845a3db96 Update font 2018-12-12 19:56:24 +01:00
panr 0a4730452c Add image shortcode 2018-12-12 19:55:37 +01:00
Harsh Shandilya e4a88df813
Add wireguard-kt privacy policy
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-12-03 11:43:47 +05:30
panr 7a9b33a9b1 Update Inter UI font to version 3.0 2018-11-16 12:39:16 +01:00
Radek Kozieł e0238c2510
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 8c50d74305
Link caesium to github
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-11-12 11:02:05 +05:30
Harsh Shandilya 57182b5765
Add GPG key
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-11-12 11:00:29 +05:30
Harsh Shandilya 1df30f2c5e
Update projects.md
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2018-10-19 10:24:38 +05:30
Sebastian Engels c0cdd0ea1b Add Quick Start Forestry Button to Readme.md 2018-10-18 16:35:12 +02:00
Harsh Shandilya 7a691b57c3
Re-do contact page
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-10-16 23:05:13 +05:30
Harsh Shandilya e5a49c17bf
Remove unused theme
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-10-16 22:55:52 +05:30
Harsh Shandilya 7574b4bda9
Switch to hugo-coder-portfolio
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-10-16 22:55:40 +05:30
Manu Hortet afea4aa256
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ł ac82c83a64
Merge pull request #9 from juicemia/fix-favicon-path
Fix bug in favicon path
2018-09-18 00:44:37 +02:00
Hugo Torres 781a8f21d6 Fix bug in favicon path 2018-09-09 19:56:43 -04:00
panr 1f96e0f3d9 Add Haskel and other languages & fix menu item margin 2018-09-07 23:05:49 +02:00
panr 6a65821ab8 Merge 2018-09-04 09:18:53 +02:00
panr 12684791f8 Fix code copy button styling 2018-09-04 09:16:52 +02:00
Radek Kozieł 839f1ded1c
Merge pull request #8 from marioblokland/fix_code_uppercase
Prevent uppercase transformation of code
2018-09-04 09:05:00 +02:00
Mario Blokland 37e6fba1bd 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 c974919076 Prevent uppercase transformation of code 2018-09-03 21:14:57 +02:00
panr f9f276852e Fix logoText variable & prevent code text transform 2018-09-03 09:10:12 +02:00
Radek Kozieł 3864783204
Update README.md 2018-09-02 11:49:36 +02:00
panr 327234163d Fix code highlighting & allow to edit hello-friend logo text fron config file 2018-08-30 23:28:52 +02:00
Sorin Davidoi 932d5322bf fix(layouts/single): Use <time> 2018-08-29 19:37:49 +02:00
Sorin Davidoi 36d41b09cf fix(layouts/index): Use <time> and <article> 2018-08-29 19:37:35 +02:00
Sorin Davidoi 482d8e6016 fix(layouts/list): Add datetime attribute to <time> 2018-08-29 19:37:17 +02:00
Sorin Davidoi 9bb31d6aed 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 6f03ab3055 fix(partials/sidebar): Use more semantic elements 2018-08-27 21:56:32 +02:00
Sorin Davidoi 92610430fa 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 046a3940f1 Add compiled files 2018-08-24 09:42:15 +02:00
panr a8b843adb8 New Version - 1.0.1 — Set dark theme as default & fix eslint 2018-08-24 09:37:55 +02:00
panr b442ae90c9 Fix examplePage config.toml and edit Readme 2018-08-23 23:58:22 +02:00
panr e181f8a888 Fix margin in pre code 2018-08-21 13:28:58 +02:00
Harsh Shandilya cf25dddef1
Fix typo in G+ link
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-08-11 02:30:24 +05:30
Matt Smith 72d4bdf488 Fix for mixed insecure content 2018-08-07 22:14:33 +02:00
panr c287d992dc Update date format 2018-07-30 19:03:01 +02:00
panr 0c2967146e Update styles 2018-07-30 18:56:21 +02:00
panr ea9e2bb1bd Fix footer credentials and date format 2018-07-30 18:55:26 +02:00
Harsh Shandilya be5c4ba4bd
Update FontAwesome
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-27 20:55:11 +05:30
panr da992ae333 Update Webpack config 2018-07-25 16:31:54 +02:00
panr 68927868a0 Fix menu trigger appearance 2018-07-25 00:37:54 +02:00
panr 9a4e3132e2 Fix menu script 2018-07-25 00:35:03 +02:00
panr 4dd1f16df6 Add possibility to set up your own logotype in config 2018-07-25 00:28:34 +02:00
panr 706c78ae07 Add assets 2018-07-24 23:40:26 +02:00
panr 12669e73a1 Add minor fixes (buttons, headers) 2018-07-24 23:35:46 +02:00
panr a6522f0c89 Upload assets 2018-07-24 19:52:45 +02:00
panr 2149d34090 Fix README.md 2018-07-24 19:37:10 +02:00
panr 56b5fbf024 Fix post meta 2018-07-24 19:35:24 +02:00
panr 481f92a54f Change and move browserlist settings to package.json 2018-07-24 01:05:31 +02:00
panr ee72421ecb Fix Webpack, PostCSS and related configs 2018-07-23 20:55:40 +02:00
Radek Kozieł cc7f434e0f
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 0d0e889b38
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 dda4a5f5a3
Add a fresh 404 page
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 16:43:29 +05:30
Harsh Shandilya ca3902d232
Caddyfile: Fix hugo plugin
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 10:45:08 +00:00
Harsh Shandilya 1f964a20c6
Switch to https
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 10:33:19 +00:00
Harsh Shandilya 7b96a71c8b
Add Caddyfile
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-19 10:33:10 +00:00
Harsh Shandilya e16975e62a
Rename publish script to deploy.sh
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-17 03:43:19 +05:30
Harsh Shandilya e983a60f4c
Update
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-17 03:42:53 +05:30
Harsh Shandilya e8bb57d543
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 4ef04796fb
Fix typo
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-07-16 22:40:03 +05:30
Harsh Shandilya ade3512696
content: Fixup wording
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 18:26:20 +05:30
Harsh Shandilya 881f6d91ee
src: Add publish script
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:49:00 +05:30
Harsh Shandilya 047acc486b
src: Add downloads link
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:44:16 +05:30
Harsh Shandilya 2470d7be3d
src: Add projects page
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:42:04 +05:30
Harsh Shandilya bf222d9a01
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 9d954fe7c4
src: Remove unused theme
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:26:50 +05:30
Harsh Shandilya 5473e2940f
Update
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-06-14 16:22:54 +05:30
Bjørn Erik Pedersen 8cab2d27e2
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 067543bcdb
config: Fall back to old intro
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
2018-02-07 01:45:12 +05:30
Harsh Shandilya e291a736cd
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 8f360b6fcf
404 : Remove footer 2017-01-26 15:36:33 +05:30
Harsh Shandilya 27fae4e5b0
Add in a cheeky 404 page :') 2017-01-26 15:07:05 +05:30
Harsh Shandilya b8188c2944
Optimise SEO 2017-01-15 20:08:24 +05:30
Harsh Shandilya dcbf321994
unminify css, improve icon sizes and color schemas 2017-01-15 19:59:27 +05:30
Harsh Shandilya cc86aedbf0
cleanup 2017-01-15 03:35:44 +05:30
Harsh Shandilya a6da395ed9
new theme 2017-01-15 03:32:31 +05:30
Harsh Shandilya 1e131bb006
Fix OCD padding 2017-01-15 02:49:23 +05:30
Harsh Shandilya f7430b2e98
Keep avatar image hosted within the site 2016-12-11 01:42:54 +05:30
Harsh Shandilya fd6ec8703f
Remove old theme and nix example site
Also added some SEO stuff
2016-12-09 10:06:17 +05:30
Harsh Shandilya ff72746042 Let's Linux, eh? 2016-12-08 00:25:39 -06:00
Harsh Shandilya dafaea8219 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 f2b0f4ea4a Some Google specific tuning
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-11-11 22:54:34 +05:30
Harsh Shandilya 4fc312df81 Woops 2016-11-09 13:12:38 +05:30
Harsh Shandilya dd19c08fad
Try out netlify's form submissions
Signed-off-by: Harsh Shandilya <msfjarvis@gmail.com>
2016-11-08 18:09:43 +05:30
Harsh Shandilya d479cc1802
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
245 changed files with 6540 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: 971 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 MiB

View File

@ -0,0 +1,70 @@
+++
categories = ["april-cools"]
date = 2024-04-01
summary = "The history of my Minecraft adventures as told by my screenshots folder"
draft = true
slug = "a-tour-of-my-screenshots-folder"
tags = ["april-cools", "minecraft"]
title = "A tour of my screenshots folder"
+++
## Preface
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="" 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">}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 MiB

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!

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