From 8b7b4522306556da42b009bb457b7e53398af834 Mon Sep 17 00:00:00 2001 From: sloane Date: Fri, 3 Jan 2025 15:20:36 -0500 Subject: [PATCH] nanoc --- .gitignore | 9 +- .mise.toml | 2 +- Gemfile | 13 ++ Gemfile.lock | 128 ++++++++++++++++++ README.md | 21 --- Rules | 33 +++++ .../et-book-bold-line-figures.eot | Bin .../et-book-bold-line-figures.svg | 0 .../et-book-bold-line-figures.ttf | Bin .../et-book-bold-line-figures.woff | Bin ...-book-display-italic-old-style-figures.eot | Bin ...-book-display-italic-old-style-figures.svg | 0 ...-book-display-italic-old-style-figures.ttf | Bin ...book-display-italic-old-style-figures.woff | Bin .../et-book-roman-line-figures.eot | Bin .../et-book-roman-line-figures.svg | 0 .../et-book-roman-line-figures.ttf | Bin .../et-book-roman-line-figures.woff | Bin .../et-book-roman-old-style-figures.eot | Bin .../et-book-roman-old-style-figures.svg | 0 .../et-book-roman-old-style-figures.ttf | Bin .../et-book-roman-old-style-figures.woff | Bin .../et-book-semi-bold-old-style-figures.eot | Bin .../et-book-semi-bold-old-style-figures.svg | 0 .../et-book-semi-bold-old-style-figures.ttf | Bin .../et-book-semi-bold-old-style-figures.woff | Bin content/assets/tufte.min.css | 1 + content/index.md | 11 ++ content/stylesheet.css | 101 ++++++++++++++ content/uses.md | 68 ++++++++++ layouts/default.html.erb | 28 ++++ lib/filters/sidenotes.rb | 29 ++++ lib/filters/tufte.rb | 28 ++++ nanoc.yaml | 11 ++ {site => pollen-site}/index.html.pm | 0 {site => pollen-site}/index.ptree | 0 {site => pollen-site}/pollen.rkt | 0 {site => pollen-site}/style.css.pp | 0 {site => pollen-site}/template.html.p | 0 {site => pollen-site}/tufte.css.pp | 0 site/uses/index.html.pm | 71 ---------- 41 files changed, 456 insertions(+), 98 deletions(-) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rules rename {site => content/assets}/et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot (100%) rename {site => content/assets}/et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg (100%) rename {site => content/assets}/et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf (100%) rename {site => content/assets}/et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff (100%) rename {site => content/assets}/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot (100%) rename {site => content/assets}/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg (100%) rename {site => content/assets}/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf (100%) rename {site => content/assets}/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff (100%) rename {site => content/assets}/et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot (100%) rename {site => content/assets}/et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg (100%) rename {site => content/assets}/et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf (100%) rename {site => content/assets}/et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff (100%) rename {site => content/assets}/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot (100%) rename {site => content/assets}/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg (100%) rename {site => content/assets}/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf (100%) rename {site => content/assets}/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff (100%) rename {site => content/assets}/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.eot (100%) rename {site => content/assets}/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.svg (100%) rename {site => content/assets}/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.ttf (100%) rename {site => content/assets}/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.woff (100%) create mode 100644 content/assets/tufte.min.css create mode 100644 content/index.md create mode 100644 content/stylesheet.css create mode 100644 content/uses.md create mode 100644 layouts/default.html.erb create mode 100644 lib/filters/sidenotes.rb create mode 100644 lib/filters/tufte.rb create mode 100644 nanoc.yaml rename {site => pollen-site}/index.html.pm (100%) rename {site => pollen-site}/index.ptree (100%) rename {site => pollen-site}/pollen.rkt (100%) rename {site => pollen-site}/style.css.pp (100%) rename {site => pollen-site}/template.html.p (100%) rename {site => pollen-site}/tufte.css.pp (100%) delete mode 100644 site/uses/index.html.pm diff --git a/.gitignore b/.gitignore index 054cd92..dbc29d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .DS_Store -compiled/ -/build/ - -*.html -*.css +# nanoc things +/tmp +/output +crash.log diff --git a/.mise.toml b/.mise.toml index 932e32a..264168f 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,2 +1,2 @@ [tools] -racket = "8.15" +ruby = "3.4.1" diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..6b74af5 --- /dev/null +++ b/Gemfile @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gem 'logger', '~> 1.6' +gem 'nanoc', '~> 4.13' + +group 'nanoc' do + gem 'kramdown', '~> 2.5', '>= 2.5.1' + gem 'nokogiri', '~> 1.18', '>= 1.18.1' + gem 'webrick', '~> 1.8', '>= 1.8.1' + gem 'nanoc-live', '~> 1.1' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..7e6478e --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,128 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + adsf (1.5.2) + rack (>= 1.0.0, < 4.0.0) + rackup (~> 2.1) + adsf-live (1.5.2) + adsf (~> 1.3) + em-websocket (~> 0.5) + eventmachine (~> 1.2) + listen (~> 3.0) + base64 (0.2.0) + coderay (1.1.3) + colored (1.2) + concurrent-ruby (1.3.4) + cri (2.15.12) + ddmetrics (1.1.0) + ddplugin (1.0.3) + diff-lcs (1.5.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + ffi (1.17.1) + ffi (1.17.1-arm64-darwin) + http_parser.rb (0.8.0) + immutable-ruby (0.2.0) + concurrent-ruby (~> 1.1) + sorted_set (~> 1.0) + json_schema (0.21.0) + kramdown (2.5.1) + rexml (>= 3.3.9) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.6.4) + memo_wise (1.10.0) + method_source (1.1.0) + mini_portile2 (2.8.8) + nanoc (4.13.3) + addressable (~> 2.5) + colored (~> 1.2) + nanoc-checking (~> 1.0, >= 1.0.2) + nanoc-cli (= 4.13.3) + nanoc-core (= 4.13.3) + nanoc-deploying (~> 1.0) + parallel (~> 1.12) + tty-command (~> 0.8) + tty-which (~> 0.4) + nanoc-checking (1.0.5) + nanoc-cli (~> 4.12, >= 4.12.5) + nanoc-core (~> 4.12, >= 4.12.5) + nanoc-cli (4.13.3) + cri (~> 2.15) + diff-lcs (~> 1.3) + nanoc-core (= 4.13.3) + pry + zeitwerk (~> 2.1) + nanoc-core (4.13.3) + base64 (~> 0.2) + concurrent-ruby (~> 1.1) + ddmetrics (~> 1.0) + ddplugin (~> 1.0) + immutable-ruby (~> 0.1) + json_schema (~> 0.19) + memo_wise (~> 1.5) + slow_enumerator_tools (~> 1.0) + tty-platform (~> 0.2) + zeitwerk (~> 2.1) + nanoc-deploying (1.0.2) + nanoc-checking (~> 1.0) + nanoc-cli (~> 4.11, >= 4.11.15) + nanoc-core (~> 4.11, >= 4.11.15) + nanoc-live (1.1.0) + adsf-live (~> 1.4) + listen (~> 3.0) + nanoc-cli (~> 4.11, >= 4.11.14) + nanoc-core (~> 4.11, >= 4.11.14) + nokogiri (1.18.1) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + nokogiri (1.18.1-arm64-darwin) + racc (~> 1.4) + parallel (1.26.3) + pastel (0.8.0) + tty-color (~> 0.5) + pry (0.15.2) + coderay (~> 1.1) + method_source (~> 1.0) + public_suffix (6.0.1) + racc (1.8.1) + rack (3.1.8) + rackup (2.2.1) + rack (>= 3) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rbtree (0.4.6) + rexml (3.4.0) + set (1.1.1) + slow_enumerator_tools (1.1.0) + sorted_set (1.0.3) + rbtree + set (~> 1.0) + tty-color (0.6.0) + tty-command (0.10.1) + pastel (~> 0.8) + tty-platform (0.3.0) + tty-which (0.5.0) + webrick (1.9.1) + zeitwerk (2.7.1) + +PLATFORMS + arm64-darwin-24 + ruby + +DEPENDENCIES + kramdown (~> 2.5, >= 2.5.1) + logger (~> 1.6) + nanoc (~> 4.13) + nanoc-live (~> 1.1) + nokogiri (~> 1.18, >= 1.18.1) + webrick (~> 1.8, >= 1.8.1) + +BUNDLED WITH + 2.6.2 diff --git a/README.md b/README.md index df8804c..a5d3482 100644 --- a/README.md +++ b/README.md @@ -1,22 +1 @@ # sloane.sh - -## Setup - -```sh -brew install --cask racket -raco pkg install pollen -``` - -## Working on the site - -```sh -raco pollen start site -``` - -## Building the site - -```sh -mkdir -p build -raco pollen render site -raco pollen publish site build -``` diff --git a/Rules b/Rules new file mode 100644 index 0000000..bf2b94a --- /dev/null +++ b/Rules @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby + +compile '/**/*.html' do + filter :tufte + layout '/default.*' + + if item.identifier =~ '**/index.*' + write item.identifier.to_s + else + write item.identifier.without_ext + '/index.html' + end +end + +# This is an example rule that matches Markdown (.md) files, and filters them +# using the :kramdown filter. It is commented out by default, because kramdown +# is not bundled with Nanoc or Ruby. +# +compile '/**/*.md' do + filter :sidenotes + filter :kramdown + filter :tufte + layout '/default.*' + + if item.identifier =~ '**/index.*' + write item.identifier.without_ext + '.html' + else + write item.identifier.without_ext + '/index.html' + end +end + +passthrough '/**/*' + +layout '/**/*', :erb diff --git a/site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot b/content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot similarity index 100% rename from site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot rename to content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot diff --git a/site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg b/content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg similarity index 100% rename from site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg rename to content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg diff --git a/site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf b/content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf similarity index 100% rename from site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf rename to content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf diff --git a/site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff b/content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff similarity index 100% rename from site/et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff rename to content/assets/et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff diff --git a/site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot b/content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot similarity index 100% rename from site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot rename to content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot diff --git a/site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg b/content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg similarity index 100% rename from site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg rename to content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg diff --git a/site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf b/content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf similarity index 100% rename from site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf rename to content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf diff --git a/site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff b/content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff similarity index 100% rename from site/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff rename to content/assets/et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff diff --git a/site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot b/content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot similarity index 100% rename from site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot rename to content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot diff --git a/site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg b/content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg similarity index 100% rename from site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg rename to content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg diff --git a/site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf b/content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf similarity index 100% rename from site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf rename to content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf diff --git a/site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff b/content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff similarity index 100% rename from site/et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff rename to content/assets/et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff diff --git a/site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot b/content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot similarity index 100% rename from site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot rename to content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot diff --git a/site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg b/content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg similarity index 100% rename from site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg rename to content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg diff --git a/site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf b/content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf similarity index 100% rename from site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf rename to content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf diff --git a/site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff b/content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff similarity index 100% rename from site/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff rename to content/assets/et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff diff --git a/site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.eot b/content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.eot similarity index 100% rename from site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.eot rename to content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.eot diff --git a/site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.svg b/content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.svg similarity index 100% rename from site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.svg rename to content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.svg diff --git a/site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.ttf b/content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.ttf similarity index 100% rename from site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.ttf rename to content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.ttf diff --git a/site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.woff b/content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.woff similarity index 100% rename from site/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.woff rename to content/assets/et-book/et-book-semi-bold-old-style-figures/et-book-semi-bold-old-style-figures.woff diff --git a/content/assets/tufte.min.css b/content/assets/tufte.min.css new file mode 100644 index 0000000..b77d324 --- /dev/null +++ b/content/assets/tufte.min.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:et-book;src:url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot);src:url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff) format("woff"),url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf) format("truetype"),url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg#etbookromanosf) format("svg");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:et-book;src:url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot);src:url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff) format("woff"),url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf) format("truetype"),url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg#etbookromanosf) format("svg");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:et-book;src:url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot);src:url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff) format("woff"),url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf) format("truetype"),url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg#etbookromanosf) format("svg");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:et-book-roman-old-style;src:url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot);src:url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff) format("woff"),url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf) format("truetype"),url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg#etbookromanosf) format("svg");font-weight:400;font-style:normal;font-display:swap}html{font-size:15px}body{width:87.5%;margin-left:auto;margin-right:auto;padding-left:12.5%;font-family:et-book,Palatino,"Palatino Linotype","Palatino LT STD","Book Antiqua",Georgia,serif;background-color:#fffff8;color:#111;max-width:1400px;counter-reset:sidenote-counter}@media (prefers-color-scheme:dark){body{background-color:#151515;color:#ddd}}h1{font-weight:400;margin-top:4rem;margin-bottom:1.5rem;font-size:3.2rem;line-height:1}h2{font-style:italic;font-weight:400;margin-top:2.1rem;margin-bottom:1.4rem;font-size:2.2rem;line-height:1}h3{font-style:italic;font-weight:400;font-size:1.7rem;margin-top:2rem;margin-bottom:1.4rem;line-height:1}hr{display:block;height:1px;width:55%;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}p.subtitle{font-style:italic;margin-top:1rem;margin-bottom:1rem;font-size:1.8rem;display:block;line-height:1}.numeral{font-family:et-book-roman-old-style}.danger{color:red}article{padding:5rem 0}section{padding-top:1rem;padding-bottom:1rem}dl,ol,p,ul{font-size:1.4rem;line-height:2rem}p{margin-top:1.4rem;margin-bottom:1.4rem;padding-right:0;vertical-align:baseline}div.epigraph{margin:5em 0}div.epigraph>blockquote{margin-top:3em;margin-bottom:3em}div.epigraph>blockquote,div.epigraph>blockquote>p{font-style:italic}div.epigraph>blockquote>footer{font-style:normal}div.epigraph>blockquote>footer>cite{font-style:italic}blockquote{font-size:1.4rem}blockquote p{width:55%;margin-right:40px}blockquote footer{width:55%;font-size:1.1rem;text-align:right}section>footer,section>p,section>table{width:55%}section>dl,section>ol,section>ul{width:50%;-webkit-padding-start:5%}dt:not(:first-child),li:not(:first-child){margin-top:.25rem}figure{padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;max-width:55%;-webkit-margin-start:0;-webkit-margin-end:0;margin:0 0 3em 0}figcaption{float:right;clear:right;margin-top:0;margin-bottom:0;font-size:1.1rem;line-height:1.6;vertical-align:baseline;position:relative;max-width:40%}figure.fullwidth figcaption{margin-right:24%}a:link,a:visited{color:inherit}.no-tufte-underline:link{background:unset;text-shadow:unset}.hover-tufte-underline:hover,.tufte-underline,a:link{text-decoration:none;background:-webkit-linear-gradient(#fffff8,#fffff8),-webkit-linear-gradient(#fffff8,#fffff8),-webkit-linear-gradient(currentColor,currentColor);background:linear-gradient(#fffff8,#fffff8),linear-gradient(#fffff8,#fffff8),linear-gradient(currentColor,currentColor);-webkit-background-size:.05em 1px,.05em 1px,1px 1px;-moz-background-size:.05em 1px,.05em 1px,1px 1px;background-size:.05em 1px,.05em 1px,1px 1px;background-repeat:no-repeat,no-repeat,repeat-x;text-shadow:.03em 0 #fffff8,-.03em 0 #fffff8,0 .03em #fffff8,0 -.03em #fffff8,.06em 0 #fffff8,-.06em 0 #fffff8,.09em 0 #fffff8,-.09em 0 #fffff8,.12em 0 #fffff8,-.12em 0 #fffff8,.15em 0 #fffff8,-.15em 0 #fffff8;background-position:0 93%,100% 93%,0 93%}@media screen and (-webkit-min-device-pixel-ratio:0){.hover-tufte-underline:hover,.tufte-underline,a:link{background-position-y:87%,87%,87%}}@media (prefers-color-scheme:dark){.hover-tufte-underline:hover,.tufte-underline,a:link{text-shadow:.03em 0 #151515,-.03em 0 #151515,0 .03em #151515,0 -.03em #151515,.06em 0 #151515,-.06em 0 #151515,.09em 0 #151515,-.09em 0 #151515,.12em 0 #151515,-.12em 0 #151515,.15em 0 #151515,-.15em 0 #151515}}a:link::-moz-selection,a:link::selection{text-shadow:.03em 0 #b4d5fe,-.03em 0 #b4d5fe,0 .03em #b4d5fe,0 -.03em #b4d5fe,.06em 0 #b4d5fe,-.06em 0 #b4d5fe,.09em 0 #b4d5fe,-.09em 0 #b4d5fe,.12em 0 #b4d5fe,-.12em 0 #b4d5fe,.15em 0 #b4d5fe,-.15em 0 #b4d5fe;background:#b4d5fe}img{max-width:100%}.marginnote,.sidenote{float:right;clear:right;margin-right:-60%;width:50%;margin-top:.3rem;margin-bottom:0;font-size:1.1rem;line-height:1.3;vertical-align:baseline;position:relative}.sidenote-number{counter-increment:sidenote-counter}.sidenote-number:after,.sidenote:before{font-family:et-book-roman-old-style;position:relative;vertical-align:baseline}.sidenote-number:after{content:counter(sidenote-counter);font-size:1rem;top:-.5rem;left:.1rem}.sidenote:before{content:counter(sidenote-counter) " ";font-size:1rem;top:-.5rem}blockquote .marginnote,blockquote .sidenote{margin-right:-82%;min-width:59%;text-align:left}div.fullwidth,table.fullwidth{width:100%}div.table-wrapper{overflow-x:auto;font-family:"Trebuchet MS","Gill Sans","Gill Sans MT",sans-serif}.sans{font-family:"Gill Sans","Gill Sans MT",Calibri,sans-serif;letter-spacing:.03em}code,pre>code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:1rem;line-height:1.42;-webkit-text-size-adjust:100%}.sans>code{font-size:1.2rem}h1>code,h2>code,h3>code{font-size:.8em}.marginnote>code,.sidenote>code{font-size:1rem}pre>code{font-size:.9rem;width:52.5%;margin-left:2.5%;overflow-x:auto;display:block}pre.fullwidth>code{width:90%}.fullwidth{max-width:90%;clear:both}span.newthought{font-variant:small-caps;font-size:1.2em}input.margin-toggle{display:none}label.sidenote-number{display:inline-block;max-height:2rem}label.margin-toggle:not(.sidenote-number){display:none}.iframe-wrapper{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.iframe-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}@media (max-width:760px){body{width:84%;padding-left:8%;padding-right:8%}hr,section>footer,section>p,section>table{width:100%}pre>code{width:97%}section>dl,section>ol,section>ul{width:90%}figure{max-width:90%}figcaption,figure.fullwidth figcaption{margin-right:0;max-width:none}blockquote{margin-left:1.5em;margin-right:0}blockquote footer,blockquote p{width:100%}label.margin-toggle:not(.sidenote-number){display:inline}.marginnote,.sidenote{display:none}.margin-toggle:checked+.marginnote,.margin-toggle:checked+.sidenote{display:block;float:left;left:1rem;clear:both;width:95%;margin:1rem 2.5%;vertical-align:baseline;position:relative}label{cursor:pointer}div.table-wrapper,table{width:85%}img{width:100%}} \ No newline at end of file diff --git a/content/index.md b/content/index.md new file mode 100644 index 0000000..cc4adb2 --- /dev/null +++ b/content/index.md @@ -0,0 +1,11 @@ +--- +title: sloane.sh +--- + +# Hi, I'm Sloane! + +I'm a professional software engineer and an amateur musician, photographer, wife, chef, and pet mom. + +## [My Tools](/uses) + +If you're interested in the tools I use you can check out my [usesthis.com](https://usesthis.com) style self-interview. diff --git a/content/stylesheet.css b/content/stylesheet.css new file mode 100644 index 0000000..7d8c8ac --- /dev/null +++ b/content/stylesheet.css @@ -0,0 +1,101 @@ +* { + margin: 0; + padding: 0; + + font-family: Georgia, Palatino, serif; +} + +body { + background: #fff; +} + +a { + text-decoration: none; +} + +a:link, +a:visited { + color: #f30; +} + +a:hover { + color: #f90; +} + +#main { + position: absolute; + + top: 40px; + left: 280px; + + width: 500px; +} + +#main h1 { + font-size: 40px; + font-weight: normal; + + line-height: 40px; + + letter-spacing: -1px; +} + +#main p { + margin: 20px 0; + + font-size: 15px; + + line-height: 20px; +} + +#main ul, #main ol { + margin: 20px; +} + +#main li { + font-size: 15px; + + line-height: 20px; +} + +#main ul li { + list-style-type: square; +} + +#sidebar { + position: absolute; + + top: 40px; + left: 20px; + width: 200px; + + padding: 20px 20px 0 0; + + border-right: 1px solid #ccc; + + text-align: right; +} + +#sidebar h2 { + text-transform: uppercase; + + font-size: 13px; + + color: #333; + + letter-spacing: 1px; + + line-height: 20px; +} + +#sidebar ul { + list-style-type: none; + + margin: 20px 0; +} + +#sidebar li { + font-size: 14px; + + line-height: 20px; +} diff --git a/content/uses.md b/content/uses.md new file mode 100644 index 0000000..248d444 --- /dev/null +++ b/content/uses.md @@ -0,0 +1,68 @@ +--- +title: "“Uses This”" +--- + +
+

