From e5d94e37a6de852c5c4938996b4b90cd6b5a64ac Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 18:38:35 -0400 Subject: [PATCH 01/17] Create a Gemfile --- Gemfile | 10 +++ Gemfile.lock | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+) create mode 100644 Gemfile create mode 100644 Gemfile.lock diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..50579a5 --- /dev/null +++ b/Gemfile @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +gem "jekyll", "~> 4.4" +gem "jekyll-last-modified-at", git: "https://github.com/maximevaillancourt/jekyll-last-modified-at", branch: "add-support-for-files-in-git-submodules" +gem "webrick", "~> 1.9" +gem "nokogiri" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..cf43fc6 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,226 @@ +GIT + remote: https://github.com/maximevaillancourt/jekyll-last-modified-at + revision: b7f1164861ba589660af3dc096dcbdff75d67145 + branch: add-support-for-files-in-git-submodules + specs: + jekyll-last-modified-at (1.3.2) + jekyll (>= 3.7, < 5.0) + +GEM + remote: https://rubygems.org/ + specs: + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + base64 (0.3.0) + bigdecimal (4.1.2) + colorator (1.1.0) + concurrent-ruby (1.3.8) + csv (3.3.6) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + forwardable-extended (2.6.0) + google-protobuf (4.35.1) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-aarch64-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-linux-musl) + bigdecimal + rake (~> 13.3) + http_parser.rb (0.8.1) + i18n (1.15.2) + concurrent-ruby (~> 1.0) + jekyll (4.4.1) + addressable (~> 2.4) + base64 (~> 0.2) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3, >= 0.3.6) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-watch (2.2.1) + listen (~> 3.0) + json (2.21.2) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.10.0) + logger + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + mercenary (0.4.0) + nokogiri (1.19.4-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-musl) + racc (~> 1.4) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (7.0.5) + racc (1.8.1) + rake (13.4.2) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (4.7.0) + safe_yaml (1.0.5) + sass-embedded (1.102.0-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-x86_64-linux-musl) + google-protobuf (~> 4.31) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.6.0) + webrick (1.9.2) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + jekyll (~> 4.4) + jekyll-last-modified-at! + nokogiri + webrick (~> 1.9) + +CHECKSUMS + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd + bundler (4.0.13) sha256=19f08be7f27022cf0b89f27da0b044ae075e8270a9ef44ad248a932614e1ca3b + colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 + csv (3.3.6) sha256=aba61e7e507a66f03d45cb1f3c4b6359861c3504038b422962875dce099e4456 + em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8 + eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 + ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df + ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39 + ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 + ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 + ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 + ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d + ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97 + google-protobuf (4.35.1) sha256=a3a6471331d918f58dfa4d014a8f6286f0af2cf4840216bde52fcf2ea3fe3726 + google-protobuf (4.35.1-aarch64-linux-gnu) sha256=50ca44d0eeff3f8475e630a1accdd974256f3510694d574e2c9d6119ea8bc9e1 + google-protobuf (4.35.1-aarch64-linux-musl) sha256=d5c65cef6bd6498a9e5ed5f88cf6cf7e341c10b0a005e32137d5d1a2b6e8c18a + google-protobuf (4.35.1-arm64-darwin) sha256=d9c957df04fa89c749fa9a72a7b383eb4296efc9b2303dc6fd6fbe39c698ad6b + google-protobuf (4.35.1-x86_64-darwin) sha256=66b62b4df00931018a692806df66393efa960d6d2b7da69735187249f950d3ee + google-protobuf (4.35.1-x86_64-linux-gnu) sha256=c786439087512a3fbd199e9897d265b855f951d4027e218ea55e858d45969edd + google-protobuf (4.35.1-x86_64-linux-musl) sha256=91890eb0002934a339fdb7d77a147c46b7474b6799db27872b747b905837f744 + http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a + i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 + jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1 + jekyll-last-modified-at (1.3.2) + jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443 + jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1 + json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3 + listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138 + nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f + nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af + nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca + nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb + nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 + nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 + nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a + nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b + pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe + rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848 + sass-embedded (1.102.0-aarch64-linux-gnu) sha256=087f377fa4135a8f67f5f422781b59815e99b8fd3aec335935c50a47c2a205fd + sass-embedded (1.102.0-aarch64-linux-musl) sha256=12bb4091972499241c35304ca11ca2c314764badf1b9933a8d437ba62432b538 + sass-embedded (1.102.0-arm-linux-gnueabihf) sha256=566b1188e4f923366f494a5d95e4e5e03864ae55bae5ea52beb2c30b1b9e2915 + sass-embedded (1.102.0-arm-linux-musleabihf) sha256=1ca396610bf4f4aa8f849b67a9f2720f67d9f3b42651072eafee786aece314cf + sass-embedded (1.102.0-arm64-darwin) sha256=8e18b2dd94b232c2dd73984c579f77bbc1a066028f4675c8989ac34fa40d14dc + sass-embedded (1.102.0-x86_64-darwin) sha256=3e78c6ac5be0ba4236d075bd044a49d0f515d54799f7d6f253c71d325ffedac0 + sass-embedded (1.102.0-x86_64-linux-gnu) sha256=9815b7604123a9a44a65d44d5e58e7af1c7005174b745cda83bad4c9e3760ab3 + sass-embedded (1.102.0-x86_64-linux-musl) sha256=9e3c15eb5d83784adf3b946d4fc5d8a32aed25566a2fee939f25dd1e1d217ddf + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 + +BUNDLED WITH + 4.0.13 From e90ac9fe79cb10aaaf3704325638c56629bee297 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 19:22:20 -0400 Subject: [PATCH 02/17] Add a Jekyll configuration with the notes collection --- _config.yml | 4 ++++ _notes/test.md | 6 ++++++ notes.html | 23 ----------------------- 3 files changed, 10 insertions(+), 23 deletions(-) create mode 100644 _config.yml create mode 100644 _notes/test.md delete mode 100644 notes.html diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..3f2e05a --- /dev/null +++ b/_config.yml @@ -0,0 +1,4 @@ +collections: + notes: + output: true + permalink: /:slug/ diff --git a/_notes/test.md b/_notes/test.md new file mode 100644 index 0000000..c3f2bd7 --- /dev/null +++ b/_notes/test.md @@ -0,0 +1,6 @@ +--- +title: "Hello World" +layout: default +--- + +Hello World diff --git a/notes.html b/notes.html deleted file mode 100644 index e185039..0000000 --- a/notes.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Notes" -layout: default ---- - -