+ Have you considered adding a /uses/ page to your own site, answering the same questions? +

+ +
+ + + +## Who are you, and what do you do? + +I'm a professional software engineer and once engineering manager. I work a day job but I'm also working with a good friend and former boss to bring [screen.garden](https://screen.garden), a real-time collaboration tool for PKMs and the web, to life. + +In my free time I sing with a local queer TTBB chorus, play table-top RPGs, watch Formula 1, and play video games. + +## What hardware do you use? + +I work atop a sit-stand desk I bought when I first started working remotely in 2017. It stays in the "sit" position 99% of the time. For work I use whatever machine my employer provides. Right now that's a 14in M3 MacBook Pro. Personally, I have an M1 MacBook Air which I love. A single thunderbolt cable runs from either of those machines to a [CalDigit TS4](https://www.caldigit.com/thunderbolt-station-4/) which connects it to power, ethernet, a USB hub, and my display. + +I use just the one display, a [GIGABYTE M32U](https://www.gigabyte.com/Monitor/M32U), which is a 32 inch, 4k, 144Hz monitor. Whenever someone is talking about replacing their monitor I always bring up refresh rate. It's one of those things that sounds like you wouldn't notice but it actually makes looking at a screen for most of your day a lot more pleasant. I've sat a no-name-brand monitor light and a Logitech webcam atop it. + +I have a collection of mechanical keyboards ([ErgoDox EZ](https://ergodox-ez.com/), [Keyboardio Atreus](https://shop.keyboard.io/products/keyboardio-atreus), to name a couple) which all live in a drawer while I type away on my [Glorious GMMK Pro](https://www.gloriousgaming.com/products/glorious-gmmk-pro-75-barebone-black) with [Glorious Panda tactile switches](https://www.gloriousgaming.com/products/glorious-panda-mechanical-switches?variant=37691905933487). I think Glorious's branding is a bit "cringe" to say the least but they were the only custom keyboard option I could get same-day at the nearby Micro Center when I needed to replace my [Pok3r](https://drop.com/buy/vortex-poker-iii-compact-keyboard) following a coffee spill incident. + +I talk to my coworkers and friends through a [Blue Yeti mic](https://www.bestbuy.com/site/blue-microphones-blue-yeti-professional-multi-pattern-usb-condenser-microphone/9737441.p?skuId=9737441) that I bought when a former employer gave everyone a couple hundred dollars for work-from-home equipment in early 2020 (despite my having already worked from my home my entire tenure there). + +At the edges of my desk are piles of scrunchies, a couple hair clips, my AirPods Pros, a pair of Sennheiser HD 600s, my iPhone 14 Pro Max (I always go "Max" or "Plus" for the extra battery life), an [Aquaphor lip balm stick](https://www.aquaphorus.com/products/lip-care/lip-repair-stick), some hand lotion, and a nice candle. + +Away from my desk I have a collection of cameras but the one I use the most is my Leica M6 which I usually shoot with a Voigtlander Nokton Classic 35mm f/1.4. I digitize my negatives with a beat-up Sony a6000, a cheap macro lens, and a [Valoi easy35](https://www.valoi.co/easy35). + +I have a couple Apple TV 4ks to stream content from the cloud and also the Plex Media Server running on a Synology NAS. I have a couple TVs in different rooms but the Xbox Series X stays connected to the 65 inch LG C1 OLED (once again which a high refresh rate). + +Finally, currently sitting on my nightstand wrapped in some FiiO IEMs is a 5th iPod Classic (aka an iPod Video) whose hard disk I've [replaced with a 512gb microSD card](https://www.iflash.xyz/). It's really incredible how well it still works. + +## And what software? + +These days I'm macOS all-the-way. I'm fully integrated into the ecosystem and the ergonomics and reliability of development on the platform is unparalleled in my opinion. Obviously I use a ton of software so I'll limit (mostly) to things I keep pinned to my dock (although most of the time I'm launching things from [Alfred](https://www.alfredapp.com/)): + + +- [Firefox](https://www.mozilla.org/en-US/firefox/new/) to browse the web +- [Fantastical](https://flexibits.com/fantastical) to manage several calendar accounts. I could just use Calendar.app but there are few features (like travel time and automatic event merging) that keep me renewing my subscription. +- Mail.app for emails... +- [Things 3](https://culturedcode.com/things/) makes sure I get things done. I switched from an Android phone to an iPhone many years ago just so I could use Things while I was away from my computer. +- [Kitty](https://sw.kovidgoyal.net/kitty/) to run all of my command line apps. I always work within a `tmux` session so my terminal emulator doesn't really matter all that much (because I'm never using tabs or splits or whatever) but Kitty is quick and the [alternative icon](https://github.com/DinkDonk/kitty-icon) I use for it is really cute. I'm a vim user (neovim really) and have been since 2015. My neovim setup could be its own post... +- Music - I switch between two libraries: 1. My local library which I sync with my iPod and 2. My iCloud, Apple Music backed library +- [Dash 6](https://kapeli.com/dash) (usually via Alfred) to quickly reference documentation. Elixir / Hex package docs support is incredible +- [Obsidian](https://obsidian.md) for personal, work, and TTRPG notes. I keep my plugins list slip with just Templater, DataView, Tasks, Periodic Notes, and of course screen.garden. +- [Readwise Reader](https://readwise.io/read) as my read-later service +} + +I have to shout-out Lightroom with [Negative Lab Pro](https://www.negativelabpro.com/) for converting scans/photos of film negatives. +} + + +## What would be your dream setup? + +I've obviously spoiled myself already so I'd keep most things the same but... + +I'd love a thunderbolt KVM of some kind that would let me swap _quickly_ between machines at the press of a button. I also feel like I'd benefit from a larger desk. + +I think about replacing my webcam with the Sony a6000 and replacing that with a newer, higher resolution mirrorless camera. + +I'm really hoping the ARM desktop / server market continues to become more accessible to the consumer market because the Synology NAS is looking a little worse-for-wear these days. I've thought about replacing it with a custom build x64 machine but the additional power consumption and heat keep me from doing it (I'm spoiled by these Apple ARM machines...). diff --git a/layouts/default.html.erb b/layouts/default.html.erb new file mode 100644 index 0000000..0cee629 --- /dev/null +++ b/layouts/default.html.erb @@ -0,0 +1,28 @@ + + + + + + <%= @item[:title] %> + + + + + + +
+

<%= @item[:title] %>

+ <%= yield %> +
+
+ sloane +
+ <% if @item[:created_at] %> + + <% end %> +
+
+ + diff --git a/lib/filters/sidenotes.rb b/lib/filters/sidenotes.rb new file mode 100644 index 0000000..b92c8e2 --- /dev/null +++ b/lib/filters/sidenotes.rb @@ -0,0 +1,29 @@ +Nanoc::Filter.define(:sidenotes) do |content, params| + @footnotes = {} + + # First pass: collect all footnote definitions + content.scan(/\[\^([^\]]+)\]:\s*(.+?)($|\n\n)/) do |ref, text, _| + @footnotes[ref] = text.strip + end + + # Second pass: replace footnote references with sidenote markup + result = content.gsub(/\[\^([^\]]+)\](?!:)/) do |match| + ref = $1 + next match unless @footnotes[ref] # Skip if no matching footnote definition + + <<~HTML + + + + #{@footnotes[ref]} + + HTML + end + + # Finally, remove the original footnote definitions + result.gsub(/\[\^([^\]]+)\]:\s*(.+?)($|\n\n)/, '') +end diff --git a/lib/filters/tufte.rb b/lib/filters/tufte.rb new file mode 100644 index 0000000..362cdf5 --- /dev/null +++ b/lib/filters/tufte.rb @@ -0,0 +1,28 @@ +Nanoc::Filter.define(:tufte) do |content, params| + doc = Nokogiri::HTML.fragment(content) + + # Convert to array to avoid modifying during iteration + nodes = doc.children.to_a + + # Track the current section we're building + current_section = nil + + # Process each node + nodes.each do |node| + if node.name == 'h2' + # Start a new section + current_section = Nokogiri::XML::Node.new('section', doc) + node.add_previous_sibling(current_section) + current_section.add_child(node) + elsif current_section && node.name != 'h2' + # Add this node to the current section + current_section.add_child(node) + end + end + + doc.to_html.gsub(/\[\^([^\]]+)\]:\s*(.+)$/) do |match| + ref = $1 + note_content = $2.strip + "#{note_content}" + end +end diff --git a/nanoc.yaml b/nanoc.yaml new file mode 100644 index 0000000..477aa76 --- /dev/null +++ b/nanoc.yaml @@ -0,0 +1,11 @@ +# A list of file extensions that Nanoc will consider to be textual rather than +# binary. If an item with an extension not in this list is found, the file +# will be considered as binary. +text_extensions: [ 'adoc', 'asciidoc', 'atom', 'coffee', 'css', 'erb', 'haml', 'handlebars', 'hb', 'htm', 'html', 'js', 'less', 'markdown', 'md', 'ms', 'mustache', 'org', 'php', 'rb', 'rdoc', 'sass', 'scss', 'slim', 'tex', 'txt', 'xhtml', 'xml' ] + +prune: + auto_prune: true + +data_sources: + - type: filesystem + encoding: utf-8 diff --git a/site/index.html.pm b/pollen-site/index.html.pm similarity index 100% rename from site/index.html.pm rename to pollen-site/index.html.pm diff --git a/site/index.ptree b/pollen-site/index.ptree similarity index 100% rename from site/index.ptree rename to pollen-site/index.ptree diff --git a/site/pollen.rkt b/pollen-site/pollen.rkt similarity index 100% rename from site/pollen.rkt rename to pollen-site/pollen.rkt diff --git a/site/style.css.pp b/pollen-site/style.css.pp similarity index 100% rename from site/style.css.pp rename to pollen-site/style.css.pp diff --git a/site/template.html.p b/pollen-site/template.html.p similarity index 100% rename from site/template.html.p rename to pollen-site/template.html.p diff --git a/site/tufte.css.pp b/pollen-site/tufte.css.pp similarity index 100% rename from site/tufte.css.pp rename to pollen-site/tufte.css.pp diff --git a/site/uses/index.html.pm b/site/uses/index.html.pm deleted file mode 100644 index fcf010a..0000000 --- a/site/uses/index.html.pm +++ /dev/null @@ -1,71 +0,0 @@ -#lang pollen - -◊title{"Uses This"} - -◊div[#:class "epigraph"]{ - ◊blockquote[#:cite "https://usesthis.com/about/#:~:text=Have%20you%20considered%20added%20a%20%2Fuses%2F%20page%20to%20your%20own%20site%2C%20answering%20the%20same%20questions%3F"]{ - Have you considered adding a ◊code{/uses/} page to your own site, answering the same questions? - ◊footer{ - ◊link["https://wafer.baby/@d"]{Daniel} of ◊link["https://usesthis.com/about/#:~:text=Have%20you%20considered%20added%20a%20%2Fuses%2F%20page%20to%20your%20own%20site%2C%20answering%20the%20same%20questions%3F"]{usesthis.com} - } - } -} - -◊section{ - ◊heading{Who are you, and what do you do?} - I'm a professional software engineer and once engineering manager. I work a day job but I'm also working with a good friend and former boss to bring ◊link["https://screen.garden"]{screen.garden}, a real-time collaboration tool for PKMs and the web, to life. - - In my free time I sing with a local queer TTBB chorus, play table-top RPGs, watch Formula 1, and play video games. -} - -◊section{ - ◊heading{What hardware do you use?} - - I work atop a sit-stand desk I bought when I first started working remotely in 2017. It stays in the "sit" position 99% of the time. For work I use whatever machine my employer provides. Right now that's a 14in M3 MacBook Pro. Personally, I have an M1 MacBook Air which I love. A single thunderbolt cable runs from either of those machines to a ◊link["https://www.caldigit.com/thunderbolt-station-4/"]{CalDigit TS4} which connects it to power, ethernet, a USB hub, and my display. - - I use just the one display, a ◊link["https://www.gigabyte.com/Monitor/M32U"]{GIGABYTE M32U}, which is a 32 inch, 4k, 144Hz monitor. Whenever someone is talking about replacing their monitor I always bring up refresh rate. It's one of those things that sounds like you wouldn't notice but it actually makes looking at a screen for most of your day a lot more pleasant. I've sat a no-name-brand monitor light and a Logitech webcam atop it. - - I have a collection of mechanical keyboards (◊link["https://ergodox-ez.com/"]{ErgoDox EZ}, ◊link["https://shop.keyboard.io/products/keyboardio-atreus"]{Keyboardio Atreus}, to name a couple) which all live in a drawer while I type away on my ◊link["https://www.gloriousgaming.com/products/glorious-gmmk-pro-75-barebone-black"]{Glorious GMMK Pro} with ◊link["https://www.gloriousgaming.com/products/glorious-panda-mechanical-switches?variant=37691905933487"]{Glorious Panda tactile switches}. I think Glorious's branding is a bit "cringe" to say the least but they were the only custom keyboard option I could get same-day at the nearby Micro Center when I needed to replace my ◊link["https://drop.com/buy/vortex-poker-iii-compact-keyboard"]{Pok3r} following a coffee spill incident. - - I talk to my coworkers and friends through a ◊link["https://www.bestbuy.com/site/blue-microphones-blue-yeti-professional-multi-pattern-usb-condenser-microphone/9737441.p?skuId=9737441"]{Blue Yeti mic} that I bought when a former employer gave everyone a couple hundred dollars for work-from-home equipment in early 2020 (despite my having already worked from my home my entire tenure there). - - At the edges of my desk are piles of scrunchies, a couple hair clips, my AirPods Pros, a pair of Sennheiser HD 600s, my iPhone 14 Pro Max (I always go "Max" or "Plus" for the extra battery life), an ◊link["https://www.aquaphorus.com/products/lip-care/lip-repair-stick"]{Aquaphor lip balm stick}, some hand lotion, and a nice candle. - - Away from my desk I have a collection of cameras but the one I use the most is my Leica M6 which I usually shoot with a Voigtlander Nokton Classic 35mm f/1.4. I digitize my negatives with a beat-up Sony a6000, a cheap macro lens, and a ◊link["https://www.valoi.co/easy35"]{Valoi easy35}. - - I have a couple Apple TV 4ks to stream content from the cloud and also the Plex Media Server running on a Synology NAS. I have a couple TVs in different rooms but the Xbox Series X stays connected to the 65 inch LG C1 OLED (once again which a high refresh rate). - - Finally, currently sitting on my nightstand wrapped in some FiiO IEMs is a 5th iPod Classic (aka an iPod Video) whose hard disk I've ◊link["https://www.iflash.xyz/"]{replaced with a 512gb microSD card}. It's really incredible how well it still works. -} - -◊section{ - ◊heading{And what software?} - - These days I'm macOS all-the-way. I'm fully integrated into the ecosystem and the ergonomics and reliability of development on the platform is unparalleled in my opinion. Obviously I use a ton of software so I'll limit (mostly) to things I keep pinned to my dock (although most of the time I'm launching things from ◊link["https://www.alfredapp.com/"]{Alfred}): - - ◊unordered-list{ - ◊item{◊link["https://www.mozilla.org/en-US/firefox/new/"]{Firefox} to browse the web} - ◊item{◊link["https://flexibits.com/fantastical"]{Fantastical} to manage several calendar accounts. I could just use Calendar.app but there are few features (like travel time and automatic event merging) that keep me renewing my subscription.} - ◊item{Mail.app for emails...} - ◊item{◊link["https://culturedcode.com/things/"]{Things 3} makes sure I get things done. I switched from an Android phone to an iPhone many years ago just so I could use Things while I was away from my computer.} - ◊item{◊link["https://sw.kovidgoyal.net/kitty/"]{Kitty} to run all of my command line apps. I always work within a ◊code{tmux} session so my terminal emulator doesn't really matter all that much (because I'm never using tabs or splits or whatever) but Kitty is quick and the ◊link["https://github.com/DinkDonk/kitty-icon"]{alternative icon} I use for it is really cute. I'm a vim user (neovim really) and have been since 2015. My neovim setup could be its own post...} - ◊item{Music - I switch between two libraries: 1. My local library which I sync with my iPod and 2. My iCloud, Apple Music backed library} - ◊item{◊link["https://kapeli.com/dash"]{Dash 6} (usually via Alfred) to quickly reference documentation. Elixir / Hex package docs support is incredible} - ◊item{◊link["https://obsidian.md"]{Obsidian} for personal, work, and TTRPG notes. I keep my plugins list slip with just Templater, DataView, Tasks, Periodic Notes, and of course screen.garden.} - ◊item{◊link["https://readwise.io/read"]{Readwise Reader} as my read-later service} - } - - I have to shout-out Lightroom with ◊link["https://www.negativelabpro.com/"]{Negative Lab Pro} for converting scans/photos of film negatives. -} - - -◊section{ -◊heading{What would be your dream setup?} - I've obviously spoiled myself already so I'd keep most things the same but... - - I'd love a thunderbolt KVM of some kind that would let me swap ◊em{quickly} between machines at the press of a button. I also feel like I'd benefit from a larger desk. - - I think about replacing my webcam with the Sony a6000 and replacing that with a newer, higher resolution mirrorless camera. - - I'm really hoping the ARM desktop / server market continues to become more accessible to the consumer market because the Synology NAS is looking a little worse-for-wear these days. I've thought about replacing it with a custom build x64 machine but the additional power consumption and heat keep me from doing it (I'm spoiled by these Apple ARM machines...). -}