Notes

- -

I've moved publishing to my [Substack](https://bchendev.substack.com?utm_source=bchen.dev). For reference, old notes remain accessible here.

- -

- -{% assign posts_by_month = site.posts | group_by_exp: "post", "post.date | date: '%B %Y'" %} -{% for month in posts_by_month %} -

{{ month.name }}

- -{% endfor %} From 3a2ae757c032aeb48b948b823e77086dcab3b6e1 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 19:51:44 -0400 Subject: [PATCH 03/17] Add additional configuration options --- _config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/_config.yml b/_config.yml index 3f2e05a..8a70d9d 100644 --- a/_config.yml +++ b/_config.yml @@ -1,3 +1,11 @@ +plugins: + - jekyll-last-modified-at + +open_external_links_in_new_tab: true +use_html_extension: false +permalink: pretty +relative_permalinks: false + collections: notes: output: true From ea77e8f02a81fc8d60a91e132b88331d219c5c12 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 19:53:22 -0400 Subject: [PATCH 04/17] Copy over the plugins --- .gitignore | 1 + _notes/test.md | 2 + _plugins/bidirectional_links_generator.rb | 111 +++++++++++++++++++ _plugins/empty_front_matter_note_injector.rb | 18 +++ _plugins/last_modified_at_generator.rb | 18 +++ _plugins/markdown-highlighter.rb | 18 +++ _plugins/open_external_links_in_new_tab.rb | 28 +++++ 7 files changed, 196 insertions(+) create mode 100644 _plugins/bidirectional_links_generator.rb create mode 100644 _plugins/empty_front_matter_note_injector.rb create mode 100644 _plugins/last_modified_at_generator.rb create mode 100644 _plugins/markdown-highlighter.rb create mode 100644 _plugins/open_external_links_in_new_tab.rb diff --git a/.gitignore b/.gitignore index 1a35b77..54f682b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ vendor/ # macOS .DS_Store +/_includes/notes_graph.json diff --git a/_notes/test.md b/_notes/test.md index c3f2bd7..d1e1dd7 100644 --- a/_notes/test.md +++ b/_notes/test.md @@ -4,3 +4,5 @@ layout: default --- Hello World + +==This is some highlighted text== diff --git a/_plugins/bidirectional_links_generator.rb b/_plugins/bidirectional_links_generator.rb new file mode 100644 index 0000000..78184b5 --- /dev/null +++ b/_plugins/bidirectional_links_generator.rb @@ -0,0 +1,111 @@ +# frozen_string_literal: true +class BidirectionalLinksGenerator < Jekyll::Generator + def generate(site) + graph_nodes = [] + graph_edges = [] + + all_notes = site.collections['notes'].docs + all_pages = site.pages + + all_docs = all_notes + all_pages + + link_extension = !!site.config["use_html_extension"] ? '.html' : '' + + # Convert all Wiki/Roam-style double-bracket link syntax to plain HTML + # anchor tag elements () with "internal-link" CSS class + all_docs.each do |current_note| + all_docs.each do |note_potentially_linked_to| + note_title_regexp_pattern = Regexp.escape( + File.basename( + note_potentially_linked_to.basename, + File.extname(note_potentially_linked_to.basename) + ) + ).gsub('\_', '[ _]').gsub('\-', '[ -]').capitalize + + title_from_data = note_potentially_linked_to.data['title'] + if title_from_data + title_from_data = Regexp.escape(title_from_data) + end + + new_href = "#{site.baseurl}#{note_potentially_linked_to.url}#{link_extension}" + anchor_tag = "\\1" + + # Replace double-bracketed links with label using note title + # [[A note about cats|this is a link to the note about cats]] + current_note.content.gsub!( + /\[\[#{note_title_regexp_pattern}\|(.+?)(?=\])\]\]/i, + anchor_tag + ) + + # Replace double-bracketed links with label using note filename + # [[cats|this is a link to the note about cats]] + current_note.content.gsub!( + /\[\[#{title_from_data}\|(.+?)(?=\])\]\]/i, + anchor_tag + ) + + # Replace double-bracketed links using note title + # [[a note about cats]] + current_note.content.gsub!( + /\[\[(#{title_from_data})\]\]/i, + anchor_tag + ) + + # Replace double-bracketed links using note filename + # [[cats]] + current_note.content.gsub!( + /\[\[(#{note_title_regexp_pattern})\]\]/i, + anchor_tag + ) + end + + # At this point, all remaining double-bracket-wrapped words are + # pointing to non-existing pages, so let's turn them into disabled + # links by greying them out and changing the cursor + current_note.content = current_note.content.gsub( + /\[\[([^\]]+)\]\]/i, # match on the remaining double-bracket links + <<~HTML.delete("\n") # replace with this HTML (\\1 is what was inside the brackets) + + [[ + \\1 + ]] + HTML + ) + end + + # Identify note backlinks and add them to each note + all_notes.each do |current_note| + # Nodes: Jekyll + notes_linking_to_current_note = all_notes.filter do |e| + e.url != current_note.url && e.content.include?(current_note.url) + end + + # Nodes: Graph + graph_nodes << { + id: note_id_from_note(current_note), + path: "#{site.baseurl}#{current_note.url}#{link_extension}", + label: current_note.data['title'], + } unless current_note.path.include?('_notes/index.html') + + # Edges: Jekyll + current_note.data['backlinks'] = notes_linking_to_current_note + + # Edges: Graph + notes_linking_to_current_note.each do |n| + graph_edges << { + source: note_id_from_note(n), + target: note_id_from_note(current_note), + } + end + end + + File.write('_includes/notes_graph.json', JSON.dump({ + edges: graph_edges, + nodes: graph_nodes, + })) + end + + def note_id_from_note(note) + note.data['title'].bytes.join + end +end diff --git a/_plugins/empty_front_matter_note_injector.rb b/_plugins/empty_front_matter_note_injector.rb new file mode 100644 index 0000000..83fd4b2 --- /dev/null +++ b/_plugins/empty_front_matter_note_injector.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +EMPTY_FRONT_MATTER = <<~JEKYLL + --- + --- + +JEKYLL + +# Inject empty front matter in notes that don't have any +Jekyll::Hooks.register :site, :after_init do |site| + Dir.glob(site.collections['notes'].relative_directory + '/**/*.md').each do |filename| + raw_note_content = File.read(filename) + unless raw_note_content.start_with?('---') + raw_note_content.prepend(EMPTY_FRONT_MATTER) + File.write(filename, raw_note_content) + end + end +end diff --git a/_plugins/last_modified_at_generator.rb b/_plugins/last_modified_at_generator.rb new file mode 100644 index 0000000..ea9b1f4 --- /dev/null +++ b/_plugins/last_modified_at_generator.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require 'fileutils' +require 'pathname' +require 'jekyll-last-modified-at' + +module Recents + # Generate change information for all markdown pages + class Generator < Jekyll::Generator + def generate(site) + items = site.collections['notes'].docs + items.each do |page| + timestamp = Jekyll::LastModifiedAt::Determinator.new(site.source, page.path, '%FT%T%:z').to_s + page.data['last_modified_at_timestamp'] = timestamp + end + end + end +end diff --git a/_plugins/markdown-highlighter.rb b/_plugins/markdown-highlighter.rb new file mode 100644 index 0000000..2ef933c --- /dev/null +++ b/_plugins/markdown-highlighter.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +# Turns ==something== in Markdown to something in output HTML + +Jekyll::Hooks.register [:notes], :pre_render do |doc| + replace(doc) +end + +Jekyll::Hooks.register [:pages], :pre_render do |doc| + # jekyll considers anything at the root as a page, + # we only want to consider actual pages + next unless doc.path.start_with?('_pages/') + replace(doc) +end + +def replace(doc) + doc.content.gsub!(/==+([^ ](.*?)?[^ .=])==+/, "\\1") +end diff --git a/_plugins/open_external_links_in_new_tab.rb b/_plugins/open_external_links_in_new_tab.rb new file mode 100644 index 0000000..8f966c5 --- /dev/null +++ b/_plugins/open_external_links_in_new_tab.rb @@ -0,0 +1,28 @@ +# If the configuration sets `open_external_links_in_new_tab` to a truthy value, +# add 'target=_blank' to anchor tags that don't have `internal-link` class + +# frozen_string_literal: true +require 'nokogiri' + +Jekyll::Hooks.register [:notes], :post_convert do |doc| + convert_links(doc) +end + +Jekyll::Hooks.register [:pages], :post_convert do |doc| + # jekyll considers anything at the root as a page, + # we only want to consider actual pages + next unless doc.path.start_with?('_pages/') + convert_links(doc) +end + +def convert_links(doc) + open_external_links_in_new_tab = !!doc.site.config["open_external_links_in_new_tab"] + + if open_external_links_in_new_tab + parsed_doc = Nokogiri::HTML::DocumentFragment.parse(doc.content) + parsed_doc.css("a:not(.internal-link):not(.footnote):not(.reversefootnote)").each do |link| + link.set_attribute('target', '_blank') + end + doc.content = parsed_doc.inner_html + end +end From b8a1a1401874b0bbf38c37eeb63e5048ed84e837 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 19:57:32 -0400 Subject: [PATCH 05/17] Fix infinite regeneration of the graph --- _config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_config.yml b/_config.yml index 8a70d9d..3e19981 100644 --- a/_config.yml +++ b/_config.yml @@ -1,3 +1,5 @@ +exclude: [ '_includes/notes_graph.json' ] + plugins: - jekyll-last-modified-at From 98ec1e8b479beb037824df6a7f3f289541bf05bd Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 19:57:39 -0400 Subject: [PATCH 06/17] Add attribution incl. copy of MIT license --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index f9a19d0..49d3189 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,16 @@ # brendan-ch.github.io This is my personal webpage built using Jekyll and GitHub Pages. + +It is based on the [digital-garden-jekyll-template](https://github.com/maximevaillancourt/digital-garden-jekyll-template) by Maxime +Vaillancourt. The MIT license of the project: + +``` +Copyright (c) 2020 Maxime Vaillancourt. + +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. +``` From ad646e4dfaac7ef16fe578416b031bd25d9ec395 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 20:04:52 -0400 Subject: [PATCH 07/17] Add the backlink and the note layout --- _config.yml | 6 ++++++ _layouts/note.html | 18 ++++++++++++++++++ _notes/test-2.md | 5 +++++ _notes/test.md | 1 - 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 _layouts/note.html create mode 100644 _notes/test-2.md diff --git a/_config.yml b/_config.yml index 3e19981..655501c 100644 --- a/_config.yml +++ b/_config.yml @@ -12,3 +12,9 @@ collections: notes: output: true permalink: /:slug/ + +defaults: + - scope: + path: "_notes/**/*.md" + values: + layout: "note" diff --git a/_layouts/note.html b/_layouts/note.html new file mode 100644 index 0000000..5b1d317 --- /dev/null +++ b/_layouts/note.html @@ -0,0 +1,18 @@ +--- +layout: default +--- + +{{ content }} + +
+ {% if page.backlinks.size > 0 %} +

Notes mentioning this note

+
+ {% for backlink in page.backlinks %} + + {% endfor %} +
+ {% endif %} +
diff --git a/_notes/test-2.md b/_notes/test-2.md new file mode 100644 index 0000000..a422a48 --- /dev/null +++ b/_notes/test-2.md @@ -0,0 +1,5 @@ +--- +title: "Another note" +--- + +[[test]] \ No newline at end of file diff --git a/_notes/test.md b/_notes/test.md index d1e1dd7..d3081cd 100644 --- a/_notes/test.md +++ b/_notes/test.md @@ -1,6 +1,5 @@ --- title: "Hello World" -layout: default --- Hello World From 73c076dc7151e156d24867c94c2c7a48910ebdce Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 20:27:52 -0400 Subject: [PATCH 08/17] Migrate projects to the new format --- _layouts/note.html | 2 ++ _layouts/page_moved.html | 6 +++++ .../index.md => _notes/cmes-mobile.md | 3 +-- .../index.md => _notes/dont-wake-sandie.md | 1 - .../index.md => _notes/interchange.md | 3 +-- .../index.md => _notes/power-to-the-people.md | 3 +-- projects/index.md => _notes/projects.md | 21 ++++++++---------- .../resonance/index.md => _notes/resonance.md | 3 +-- .../index.md => _notes/sourcebook.md | 3 +-- .../tad-pool/index.md => _notes/tad-pool.md | 3 +-- .../teech-ai-cal-hacks-12.md | 1 - _notes/test-2.md | 5 ----- _notes/test.md | 7 ------ .../the-farmers-dog-trivia.md | 3 +-- .../timestamp/index.md => _notes/timestamp.md | 5 ++--- .../assets => assets}/app-store-icon.svg | 0 .../projects}/cmes-mobile-app.png | Bin .../projects}/farmers-dog.png | Bin .../projects}/interchange-screenshots.png | Bin .../projects}/power-to-the-people.png | Bin .../projects}/resonance-screenshot.png | Bin .../assets => assets/projects}/sourcebook.png | Bin .../assets => assets/projects}/tad-pool.png | Bin .../projects}/timestamp-screenshot.png | Bin projects/cmes-mobile.md | 5 +++++ projects/dont-wake-sandie.md | 5 +++++ projects/interchange.md | 5 +++++ projects/power-to-the-people.md | 5 +++++ projects/resonance.md | 5 +++++ projects/sourcebook.md | 5 +++++ projects/tad-pool.md | 5 +++++ projects/teech-ai-cal-hacks-12.md | 5 +++++ projects/the-farmers-dog-trivia.md | 5 +++++ projects/timestamp.md | 6 +++++ 34 files changed, 77 insertions(+), 43 deletions(-) create mode 100644 _layouts/page_moved.html rename projects/cmes-mobile/index.md => _notes/cmes-mobile.md (89%) rename projects/dont-wake-sandie/index.md => _notes/dont-wake-sandie.md (98%) rename projects/interchange/index.md => _notes/interchange.md (84%) rename projects/power-to-the-people/index.md => _notes/power-to-the-people.md (90%) rename projects/index.md => _notes/projects.md (68%) rename projects/resonance/index.md => _notes/resonance.md (94%) rename projects/sourcebook/index.md => _notes/sourcebook.md (82%) rename projects/tad-pool/index.md => _notes/tad-pool.md (90%) rename projects/teech-ai-cal-hacks-12/index.md => _notes/teech-ai-cal-hacks-12.md (99%) delete mode 100644 _notes/test-2.md delete mode 100644 _notes/test.md rename projects/the-farmers-dog-trivia/index.md => _notes/the-farmers-dog-trivia.md (92%) rename projects/timestamp/index.md => _notes/timestamp.md (70%) rename {projects/assets => assets}/app-store-icon.svg (100%) rename {projects/cmes-mobile/assets => assets/projects}/cmes-mobile-app.png (100%) rename {projects/the-farmers-dog-trivia/assets => assets/projects}/farmers-dog.png (100%) rename {projects/interchange/assets => assets/projects}/interchange-screenshots.png (100%) rename {projects/power-to-the-people/assets => assets/projects}/power-to-the-people.png (100%) rename {projects/resonance/assets => assets/projects}/resonance-screenshot.png (100%) rename {projects/sourcebook/assets => assets/projects}/sourcebook.png (100%) rename {projects/tad-pool/assets => assets/projects}/tad-pool.png (100%) rename {projects/timestamp/assets => assets/projects}/timestamp-screenshot.png (100%) create mode 100644 projects/cmes-mobile.md create mode 100644 projects/dont-wake-sandie.md create mode 100644 projects/interchange.md create mode 100644 projects/power-to-the-people.md create mode 100644 projects/resonance.md create mode 100644 projects/sourcebook.md create mode 100644 projects/tad-pool.md create mode 100644 projects/teech-ai-cal-hacks-12.md create mode 100644 projects/the-farmers-dog-trivia.md create mode 100644 projects/timestamp.md diff --git a/_layouts/note.html b/_layouts/note.html index 5b1d317..6305734 100644 --- a/_layouts/note.html +++ b/_layouts/note.html @@ -2,6 +2,8 @@ layout: default --- +

{{ page.title }}

+ {{ content }}
diff --git a/_layouts/page_moved.html b/_layouts/page_moved.html new file mode 100644 index 0000000..1690523 --- /dev/null +++ b/_layouts/page_moved.html @@ -0,0 +1,6 @@ +--- +layout: default +--- + +

Page moved

+

This page has been moved. {{ content }}

\ No newline at end of file diff --git a/projects/cmes-mobile/index.md b/_notes/cmes-mobile.md similarity index 89% rename from projects/cmes-mobile/index.md rename to _notes/cmes-mobile.md index a8de11c..94dd493 100644 --- a/projects/cmes-mobile/index.md +++ b/_notes/cmes-mobile.md @@ -1,9 +1,8 @@ --- title: CMES Mobile App -layout: project --- -![cmes-mobile-app.png](assets/cmes-mobile-app.png "Screenshots of the CMES app, showing the My Library screen and a web view.") +![cmes-mobile-app.png](../assets/projects/cmes-mobile-app.png "Screenshots of the CMES app, showing the My Library screen and a web view.") **App development project for volunteer organization Techies Without Borders.** I helped implement the CMES mobile app, facilitating the download, viewing and playback of medical education content in resource-constrained countries. diff --git a/projects/dont-wake-sandie/index.md b/_notes/dont-wake-sandie.md similarity index 98% rename from projects/dont-wake-sandie/index.md rename to _notes/dont-wake-sandie.md index bc9fa0d..0e01427 100644 --- a/projects/dont-wake-sandie/index.md +++ b/_notes/dont-wake-sandie.md @@ -1,6 +1,5 @@ --- title: Don't Wake Sandie -layout: project --- diff --git a/projects/interchange/index.md b/_notes/interchange.md similarity index 84% rename from projects/interchange/index.md rename to _notes/interchange.md index 8eb6000..6c8cce2 100644 --- a/projects/interchange/index.md +++ b/_notes/interchange.md @@ -1,9 +1,8 @@ --- title: Interchange -layout: project --- -![interchange-screenshots.png](assets/interchange-screenshots.png "Screenshots of Interchange.") +![interchange-screenshots.png](../assets/projects/interchange-screenshots.png "Screenshots of Interchange.") **An iOS app for college transit, currently available for Chapman University.** View routes, shuttle locations, and estimated arrival times in a sleek, diff --git a/projects/power-to-the-people/index.md b/_notes/power-to-the-people.md similarity index 90% rename from projects/power-to-the-people/index.md rename to _notes/power-to-the-people.md index 1530321..1702c06 100644 --- a/projects/power-to-the-people/index.md +++ b/_notes/power-to-the-people.md @@ -1,9 +1,8 @@ --- title: Power to the People -layout: project --- -![power-to-the-people.png](assets/power-to-the-people.png "Screenshots of Power to the People, an iOS app designed to make traffic stops safer.") +![power-to-the-people.png](../assets/projects/power-to-the-people.png "Screenshots of Power to the People, an iOS app designed to make traffic stops safer.") **An iPhone app designed to make traffic stops safer for marginalized communities.** Record interactions with police, assign and text emergency contacts, and be informed of your rights. I worked in a student team of 4, including [David Sohn](https://www.linkedin.com/in/sohn-david/), [Jacob Zamore](https://www.linkedin.com/in/jacob-zamore/), and [Patrick Smith](https://www.linkedin.com/in/patrick-smith-ld/), to prototype and build a proof of concept in 36 hours. The app was selected for the **President's Pick award** at [CruzHacks 2024](https://cruzhacks.com/), the premier hackathon of UC Santa Cruz. diff --git a/projects/index.md b/_notes/projects.md similarity index 68% rename from projects/index.md rename to _notes/projects.md index 24bd440..402b477 100644 --- a/projects/index.md +++ b/_notes/projects.md @@ -1,42 +1,39 @@ --- title: Projects -layout: default --- -# Projects - ## Games -- [Resonance](/projects/resonance) +- [[Resonance]] - **IEEE GameSig Finalist**, 2026 - A cyberpunk-themed game show shooter. -- [Don't Wake Sandie](/projects/dont-wake-sandie) +- [[Don't Wake Sandie]] - A game about not waking up a beloved hungover corgi ## Personal -- [Interchange](/projects/interchange) +- [[Interchange]] - An iOS app for college transit, now on the App Store! -- [Timestamp](/projects/timestamp) +- [[Timestamp]] - An unintrusive, open source Pomodoro timer for macOS. -- [Sourcebook](/projects/sourcebook) +- [[Sourcebook]] - A lightweight content management system (CMS) for class websites. ## Hackathons -- [teech.ai](/projects/teech-ai-cal-hacks-12) +- [[teech.ai]] - Cal Hacks 12.0 - A tutoring app to make education more accessible, built with SwiftUI and Gemini Vision API. -- [Power to the People](/projects/power-to-the-people) +- [[Power to the People]] - **President's Pick**, CruzHacks 2024 - An iOS app designed to make traffic stops safer for marginalized communities. ## Work -- [The Farmer's Dog Trivia Game](/projects/the-farmers-dog-trivia) +- [[The Farmer's Dog Trivia Game]] - A Windows kiosk application designed to connect customers with the Farmer's Dog experience. ## Community -- [CMES Mobile App](/projects/cmes-mobile/) +- [[CMES Mobile App]] - One of my earliest projects. A cross-platform mobile app to deliver educational medical content to end users, part of [Techies Without Borders](https://techieswithoutborders.us/). diff --git a/projects/resonance/index.md b/_notes/resonance.md similarity index 94% rename from projects/resonance/index.md rename to _notes/resonance.md index 9e275cd..f827481 100644 --- a/projects/resonance/index.md +++ b/_notes/resonance.md @@ -1,9 +1,8 @@ --- title: Resonance -layout: project --- -![resonance-screenshot.png](assets/resonance-screenshot.png "Screenshot of Resonance") +![resonance-screenshot.png](../assets/projects/resonance-screenshot.png "Screenshot of Resonance") Resonance is a cyberpunk-themed game show shooter. Enter the arena, blast your opponents, and become the star of the show. I worked with a student team of 12 to create this game over multiple months. The game was selected as an **IEEE GameSig finalist**. diff --git a/projects/sourcebook/index.md b/_notes/sourcebook.md similarity index 82% rename from projects/sourcebook/index.md rename to _notes/sourcebook.md index 8f3d544..a497f1f 100644 --- a/projects/sourcebook/index.md +++ b/_notes/sourcebook.md @@ -1,9 +1,8 @@ --- title: Sourcebook -layout: project --- -![sourcebook.png](assets/sourcebook.png "Screenshot of Sourcebook, a lightweight CMS for class websites.") +![sourcebook.png](../assets/projects/sourcebook.png "Screenshot of Sourcebook, a lightweight CMS for class websites.") **A lightweight content management system (CMS) designed to build class websites.** I designed it to be a self-hosted alternative for popular apps like diff --git a/projects/tad-pool/index.md b/_notes/tad-pool.md similarity index 90% rename from projects/tad-pool/index.md rename to _notes/tad-pool.md index 2397422..b7f9907 100644 --- a/projects/tad-pool/index.md +++ b/_notes/tad-pool.md @@ -1,9 +1,8 @@ --- title: Tad-Pool -layout: project --- -![tad-pool.png](assets/tad-pool.png "Screenshots of Tad-Pool, a carpooling app for college students.") +![tad-pool.png](../assets/projects/tad-pool.png "Screenshots of Tad-Pool, a carpooling app for college students.") **A mobile app designed to make carpooling easier for college students.** Find carpools based on time and location, and get rewarded for helping to reduce CO2 diff --git a/projects/teech-ai-cal-hacks-12/index.md b/_notes/teech-ai-cal-hacks-12.md similarity index 99% rename from projects/teech-ai-cal-hacks-12/index.md rename to _notes/teech-ai-cal-hacks-12.md index 4a1d516..7376f22 100644 --- a/projects/teech-ai-cal-hacks-12/index.md +++ b/_notes/teech-ai-cal-hacks-12.md @@ -1,6 +1,5 @@ --- title: teech.ai -layout: project --- diff --git a/_notes/test-2.md b/_notes/test-2.md deleted file mode 100644 index a422a48..0000000 --- a/_notes/test-2.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Another note" ---- - -[[test]] \ No newline at end of file diff --git a/_notes/test.md b/_notes/test.md deleted file mode 100644 index d3081cd..0000000 --- a/_notes/test.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Hello World" ---- - -Hello World - -==This is some highlighted text== diff --git a/projects/the-farmers-dog-trivia/index.md b/_notes/the-farmers-dog-trivia.md similarity index 92% rename from projects/the-farmers-dog-trivia/index.md rename to _notes/the-farmers-dog-trivia.md index e97dd66..c962f91 100644 --- a/projects/the-farmers-dog-trivia/index.md +++ b/_notes/the-farmers-dog-trivia.md @@ -1,9 +1,8 @@ --- title: The Farmer's Dog Trivia Game -layout: project --- -![farmers-dog.png](assets/farmers-dog.png) +![farmers-dog.png](../assets/projects/farmers-dog.png) **A Windows kiosk application designed to connect customers with the Farmer's Dog experience.** Play the interactive trivia game, score points, and win swag! diff --git a/projects/timestamp/index.md b/_notes/timestamp.md similarity index 70% rename from projects/timestamp/index.md rename to _notes/timestamp.md index c2b64d9..9c50180 100644 --- a/projects/timestamp/index.md +++ b/_notes/timestamp.md @@ -1,12 +1,11 @@ --- title: Timestamp -layout: project --- -![Screenshot of the Timestamp app and the settings window.](assets/timestamp-screenshot.png) +![Screenshot of the Timestamp app and the settings window.](../assets/projects/timestamp-screenshot.png) A simple, unintrusive Pomodoro timer for macOS which lives in the menu bar. I built it with SwiftUI and made it open source. [Download the app](https://github.com/brendan-ch/timestamp/releases){: .primary-action } [View the code](https://github.com/brendan-ch/timestamp){: .secondary-action } -{: .horizontal-wrapper } +{: .horizontal-wrapper } \ No newline at end of file diff --git a/projects/assets/app-store-icon.svg b/assets/app-store-icon.svg similarity index 100% rename from projects/assets/app-store-icon.svg rename to assets/app-store-icon.svg diff --git a/projects/cmes-mobile/assets/cmes-mobile-app.png b/assets/projects/cmes-mobile-app.png similarity index 100% rename from projects/cmes-mobile/assets/cmes-mobile-app.png rename to assets/projects/cmes-mobile-app.png diff --git a/projects/the-farmers-dog-trivia/assets/farmers-dog.png b/assets/projects/farmers-dog.png similarity index 100% rename from projects/the-farmers-dog-trivia/assets/farmers-dog.png rename to assets/projects/farmers-dog.png diff --git a/projects/interchange/assets/interchange-screenshots.png b/assets/projects/interchange-screenshots.png similarity index 100% rename from projects/interchange/assets/interchange-screenshots.png rename to assets/projects/interchange-screenshots.png diff --git a/projects/power-to-the-people/assets/power-to-the-people.png b/assets/projects/power-to-the-people.png similarity index 100% rename from projects/power-to-the-people/assets/power-to-the-people.png rename to assets/projects/power-to-the-people.png diff --git a/projects/resonance/assets/resonance-screenshot.png b/assets/projects/resonance-screenshot.png similarity index 100% rename from projects/resonance/assets/resonance-screenshot.png rename to assets/projects/resonance-screenshot.png diff --git a/projects/sourcebook/assets/sourcebook.png b/assets/projects/sourcebook.png similarity index 100% rename from projects/sourcebook/assets/sourcebook.png rename to assets/projects/sourcebook.png diff --git a/projects/tad-pool/assets/tad-pool.png b/assets/projects/tad-pool.png similarity index 100% rename from projects/tad-pool/assets/tad-pool.png rename to assets/projects/tad-pool.png diff --git a/projects/timestamp/assets/timestamp-screenshot.png b/assets/projects/timestamp-screenshot.png similarity index 100% rename from projects/timestamp/assets/timestamp-screenshot.png rename to assets/projects/timestamp-screenshot.png diff --git a/projects/cmes-mobile.md b/projects/cmes-mobile.md new file mode 100644 index 0000000..9572adf --- /dev/null +++ b/projects/cmes-mobile.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[CMES Mobile App]] \ No newline at end of file diff --git a/projects/dont-wake-sandie.md b/projects/dont-wake-sandie.md new file mode 100644 index 0000000..a83c0b0 --- /dev/null +++ b/projects/dont-wake-sandie.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[Don't Wake Sandie]] \ No newline at end of file diff --git a/projects/interchange.md b/projects/interchange.md new file mode 100644 index 0000000..0c2aa10 --- /dev/null +++ b/projects/interchange.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[Interchange]] \ No newline at end of file diff --git a/projects/power-to-the-people.md b/projects/power-to-the-people.md new file mode 100644 index 0000000..cb3de87 --- /dev/null +++ b/projects/power-to-the-people.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[Power to the People]] \ No newline at end of file diff --git a/projects/resonance.md b/projects/resonance.md new file mode 100644 index 0000000..bd8b5ba --- /dev/null +++ b/projects/resonance.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[Resonance]] \ No newline at end of file diff --git a/projects/sourcebook.md b/projects/sourcebook.md new file mode 100644 index 0000000..5e2b73b --- /dev/null +++ b/projects/sourcebook.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[Sourcebook]] \ No newline at end of file diff --git a/projects/tad-pool.md b/projects/tad-pool.md new file mode 100644 index 0000000..7531945 --- /dev/null +++ b/projects/tad-pool.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[Tad-Pool]] \ No newline at end of file diff --git a/projects/teech-ai-cal-hacks-12.md b/projects/teech-ai-cal-hacks-12.md new file mode 100644 index 0000000..f53d974 --- /dev/null +++ b/projects/teech-ai-cal-hacks-12.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[teech.ai]] \ No newline at end of file diff --git a/projects/the-farmers-dog-trivia.md b/projects/the-farmers-dog-trivia.md new file mode 100644 index 0000000..7df1c91 --- /dev/null +++ b/projects/the-farmers-dog-trivia.md @@ -0,0 +1,5 @@ +--- +title: Page moved +layout: page_moved +--- +[[The Farmer's Dog Trivia Game]] \ No newline at end of file diff --git a/projects/timestamp.md b/projects/timestamp.md new file mode 100644 index 0000000..f2575cc --- /dev/null +++ b/projects/timestamp.md @@ -0,0 +1,6 @@ +--- +title: Timestamp +layout: page_moved +--- +[[Timestamp]] + From fa8f0b3a03bdfa12416dbdda456a3bd8229c264c Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 20:40:58 -0400 Subject: [PATCH 09/17] Add a sort of dark mode --- assets/css/colors.css | 11 ++++++++++- assets/css/content.css | 8 ++++---- assets/css/global.css | 5 ++--- assets/css/navigation.css | 14 +++++++------- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/assets/css/colors.css b/assets/css/colors.css index cb2e54b..2d89d15 100644 --- a/assets/css/colors.css +++ b/assets/css/colors.css @@ -1,3 +1,12 @@ :root { - --background-color: #f4f4f4; + --color-background: #f4f4f4; + --color-primary: #000000; } + +@media (prefers-color-scheme: dark) { + :root { + --color-background: #111111; + --color-primary: #eeeeee; + } +} + diff --git a/assets/css/content.css b/assets/css/content.css index c189040..fc21441 100644 --- a/assets/css/content.css +++ b/assets/css/content.css @@ -8,21 +8,21 @@ } .primary-action { - background: black; + background: var(--color-primary); padding: 0.8em; - color: white; + color: var(--color-background); text-decoration-line: unset; border-radius: 4px; border-style: solid; border-width: 1px; - border-color: black; + border-color: var(--color-primary); box-sizing: border-box; } .secondary-action { border-width: 1px; border-style: solid; - border-color: black; + border-color: var(--color-primary); padding: 0.8em; text-decoration-line: unset; border-radius: 4px; diff --git a/assets/css/global.css b/assets/css/global.css index b727f33..db0b8ff 100644 --- a/assets/css/global.css +++ b/assets/css/global.css @@ -4,12 +4,12 @@ @import url('content.css'); html { - background-color: var(--background-color); + background-color: var(--color-background); } body { font-family: 'FormaDJRText', sans-serif; - color: black; + color: var(--color-primary); display: flex; flex-direction: column; @@ -36,7 +36,6 @@ footer { padding-bottom: 32px; padding-top: 64px; - color: dimgray; } a { diff --git a/assets/css/navigation.css b/assets/css/navigation.css index c49ae45..aca8ca1 100644 --- a/assets/css/navigation.css +++ b/assets/css/navigation.css @@ -14,7 +14,7 @@ display: flex; align-items: center; text-decoration: none; - color: black; + color: var(--color-primary); } .nav-logo-icon { @@ -36,7 +36,7 @@ .nav-link { text-decoration: none; - color: black; + color: var(--color-primary); } .nav-link:hover { @@ -56,14 +56,14 @@ height: 64px; justify-content: center; align-items: center; - background-color: black; + background-color: var(--color-primary); gap: 4px; } .hamburger-line { width: 20px; height: 2px; - background-color: white; + background-color: var(--color-background); } .menu-overlay { @@ -90,7 +90,7 @@ left: -100%; top: 80px; flex-direction: column; - background-color: var(--background-color); + background-color: var(--color-background); width: 100%; z-index: 1000; gap: 0; @@ -147,8 +147,8 @@ justify-content: space-between; height: 64px; - border-top: 1px solid black; - border-bottom: 1px solid black; + border-top: 1px solid var(--color-primary); + border-bottom: 1px solid var(--color-primary); padding-top: 16px; padding-bottom: 16px; From af843da6fd19c00c9ffbf3c4149aa192f2bfbae7 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Sat, 8 Aug 2026 20:56:45 -0400 Subject: [PATCH 10/17] Properly style the backlinks --- _layouts/note.html | 6 ++++-- assets/css/colors.css | 10 ++++++---- assets/css/content.css | 8 ++++---- assets/css/global.css | 5 +++-- assets/css/navigation.css | 14 +++++++------- assets/css/note.css | 10 ++++++++++ 6 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 assets/css/note.css diff --git a/_layouts/note.html b/_layouts/note.html index 6305734..6666394 100644 --- a/_layouts/note.html +++ b/_layouts/note.html @@ -6,12 +6,14 @@ layout: default {{ content }} -
+ + +