Recent changes to this wiki:

Added a comment
diff --git a/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_4_12a70e54809c65fd142fd73aa9b57ebb._comment b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_4_12a70e54809c65fd142fd73aa9b57ebb._comment
new file mode 100644
index 00000000..9c8b0d7d
--- /dev/null
+++ b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_4_12a70e54809c65fd142fd73aa9b57ebb._comment
@@ -0,0 +1,59 @@
+[[!comment format=mdwn
+ username="nathan.collins@e900dccb7a38e9f3426dbbd8e48381f240198a51"
+ nickname="nathan.collins"
+ avatar="http://cdn.libravatar.org/avatar/8354544a22bb5a0ac8005ca008f94ad1"
+ subject="comment 4"
+ date="2019-01-21T23:02:32Z"
+ content="""
+I've had a negative Amazon review removed because the seller reported my review. I was able to submit a new review that was not removed, after contacting Amazon support. Also, when I contacted Amazon support they explained **why** my review had been removed, which I found very helpful. Here's what Amazon support said:
+
+    Hello Nathan,
+
+    I apologize for the confusion you experienced in this case.​
+    
+    We encourage customer content on the Amazon.com website, both positive and negative.
+    
+    However, your recent contribution doesn't comply with our content guidelines.
+    Specifically, your contribution contains comments related to the seller and not the product itself.
+    
+    I'd recommend submitting your review again, restricting your comments to the item. For your convenience, I've included your original Review below:
+    
+    The battery I received did not work at all. I returned it for refund. The seller was responsive, and offered me $10 to remove my bad review. 
+    
+    Please take a look at our Community Guidelines for information about acceptable content:
+    
+    https://www.amazon.com/gp/help/customer/display.html?nodeId=201929730
+    
+    If you'd like to leave feedback for the seller you ordered from, visit this page:
+    
+    http://www.amazon.com/feedback
+    
+    I hope this helps!
+
+    Best regards,
+    Alice Y.
+
+Note my original review from above:
+
+    The battery I received did not work at all. I returned it for refund. The seller was responsive, and offered me $10 to remove my bad review.
+
+I feel that mentioning the seller in this way was very relevant, but I guess Amazon disagrees. The positive reviews also mentioned the seller, but of course the seller didn't complain about those. I then asked Amazon about the double standard but they ignored me:
+
+    Hi Alice,
+    
+    Thanks for explaining that my review was rejected because I mentioned
+    something about the seller. However, notice that these other two
+    reviews of the same product also talk about the seller:
+    
+    https://www.amazon.com/gp/customer-reviews/R1SUR5G7FDAO80/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B01I1IY1SY
+    
+    https://www.amazon.com/gp/customer-reviews/R3GVDST5W3UDEM/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B01I1IY1SY
+    
+    Why are these reviews allowed and mine is not?
+
+But at least they didn't remove [my updated review](https://www.amazon.com/gp/product/B01I1IY1SY/ref=ppx_yo_dt_b_asin_title_o03__o00_s00?ie=UTF8&psc=1):
+
+    The battery I received did not work at all.
+
+Maybe you could contact Amazon support and find out what technicality allowed the seller to have your review removed?
+"""]]

add news item for moreutils 0.63
diff --git a/code/moreutils/news/version_0.58.mdwn b/code/moreutils/news/version_0.58.mdwn
deleted file mode 100644
index 6d5ada3d..00000000
--- a/code/moreutils/news/version_0.58.mdwn
+++ /dev/null
@@ -1,6 +0,0 @@
-moreutils 0.58 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * OpenBSD compile fix.
-     Thanks, Michael Reed.
-   * ts: Quiet perl's complaints about utf-8. Closes: #[812143](http://bugs.debian.org/812143)
-     Thanks, Nicolas Schier."""]]
\ No newline at end of file
diff --git a/code/moreutils/news/version_0.63.mdwn b/code/moreutils/news/version_0.63.mdwn
new file mode 100644
index 00000000..a1ece662
--- /dev/null
+++ b/code/moreutils/news/version_0.63.mdwn
@@ -0,0 +1,8 @@
+moreutils 0.63 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * vipe: Clean up temp file even when it exits with an error.
+     Thanks, Stig Palmquist.
+   * ts: Fix ts -m %.s to not output negative microseconds.
+     Thanks, Dima Kogan
+   * sponge: Fix bug in -a mode that doubled original content of file when
+     the temp file is located on a different filesystem."""]]
\ No newline at end of file

calendar update
diff --git a/blog/archives/2019.mdwn b/blog/archives/2019.mdwn
new file mode 100644
index 00000000..88e86900
--- /dev/null
+++ b/blog/archives/2019.mdwn
@@ -0,0 +1 @@
+[[!calendar type=year year=2019 pages="blog/entry/* and !*/Discussion"]]
diff --git a/blog/archives/2019/01.mdwn b/blog/archives/2019/01.mdwn
new file mode 100644
index 00000000..fee381ea
--- /dev/null
+++ b/blog/archives/2019/01.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=01 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(01) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/02.mdwn b/blog/archives/2019/02.mdwn
new file mode 100644
index 00000000..2cce0fab
--- /dev/null
+++ b/blog/archives/2019/02.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=02 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(02) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/03.mdwn b/blog/archives/2019/03.mdwn
new file mode 100644
index 00000000..f8d8824c
--- /dev/null
+++ b/blog/archives/2019/03.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=03 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(03) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/04.mdwn b/blog/archives/2019/04.mdwn
new file mode 100644
index 00000000..8f2eb65e
--- /dev/null
+++ b/blog/archives/2019/04.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=04 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(04) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/05.mdwn b/blog/archives/2019/05.mdwn
new file mode 100644
index 00000000..d9267d07
--- /dev/null
+++ b/blog/archives/2019/05.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=05 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(05) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/06.mdwn b/blog/archives/2019/06.mdwn
new file mode 100644
index 00000000..7b763b5a
--- /dev/null
+++ b/blog/archives/2019/06.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=06 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(06) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/07.mdwn b/blog/archives/2019/07.mdwn
new file mode 100644
index 00000000..316c4025
--- /dev/null
+++ b/blog/archives/2019/07.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=07 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(07) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/08.mdwn b/blog/archives/2019/08.mdwn
new file mode 100644
index 00000000..3e675f3b
--- /dev/null
+++ b/blog/archives/2019/08.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=08 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(08) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/09.mdwn b/blog/archives/2019/09.mdwn
new file mode 100644
index 00000000..e4c497dc
--- /dev/null
+++ b/blog/archives/2019/09.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=09 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(09) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/10.mdwn b/blog/archives/2019/10.mdwn
new file mode 100644
index 00000000..d0fcf9bf
--- /dev/null
+++ b/blog/archives/2019/10.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=10 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(10) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/11.mdwn b/blog/archives/2019/11.mdwn
new file mode 100644
index 00000000..4cc830e9
--- /dev/null
+++ b/blog/archives/2019/11.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=11 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(11) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]
diff --git a/blog/archives/2019/12.mdwn b/blog/archives/2019/12.mdwn
new file mode 100644
index 00000000..69401057
--- /dev/null
+++ b/blog/archives/2019/12.mdwn
@@ -0,0 +1,5 @@
+[[!sidebar content="""
+[[!calendar type=month month=12 year=2019 pages="blog/entry/* and !*/Discussion"]]
+"""]]
+
+[[!inline pages="creation_month(12) and creation_year(2019) and blog/entry/* and !*/Discussion" show=0 feeds=no reverse=yes]]

add
will hotlink on git-annex/thanks
diff --git a/blog/pics/neurohub.png b/blog/pics/neurohub.png
new file mode 100644
index 00000000..cc023138
Binary files /dev/null and b/blog/pics/neurohub.png differ

Added a comment: would use battery after you open fridge
diff --git a/blog/entry/fridge_0.2/comment_2_1dd3a8f65335f20c262efe1316cc858c._comment b/blog/entry/fridge_0.2/comment_2_1dd3a8f65335f20c262efe1316cc858c._comment
new file mode 100644
index 00000000..9777950e
--- /dev/null
+++ b/blog/entry/fridge_0.2/comment_2_1dd3a8f65335f20c262efe1316cc858c._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="flot"
+ avatar="http://cdn.libravatar.org/avatar/b57c3b7ad3347a234b26d779a5ccd31b"
+ subject="would use battery after you open fridge"
+ date="2018-12-28T10:30:22Z"
+ content="""
+I would allow for a battery on a timer that would run the refrigerator for a minute after opening and closing it.
+Or a mechanical timer that one'd manually set after use.
+
+Would at least deal with humidity, and stabilize temperature somewhat.
+"""]]

fridge0
diff --git a/code.mdwn b/code.mdwn
index 612043a0..c31824ba 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -17,9 +17,8 @@ The stuff that's swapped into my local cache at the moment.
 [[ikiwiki-hosting]]
 [[shell-monad]]
 [[reactive-banana-automation]]
-[[http-client-restricted]]
 [[easy-peasy-devicetree-squeezy]]
-[[scuttlebutt-types]]
+[[fridge0]]
 
 ## Less active projects
 
@@ -34,6 +33,8 @@ In maintenance mode mostly, but I still have my hands in it somewhat.
 [[zxcvbn-c]]
 [[scroll]]
 [[github-backup]]
+[[http-client-restricted]]
+[[scuttlebutt-types]]
 
 ## Past projects
 

add fridge0
diff --git a/code/fridge0.mdwn b/code/fridge0.mdwn
new file mode 100644
index 00000000..5544a54e
--- /dev/null
+++ b/code/fridge0.mdwn
@@ -0,0 +1,6 @@
+Fridge0 is a design for an offgrid, solar powered fridge
+
+[[blog/entry/fridge_0.1]]  
+[[blog/entry/fridge_0.2]]  
+
+<https://fridge0.branchable.com>

Added a comment: Radiative cooling for off-grid fridge
diff --git a/blog/entry/fridge_0.2/comment_1_4d06b1c362aaaebea4f076371f77cbe8._comment b/blog/entry/fridge_0.2/comment_1_4d06b1c362aaaebea4f076371f77cbe8._comment
new file mode 100644
index 00000000..0e602a2a
--- /dev/null
+++ b/blog/entry/fridge_0.2/comment_1_4d06b1c362aaaebea4f076371f77cbe8._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="thomas.robbins.15@4531f7ca2945620158e47204700a8d9d5214349b"
+ nickname="thomas.robbins.15"
+ avatar="http://cdn.libravatar.org/avatar/bddbe3a962bbfce80a1c248692484240"
+ subject="Radiative cooling for off-grid fridge"
+ date="2018-12-27T23:03:25Z"
+ content="""
+Hi Joey,
+
+For your next off-grid fridge project, consider:
+
+http://www.sciencemag.org/news/2017/02/cheap-plastic-film-cools-whatever-it-touches-10-c
+"""]]

blog update
diff --git a/blog/entry/git-annex_and_funding_update.mdwn b/blog/entry/git-annex_and_funding_update.mdwn
new file mode 100644
index 00000000..8c48dd4a
--- /dev/null
+++ b/blog/entry/git-annex_and_funding_update.mdwn
@@ -0,0 +1,21 @@
+[[code/git-annex]] v7 was released this fall, the culmination of a long effort to
+add some [important new features](http://git-annex.branchable.com/tips/unlocked_files/)
+to git-annex. Rather than go into details about it here, see 
+[this LWN article](https://lwn.net/Articles/774125/)
+comparing and contrasting git-annex with git lfs.
+
+For three years my work on git-annex had major support from Dartmouth's
+[DataLad](http://datalad.org/) project, pushing it into use in the 
+sciences, and driving large improvements in git-annex's API, concurrency
+support, etc. But that relied on government funding which has been drying up.
+Increasingly I have been relying on croudfunding from git-annex's users.
+
+Now I'm entering a new phase, where DataLad users may also want to support
+git-annex. So far, McGill's NeuroHub project has committed to supporting
+its development (funded by the Canada First Research Excellence Fund, 
+for the Healthy Brains for Healthy Lives initiative), but I hope others
+will too. A diversity of funding sources is best.
+
+A [survey of git-annex users](http://git-annex-survey.branchable.com/polls/2018/) 
+is now underway, the first in three years. If you've not already, please
+participate in it to help direct my newly funded work.

link to data
diff --git a/blog/entry/fridge_0.2.mdwn b/blog/entry/fridge_0.2.mdwn
index 88b6d522..35ed3699 100644
--- a/blog/entry/fridge_0.2.mdwn
+++ b/blog/entry/fridge_0.2.mdwn
@@ -2,7 +2,8 @@ My [[offgrid, solar powered, zero-battery-use fridge|fridge_0.1]]
 has sucessfully made it through spring, summer, fall, and more than enough winter.
 
 I've proven that it works. I've not gotten food poisoning, though I did lose
-half a gallon of milk on one super rainy week. I have piles of data, and
+half a gallon of milk on one super rainy week. I have 
+[piles of data](http://homepower.joeyh.name/fridge.html), and
 [a whole wiki](https://fridge0.branchable.com/) documenting how I built
 it. I've developed 3 thousand lines of control software. It purrs along
 without any assistance.

bigger
diff --git a/blog/entry/fridge_0.2.mdwn b/blog/entry/fridge_0.2.mdwn
index 18dff463..88b6d522 100644
--- a/blog/entry/fridge_0.2.mdwn
+++ b/blog/entry/fridge_0.2.mdwn
@@ -25,14 +25,14 @@ I mostly wanted to share [the wiki](https://fridge0.branchable.com/),
 in case someone wants to build something like this. And to post some data.
 Here's the summer and fall temperature data.
 
-[[!img pics/fridge_0.2/joeyh_dataset1.png size=320x]] [[!img pics/fridge_0.2/joeyh_dataset2.png size=320x]]  
+[[!img pics/fridge_0.2/joeyh_dataset1.png size=450x]] [[!img pics/fridge_0.2/joeyh_dataset2.png size=450x]]  
 ([More on temperature ranges here](https://fridge0.branchable.com/temperature_range/).)
 
 I want to be upfront that this is not guaranteed to work in every situation.
 Here's that time that the milk spoiled. A tropical storm was involved.
 Most of the time milk stays good 2 to 3 weeks in my fridge.
 
-[[!img pics/fridge_0.2/failure.png size=320x]]
+[[!img pics/fridge_0.2/failure.png size=450x]]
 
 Some things I might get around to doing eventually:
 

blog update
diff --git a/blog/entry/fridge_0.2.mdwn b/blog/entry/fridge_0.2.mdwn
new file mode 100644
index 00000000..18dff463
--- /dev/null
+++ b/blog/entry/fridge_0.2.mdwn
@@ -0,0 +1,48 @@
+My [[offgrid, solar powered, zero-battery-use fridge|fridge_0.1]] 
+has sucessfully made it through spring, summer, fall, and more than enough winter.
+
+I've proven that it works. I've not gotten food poisoning, though I did lose
+half a gallon of milk on one super rainy week. I have piles of data, and
+[a whole wiki](https://fridge0.branchable.com/) documenting how I built
+it. I've developed 3 thousand lines of control software. It purrs along
+without any assistance.
+
+Fridge0 consists of a
+[standard chest freezer](https://fridge0.branchable.com/chest_freezer/),
+an added [thermal mass](https://fridge0.branchable.com/thermal_mass/), an
+[inverter](https://fridge0.branchable.com/inverter/), and
+[computer control](https://fridge0.branchable.com/computer_control/). 
+It ties into the typical offfgrid system of a solar charge controller, 
+battery bank, and photovoltaic panels.
+
+This isn't going to solve global warming or anything, but it does seem
+much less expensive than traditional offgrid fridge systems, and
+it ties in with thinking on renewable power such as Low Tech magazine's
+[Redefining Energy Security](https://solar.lowtechmagazine.com/2018/12/keeping-some-of-the-lights-on-redefining-energy-security.html)
+"To improve energy security, we need to make infrastructures less reliable."
+
+I mostly wanted to share [the wiki](https://fridge0.branchable.com/),
+in case someone wants to build something like this. And to post some data.
+Here's the summer and fall temperature data.
+
+[[!img pics/fridge_0.2/joeyh_dataset1.png size=320x]] [[!img pics/fridge_0.2/joeyh_dataset2.png size=320x]]  
+([More on temperature ranges here](https://fridge0.branchable.com/temperature_range/).)
+
+I want to be upfront that this is not guaranteed to work in every situation.
+Here's that time that the milk spoiled. A tropical storm was involved.
+Most of the time milk stays good 2 to 3 weeks in my fridge.
+
+[[!img pics/fridge_0.2/failure.png size=320x]]
+
+Some things I might get around to doing eventually:
+
+* Using a supercapacitor to provide power while shutting down on loss of solar
+  power, instead of the current few minutes of use of batteries.
+* Also running a freezer, dividing up solar power between them.
+* A self-contained build with its own solar panels and electronics, instead of
+  the current build that uses my house's server and solar panels.
+* A full BOM or kit, just add solar panels and chest freezer
+  to quickly build your own.
+
+I probably won't be devoting much time to this in the upcoming year,
+but if anyone wants to build one I'm happy to help you.

add
diff --git a/blog/pics/fridge_0.2/failure.png b/blog/pics/fridge_0.2/failure.png
new file mode 100644
index 00000000..f7f1b625
Binary files /dev/null and b/blog/pics/fridge_0.2/failure.png differ
diff --git a/blog/pics/fridge_0.2/peak.jpeg b/blog/pics/fridge_0.2/peak.jpeg
new file mode 100644
index 00000000..44ba9643
Binary files /dev/null and b/blog/pics/fridge_0.2/peak.jpeg differ

add
diff --git a/blog/pics/fridge_0.2/joeyh_dataset1.png b/blog/pics/fridge_0.2/joeyh_dataset1.png
new file mode 100644
index 00000000..fae706c2
Binary files /dev/null and b/blog/pics/fridge_0.2/joeyh_dataset1.png differ
diff --git a/blog/pics/fridge_0.2/joeyh_dataset2.png b/blog/pics/fridge_0.2/joeyh_dataset2.png
new file mode 100644
index 00000000..35e05689
Binary files /dev/null and b/blog/pics/fridge_0.2/joeyh_dataset2.png differ

flow
diff --git a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
index d74bb555..b7bd86e1 100644
--- a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
+++ b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
@@ -41,6 +41,10 @@ much much worse after a recent snow storm, to the point that I was
 answering the phone by yelling "my phone line is broken" down the line
 consumed with static. 
 
+[[!img pics/att/cartoon.png alt="cartoon of room 641A, red lines on a
+screen connect 'nowden', Applebaum, Hess and 'unar' above a 'land line inactive'.
+Speech bubble: My Holidaze came early this year!" size=640x]]
+
 Design your bug tracking system to not let the user really communicate with
 you. You know what's wrong better than them.
 
@@ -48,10 +52,6 @@ And certianly don't try to reproduce the circumstances of the bug report.
 No need to visit my house and check the outside line when
 you've already identified and clearly fixed the problem at the pole.
 
-[[!img pics/att/cartoon.png alt="cartoon of room 641A, red lines on a
-screen connect 'nowden', Applebaum, Hess and 'unar' above a 'land line inactive'.
-Speech bubble: My Holidaze came early this year!" size=640x]]
-
 My second bug report is "no dial tone" with access information "on porch
 end of long driveway". With that, I seem to be trying to solicit some kind
 of contact outside the bug tracking system. That is never a good idea

freudian typo
diff --git a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
index 70e3fae5..d74bb555 100644
--- a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
+++ b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
@@ -30,7 +30,7 @@ bows prevent any possible damage by tractor. Can always refactor more later.
 [[!img pics/att/attfestivebow.jpg alt="phone cable tied to pole" size=400x]]
 
 The only other information included in my bug report was
-"house at end of loong driveway". AT&T helfully limited the size
+"house at end of loong driveway". AT&T helpfully limited the size
 of the field to something smaller than 1 (old-style) tweet, 
 to prevent some long brain dump being put in there.
 

scale
diff --git a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
index 65e288e2..70e3fae5 100644
--- a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
+++ b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
@@ -50,7 +50,7 @@ you've already identified and clearly fixed the problem at the pole.
 
 [[!img pics/att/cartoon.png alt="cartoon of room 641A, red lines on a
 screen connect 'nowden', Applebaum, Hess and 'unar' above a 'land line inactive'.
-Speech bubble: My Holidaze came early this year!"]]
+Speech bubble: My Holidaze came early this year!" size=640x]]
 
 My second bug report is "no dial tone" with access information "on porch
 end of long driveway". With that, I seem to be trying to solicit some kind

oop
diff --git a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
index 9a999b56..65e288e2 100644
--- a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
+++ b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
@@ -48,7 +48,7 @@ And certianly don't try to reproduce the circumstances of the bug report.
 No need to visit my house and check the outside line when
 you've already identified and clearly fixed the problem at the pole.
 
-[[!img pics/att/cartoon.jpg alt="cartoon of room 641A, red lines on a
+[[!img pics/att/cartoon.png alt="cartoon of room 641A, red lines on a
 screen connect 'nowden', Applebaum, Hess and 'unar' above a 'land line inactive'.
 Speech bubble: My Holidaze came early this year!"]]
 

oop
diff --git a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
index c8083d81..9a999b56 100644
--- a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
+++ b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
@@ -1,7 +1,7 @@
 I'm pleased to have [teamed up with AT&T](https://www.theatlantic.com/technology/archive/2018/12/influencers-are-faking-brand-deals/578401/)
 to bring you this illustrated guide to effective bug tracking.
 
-[[!img pics/att/attwtf.jpg alt="telephone pole with phone box spewing wires, and several obviously cut cables attaches"]]
+[[!img pics/att/attwtf.jpg alt="telephone pole with phone box spewing wires, and several obviously cut cables attaches" size=400x]]
 
 The original issue description was "noise / static on line", and as we
 can see, AT&T have very effectively closed the ticket:
@@ -13,7 +13,7 @@ sure to close the problem ticket immediately on fixing. Do not followup with the
 issue reporter, or contact them in any way to explain how the issue was
 resolved.
 
-[[!img pics/att/attrefactor.jpg alt="telephone pole with phone wire wrapped down it and extending across the ground"]]
+[[!img pics/att/attrefactor.jpg alt="telephone pole with phone wire wrapped down it and extending across the ground" size=400x]]
 
 While in the guts of the system fixing such a bug report, you'll probably
 see something that could be improved by some light refactoring. It's always
@@ -27,7 +27,7 @@ to run a new line between two poles involved in my bug report, they simply
 ran it along the ground next to my neighbor's barn. A few festive loops and
 bows prevent any possible damage by tractor. Can always refactor more later.
 
-[[!img pics/att/attrefactor.jpg alt="phone cable tied to pole"]]
+[[!img pics/att/attfestivebow.jpg alt="phone cable tied to pole" size=400x]]
 
 The only other information included in my bug report was
 "house at end of loong driveway". AT&T helfully limited the size

add
diff --git a/blog/pics/att/attfestivebow.jpg b/blog/pics/att/attfestivebow.jpg
new file mode 100644
index 00000000..b9c29b53
Binary files /dev/null and b/blog/pics/att/attfestivebow.jpg differ
diff --git a/blog/pics/att/attrefactor.jpg b/blog/pics/att/attrefactor.jpg
new file mode 100644
index 00000000..6d1ff8ed
Binary files /dev/null and b/blog/pics/att/attrefactor.jpg differ
diff --git a/blog/pics/att/attwtf.jpg b/blog/pics/att/attwtf.jpg
new file mode 100644
index 00000000..9d8df840
Binary files /dev/null and b/blog/pics/att/attwtf.jpg differ
diff --git a/blog/pics/att/cartoon.png b/blog/pics/att/cartoon.png
new file mode 100644
index 00000000..49927ba9
Binary files /dev/null and b/blog/pics/att/cartoon.png differ
diff --git a/blog/pics/att/santanote.jpg b/blog/pics/att/santanote.jpg
new file mode 100644
index 00000000..df196ad4
Binary files /dev/null and b/blog/pics/att/santanote.jpg differ

blog update
diff --git a/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
new file mode 100644
index 00000000..c8083d81
--- /dev/null
+++ b/blog/entry/effective_bug_tracking_illustrated_with_ATT.mdwn
@@ -0,0 +1,72 @@
+I'm pleased to have [teamed up with AT&T](https://www.theatlantic.com/technology/archive/2018/12/influencers-are-faking-brand-deals/578401/)
+to bring you this illustrated guide to effective bug tracking.
+
+[[!img pics/att/attwtf.jpg alt="telephone pole with phone box spewing wires, and several obviously cut cables attaches"]]
+
+The original issue description was "noise / static on line", and as we
+can see, AT&T have very effectively closed the ticket:
+There is no longer any noise, of any kind, on the phone line.
+
+No electrons == no noise, so this is the absolute simplest and most
+effective fix possible. Always start with the simplest such fix, and be
+sure to close the problem ticket immediately on fixing. Do not followup with the
+issue reporter, or contact them in any way to explain how the issue was
+resolved.
+
+[[!img pics/att/attrefactor.jpg alt="telephone pole with phone wire wrapped down it and extending across the ground"]]
+
+While in the guts of the system fixing such a bug report, you'll probably
+see something that could be improved by some light refactoring. It's always
+a good idea to do that right away, because refactoring can often just
+solves an issue on its own somehow. (Never use your own issue tracking
+system to report issues to yourself to deal with later, because that would
+just be bonkers.)
+
+But don't go overboard with refactoring. As we see here, when AT&T decided
+to run a new line between two poles involved in my bug report, they simply
+ran it along the ground next to my neighbor's barn. A few festive loops and
+bows prevent any possible damage by tractor. Can always refactor more later.
+
+[[!img pics/att/attrefactor.jpg alt="phone cable tied to pole"]]
+
+The only other information included in my bug report was
+"house at end of loong driveway". AT&T helfully limited the size
+of the field to something smaller than 1 (old-style) tweet, 
+to prevent some long brain dump being put in there.
+
+You don't want to hear that I've lived here for 7 years and the buried line
+has never been clean but's been getting a bit more noisy lately, or that I
+noticed signs of water ingress at two of the junction boxes, or that it got
+much much worse after a recent snow storm, to the point that I was
+answering the phone by yelling "my phone line is broken" down the line
+consumed with static. 
+
+Design your bug tracking system to not let the user really communicate with
+you. You know what's wrong better than them.
+
+And certianly don't try to reproduce the circumstances of the bug report.
+No need to visit my house and check the outside line when
+you've already identified and clearly fixed the problem at the pole.
+
+[[!img pics/att/cartoon.jpg alt="cartoon of room 641A, red lines on a
+screen connect 'nowden', Applebaum, Hess and 'unar' above a 'land line inactive'.
+Speech bubble: My Holidaze came early this year!"]]
+
+My second bug report is "no dial tone" with access information "on porch
+end of long driveway". With that, I seem to be trying to solicit some kind
+of contact outside the bug tracking system. That is never a good idea
+though, and AT&T should instruct their linemen to avoid any possible
+contact with the user, or any attempts to convey information outside the
+issue tracking system.
+
+[[!img pics/att/santanote.jpg alt="laminated handwritten note pinned to
+phone pole with one red and one green pin. reads: Buried phone line was cut
+by last lineman -- please repair. House 500 ft up driveway has no dialtone.
+Santa, all I want for Xmas is a dialtone!"]]
+
+AT&T's issue tracking system reports
+"Service Restore Date:  12/25/2018 at 12:00 AM"
+but perhaps they'll provide more effective issue tracking tips for me to
+share with you. Watch this space.
+
+[[!meta title="effective bug tracking illustrated with AT&T"]]
diff --git a/boxen.mdwn b/boxen.mdwn
index 492da0cf..66d27593 100644
--- a/boxen.mdwn
+++ b/boxen.mdwn
@@ -67,8 +67,8 @@ Flying insects.
 * [[dragonfly]]
 * [[gnat]]
 * [[moth]] {*} (Mom's)
-* [[butterfly]] {*} (Anna's)
-* [[fly]] {*} (Anna's)
+* [[butterfly]] (Anna's)
+* [[fly]] (Anna's)
 
 ## desktops
 

Added a comment: Chroots and disk images are properties of hosts
diff --git a/blog/entry/propelling_disk_images/comment_4_1d5d318ffa6e70c5f90f2e57909819eb._comment b/blog/entry/propelling_disk_images/comment_4_1d5d318ffa6e70c5f90f2e57909819eb._comment
new file mode 100644
index 00000000..0e8024f2
--- /dev/null
+++ b/blog/entry/propelling_disk_images/comment_4_1d5d318ffa6e70c5f90f2e57909819eb._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="diane@d02701b3d70f84d667f39e4b05008c653d390ff3"
+ nickname="diane"
+ avatar="http://cdn.libravatar.org/avatar/cc4527dbd49491e829732a2a8f5ee041"
+ subject="Chroots and disk images are properties of hosts"
+ date="2018-12-04T22:32:57Z"
+ content="""
+It wasn't obvious when I was reading this page, but chroots and containers need to be attached to real hosts that run the commands and host the resulting containers. It's a bit clearer at <a href=\"https://joeyh.name/blog/entry/propelling_containers/\">/blog/entry/propeling_containers/</a>, but I read this page first.
+"""]]

removed
diff --git a/blog/entry/propelling_containers/comment_1_b4939ce3944b3e157817b966c672ef68._comment b/blog/entry/propelling_containers/comment_1_b4939ce3944b3e157817b966c672ef68._comment
deleted file mode 100644
index 641d6b03..00000000
--- a/blog/entry/propelling_containers/comment_1_b4939ce3944b3e157817b966c672ef68._comment
+++ /dev/null
@@ -1,10 +0,0 @@
-[[!comment format=mdwn
- username="diane@d02701b3d70f84d667f39e4b05008c653d390ff3"
- nickname="diane"
- avatar="http://cdn.libravatar.org/avatar/cc4527dbd49491e829732a2a8f5ee041"
- subject="Containers are properties of real hosts"
- date="2018-12-04T22:27:27Z"
- content="""
-It wasn't immediately obvious to me when I started looking at propellor today, but as far as I can tell containers (or images) need to be attached to a real host that will actually be building the chroot, container, or image.
-
-"""]]

Added a comment: Containers are properties of real hosts
diff --git a/blog/entry/propelling_containers/comment_1_b4939ce3944b3e157817b966c672ef68._comment b/blog/entry/propelling_containers/comment_1_b4939ce3944b3e157817b966c672ef68._comment
new file mode 100644
index 00000000..641d6b03
--- /dev/null
+++ b/blog/entry/propelling_containers/comment_1_b4939ce3944b3e157817b966c672ef68._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="diane@d02701b3d70f84d667f39e4b05008c653d390ff3"
+ nickname="diane"
+ avatar="http://cdn.libravatar.org/avatar/cc4527dbd49491e829732a2a8f5ee041"
+ subject="Containers are properties of real hosts"
+ date="2018-12-04T22:27:27Z"
+ content="""
+It wasn't immediately obvious to me when I started looking at propellor today, but as far as I can tell containers (or images) need to be attached to a real host that will actually be building the chroot, container, or image.
+
+"""]]

fix indent
diff --git a/blog/entry/7drl_2015_day_5_type_directed_spell_system_development.mdwn b/blog/entry/7drl_2015_day_5_type_directed_spell_system_development.mdwn
index 24c0a632..8757454b 100644
--- a/blog/entry/7drl_2015_day_5_type_directed_spell_system_development.mdwn
+++ b/blog/entry/7drl_2015_day_5_type_directed_spell_system_development.mdwn
@@ -67,7 +67,7 @@ runDream :: M NextStep -> M NextStep -> (S -> S) -> M NextStep
 runDream sleepcont wakecont wakeupstate = go =<< sleepcont
    where
          go (NextStep v ms) = return $ NextStep v $ Just $
-	 	maybe wake (go <=<) ms
+                 maybe wake (go <=<) ms
          wake _evt = do
                  modify wakeupstate
                  wakecont

update for android
diff --git a/blog/entry/howto_create_your_own_time_zone.mdwn b/blog/entry/howto_create_your_own_time_zone.mdwn
index 6759a153..b0adecc1 100644
--- a/blog/entry/howto_create_your_own_time_zone.mdwn
+++ b/blog/entry/howto_create_your_own_time_zone.mdwn
@@ -48,6 +48,12 @@ Previously:
 * [[daylight_savings_crime]]
 * [[fall_back_day]]
 
+Also, for Android:
+
+Android does not seem to have an way to define your own time zone.
+I select Barbados from the time zone list, since it is on GMT-4 year round
+with no daylight savings.
+
 [[!tag time lay linux shell]]
 
 [[!meta title="howto: create your own time zone"]]

Added a comment: Spam filtering?
diff --git a/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_3_dce25809159fee9e304697c6fd181d09._comment b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_3_dce25809159fee9e304697c6fd181d09._comment
new file mode 100644
index 00000000..a8da07fc
--- /dev/null
+++ b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_3_dce25809159fee9e304697c6fd181d09._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="wolfgangmcq@074ec4390fede297d02c2520b017d079f7f8e7b3"
+ nickname="wolfgangmcq"
+ avatar="http://cdn.libravatar.org/avatar/626641784f75a42ad8a6a86e3dc8bc62"
+ subject="Spam filtering?"
+ date="2018-11-09T21:14:37Z"
+ content="""
+I wonder if your comment tripped a spam filter, rather than a coverup? 'Google \"keywords\" for more' is a phrase I see in a lot of comment-spam I get where they're trying to avoid rules that quarantine comments with links in them by instead including carefully selected search keywords which will turn up only the target site.
+
+Your information about censored Amazon review of Sandisk Ultra 32GB Micro SDHC Card is very helpful, thanks! You could get it much higher in search results with a search results optimization service, Google \"Wolfgang's Amazing Search Trick\" for more information.
+"""]]

update
diff --git a/blog/entry/completely_linux_distribution-independent_packaging.mdwn b/blog/entry/completely_linux_distribution-independent_packaging.mdwn
index 0c3d2834..5ce583a1 100644
--- a/blog/entry/completely_linux_distribution-independent_packaging.mdwn
+++ b/blog/entry/completely_linux_distribution-independent_packaging.mdwn
@@ -31,6 +31,10 @@ be working on embedded systems as odd as the Synology NAS, and it's already
 been verified to work on Raspbian. (I'm curious if it would work on
 Android, but that might be a stretch.)
 
+[Update:
+It *does* work on Android, indeed this is how git-annex is ported to
+Android now. Saved an amazing amount of bother with cross-compilation.]
+
 Currently these tarballs are built for a specific architecture, but there's
 no particular reason a single one couldn't combine binaries built for each
 supported architecture.

co2
diff --git a/thanks.mdwn b/thanks.mdwn
index c27092cd..c2ac1124 100644
--- a/thanks.mdwn
+++ b/thanks.mdwn
@@ -5,4 +5,6 @@ more tangible options:
 * paypal joey@kitenet.net
 * [support me on Patreon](https://patreon.com/joeyh) or [Liberapay](https://liberapay.com/joeyh/)
 * [My Amazon wishlist](http://www.amazon.com/gp/registry/registry.html/104-5960215-8415137?ie=UTF8&type=wishlist&id=H9MGKNPCYVS2)
-* bitcoin address: <a href="bitcoin:[[!inline raw=yes pages=bitcoin]]">[[!inline raw=yes pages=bitcoin]]</a>
+* bitcoin address: <a href="bitcoin:[[!inline raw=yes pages=bitcoin]]">[[!inline raw=yes pages=bitcoin]]</a>  
+  (Due to the excessive CO2 use of bitcoin transactions, I currently prefer
+  not to use bitcoin though.)

update
diff --git a/boxen.mdwn b/boxen.mdwn
index 6b191d69..492da0cf 100644
--- a/boxen.mdwn
+++ b/boxen.mdwn
@@ -14,6 +14,7 @@ Mostly mythical creatures.
 * kiwi {*} (Anna's)
 * aquamiser2 {*} (Mark's)
 * peregrine {*} (Mom's)
+* sow {*} (Dad's)
 * [[kodama]]
 * [[phoenix]]
 * [[dragon]]

more
diff --git a/boxen.mdwn b/boxen.mdwn
index 1c5a95a2..6b191d69 100644
--- a/boxen.mdwn
+++ b/boxen.mdwn
@@ -40,7 +40,7 @@ Mostly birds.
 * [[pell]] {*}
 * orca
 * [[diatom]]
-* [[elephant]] {*}
+* [[elephant]]
 * [[clam]] {*}
 * [[mayfly]] {*}
 * [[oyster]] {*}

elephant decomissioning
diff --git a/code/scroll.mdwn b/code/scroll.mdwn
index c70eddc3..b95868c0 100644
--- a/code/scroll.mdwn
+++ b/code/scroll.mdwn
@@ -12,9 +12,8 @@ BTW, `scroll` is also a functional unix file pager, like `less` or `more`.
 
 ## play `scroll`
 
-For a quick play on the web, there are two demo servers up!
+For a quick play on the web, there is a demo server!
 
-* EU <http://eu.scroll.joeyh.name:4242/>
 * US <http://us.scroll.joeyh.name:4242/>
 
 ## build `scroll` from source

Added a comment: re: udisks2
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_15_7cc2f88619ae5924c248d0afbde1017b._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_15_7cc2f88619ae5924c248d0afbde1017b._comment
new file mode 100644
index 00000000..14b174f9
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_15_7cc2f88619ae5924c248d0afbde1017b._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="pabs3@49c776417680694a0f3295ee80df4edfca300096"
+ nickname="pabs3"
+ avatar="http://cdn.libravatar.org/avatar/3bf5f3b29a3d68ddf11eb1a3d8c5dc65"
+ subject="re: udisks2 "
+ date="2018-09-30T10:47:27Z"
+ content="""
+The documentation (quoted below) is a bit vague about exactly what it does, but it seems like does more than just disabling the port and probably does better at flushing caches than just unmounting.
+
+> power-off Arranges for the drive to be safely removed and powered off. On the OS side this includes ensuring that no process is using the drive, then requesting that in-flight buffers and caches are committed to stable storage. The exact steps for powering off the drive depends on the drive itself and the interconnect used. For drives connected through USB, the effect is that the USB device will be deconfigured followed by disabling the upstream hub port it is connected to. Note that as some physical devices contain multiple drives (for example 4-in-1 flash card reader USB devices) powering off one drive may affect other drives. As such there are not a lot of guarantees associated with performing this action. Usually the effect is that the drive disappears as if it was unplugged.
+
+"""]]

comment
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_14_d05fdc21e49b9690de6d8d44eaa871c7._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_14_d05fdc21e49b9690de6d8d44eaa871c7._comment
new file mode 100644
index 00000000..d2fa0a3b
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_14_d05fdc21e49b9690de6d8d44eaa871c7._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""re: udisks2"""
+ date="2018-09-29T17:06:40Z"
+ content="""
+@pabs3, `udisksctl power-off --block-device /dev/disk/by-label/passport`
+does cause udev to remove the device file, it does not seem any better than
+`udevadm trigger --action=remove` in this situation though, because systemd
+has already unmounted the disk before that runs.
+
+The only difference I notice is that it disconnects the hub port, but that
+leaves it powered on, so uhubctl is still needed to power off.
+
+Unless it's better at getting caches flushed to the disk or something like that?
+"""]]

Added a comment: udisks2?
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_13_e99ffb613ff1c3620bfa37b8a65c7a91._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_13_e99ffb613ff1c3620bfa37b8a65c7a91._comment
new file mode 100644
index 00000000..087a8709
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_13_e99ffb613ff1c3620bfa37b8a65c7a91._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="pabs3@49c776417680694a0f3295ee80df4edfca300096"
+ nickname="pabs3"
+ avatar="http://cdn.libravatar.org/avatar/3bf5f3b29a3d68ddf11eb1a3d8c5dc65"
+ subject="udisks2?"
+ date="2018-09-29T07:48:25Z"
+ content="""
+Have you considered using `udisksctl power-off` to turn off the USB drives safely before shutting off power to their ports? That uses the same mechanisms as the \"safely eject\" GUI options and I think that would safer and might solve the timing issues.
+"""]]

response
diff --git a/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_2_64a2d2cdb13c9696aaf2cb2066858c42._comment b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_2_64a2d2cdb13c9696aaf2cb2066858c42._comment
new file mode 100644
index 00000000..d92a513b
--- /dev/null
+++ b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_2_64a2d2cdb13c9696aaf2cb2066858c42._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2018-09-22T16:48:39Z"
+ content="""
+f3 does not detect the card as a fake. Although it did have a write failure
+half way through the scan, perhaps due to overheating. Or due to a low
+quality though full capacity flash chip used in a fake.
+
+And I could be wrong about that, despite the other indications. But a
+reviewer can of course be wrong about anything, that's not a reason to
+censor their review.
+"""]]

response
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_12_2f03fdccbb5aebf54aa96a1ecfa151e0._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_12_2f03fdccbb5aebf54aa96a1ecfa151e0._comment
new file mode 100644
index 00000000..a5ebb937
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_12_2f03fdccbb5aebf54aa96a1ecfa151e0._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""Re: Relay questions"""
+ date="2018-09-22T15:56:00Z"
+ content="""
+Yes, it's a good old fashioned relay, but it's under the computer's control.
+
+For example, this relay <https://www.sparkfun.com/products/13815> can be
+controlled by a GPIO port, consumes 0.6 watts of power to run
+and can switch 15 amps of AC current. I'm happily using several of them for
+other projects.
+
+My USB hub is actually powered by 24V DC, which comes from my solar charge
+controller's load port, which is also switched by computer control. That
+line also powers a more beefy 24V industrial relay that I had lying
+around, which can switch a lot more power but does consume 5 watts when
+run. I'll probably downgrade that relay at some point but an extra 5 watts
+when the drives are running is not a big deal.
+"""]]

Added a comment: Relay questions
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_11_6e27f5918d7fd75f436ca8af81862738._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_11_6e27f5918d7fd75f436ca8af81862738._comment
new file mode 100644
index 00000000..3475972a
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_11_6e27f5918d7fd75f436ca8af81862738._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="max@b5056edb4ef368a70ed36cec08d6d819d418872f"
+ nickname="max"
+ avatar="http://cdn.libravatar.org/avatar/cfa51855bbf2842e7ddce18aea1947ea"
+ subject="Relay questions"
+ date="2018-09-22T00:58:00Z"
+ content="""
+When you mention relay, do you mean the electromechanical devices? If so, do you measure the current consumption of the relay coil when it's energized?  
+
+Also, what is the relay doing for you if it's manually actuated? Is it in place for future automation? It seems the relay could otherwise safely be a regular mechanical switch in this relatively low power application.
+"""]]

Added a comment
diff --git a/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_1_068ff7fa9167a9887f5d73b696f0141a._comment b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_1_068ff7fa9167a9887f5d73b696f0141a._comment
new file mode 100644
index 00000000..4ee92b4d
--- /dev/null
+++ b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card/comment_1_068ff7fa9167a9887f5d73b696f0141a._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="anarcat"
+ avatar="http://cdn.libravatar.org/avatar/4ad594c1e13211c1ad9edb81ce5110b7"
+ subject="comment 1"
+ date="2018-09-21T14:06:28Z"
+ content="""
+Those things are a plague... It's surprising how many cards are fake! I've been maintaining the [f3 package](https://tracker.debian.org/f3) in Debian for a bit now and I've tested it against a few keys. Some show up as fake, but I'm pretty sure it misses a few. I'm curious to see what it would make of your key.
+
+This is one of the reasons I don't buy at Amazon (anymore): on top of horrible worker conditions, returns are hard or impossible to carry out. At the corner store, I can and do go back and tell them their stuff is crap, and they actually care about fixing that because customers are in their face and won't come back if they don't fix it. :)
+"""]]

updated
diff --git a/blog/entry/usb_drives_with_no_phantom_load.mdwn b/blog/entry/usb_drives_with_no_phantom_load.mdwn
index 1f28a99b..cea81916 100644
--- a/blog/entry/usb_drives_with_no_phantom_load.mdwn
+++ b/blog/entry/usb_drives_with_no_phantom_load.mdwn
@@ -45,6 +45,7 @@ The `sleep 20` is a bit unfortunate, it seems that it can take a few seconds for
 the drive to power up enough for the kernel to see it, and so without that the
 mount can fail, leaving the drive powered on indefinitely. Seems there
 ought to be a way to declare an additional dependency and avoid needing that sleep?
+Update: See my comment below for a better way.
 
 Finally, the automount unit for the drive, media-joey-passport.automount:
 
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_10_7ba06f3deb9a7a5aa9750014e65a0e3f._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_10_7ba06f3deb9a7a5aa9750014e65a0e3f._comment
new file mode 100644
index 00000000..4e3a743b
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_10_7ba06f3deb9a7a5aa9750014e65a0e3f._comment
@@ -0,0 +1,34 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 10"""
+ date="2018-09-19T18:46:30Z"
+ content="""
+@grawity hmm, that's promising, the sysfs uvent file did not trigger udev,
+but "udevadm trigger --action=remove /sys/class/block/sdb1" does
+remove links to it in /dev/disk/by-label/, though /dev/sdb1 remains
+present.
+
+And yeah, systemd's dependency on the device does work properly then,
+it delays mounting until the drive has spun up.
+
+Ah, even easier, "udevadm trigger --action=remove /dev/disk/by-label/passport"
+does the same thing without needing to find the sysfs path.
+
+So, I've changed the service file for the hub port to look like this:
+
+	[Unit]
+	Description=Startech usb hub port 4
+	PartOf=media-joey-passport.mount
+	[Service]
+	Type=oneshot
+	RemainAfterExit=true
+	ExecStart=/usr/sbin/uhubctl -a on -p 4
+	ExecStop=/bin/sh -c 'uhubctl -a off -p 4 ; udevadm trigger --action=remove /dev/disk/by-label/passport || true'
+
+/bin/sh actually needed now since a failure of udevadm due to the 
+label not existing etc needs to be ignored.
+
+Kind of ugly that the service file for the hub port needs to know the label
+of the disk, but since I'm generating these service files not using systemd's
+limited templates, but from Haskell code, it was easy to extend to include that.
+"""]]

blog update
diff --git a/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card.mdwn b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card.mdwn
new file mode 100644
index 00000000..801bfad2
--- /dev/null
+++ b/blog/entry/censored_Amazon_review_of_Sandisk_Ultra_32GB_Micro_SDHC_Card.mdwn
@@ -0,0 +1,23 @@
+> ★ counterfeits in amazon pipeline
+> 
+> The 32 gb card I bought here at Amazon turned out to be fake. Within days I was
+> getting read errors, even though the card was still mostly empty.
+> 
+> The logo is noticably blurry compared with a 32 gb card purchased elsewhere.
+> Also, the color of the grey half of the card is subtly wrong, and the lettering
+> is subtly wrong.
+> 
+> Amazon apparently has counterfiet stock in their pipeline, google "amazon
+> counterfiet" for more.
+
+You will not find this review on 
+[Sandisk Ultra 32GB Micro SDHC UHS-I Card with Adapter - 98MB/s U1 A1 - SDSQUAR-032G-GN6MA ](https://www.amazon.com/gp/product/B073JWXGNT/ref=oh_aui_detailpage_o02_s01?ie=UTF8&psc=1)
+because it was rejected. As far as I can tell my review violates none of Amazon's 
+[posted guidelines](http://www.amazon.com/review-guidelines).
+But it's specific about how to tell this card is counterfeit, and it mentions 
+[a](https://petapixel.com/2018/05/31/beware-amazon-still-sells-counterfeit-memory-cards/)
+[real](https://www.theatlantic.com/technology/archive/2018/04/amazon-may-have-a-counterfeit-problem/558482/) 
+[and](https://www.engadget.com/2018/05/31/fulfilled-by-amazon-counterfeit-fake/)
+[ongoing](https://www.axios.com/amazon-counterfeit-fake-products-8dedb8f9-4828-4c80-b7f7-76a724ad117e.html)
+[issue](https://www.diyphotography.net/psa-fake-sandisk-memory-cards-are-everywhere-including-amazon/)
+that Amazon clearly wants to cover up.

Added a comment: With unison
diff --git a/blog/entry/locking_down_ssh_authorized_keys/comment_3_0a9e26f4882326f822388833ea8e1d49._comment b/blog/entry/locking_down_ssh_authorized_keys/comment_3_0a9e26f4882326f822388833ea8e1d49._comment
new file mode 100644
index 00000000..9eab623b
--- /dev/null
+++ b/blog/entry/locking_down_ssh_authorized_keys/comment_3_0a9e26f4882326f822388833ea8e1d49._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~cassou"
+ nickname="cassou"
+ avatar="http://cdn.libravatar.org/avatar/b393bcb0caac9d23ede8fbacf2990f69469c22bd4a6a60fa4ff7bf51e7273c1f"
+ subject="With unison"
+ date="2018-09-12T08:56:25Z"
+ content="""
+Add that to your authorized_keys file on the host to restrict usage of the key to unison:
+
+    # Look at manpage sshd(8) for more information on options
+    command=\"unison -server\",restrict ssh-rsa ...the key...
+
+"""]]

Added a comment
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_9_c4bdf81496c5f507821a26aa5a8e98ea._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_9_c4bdf81496c5f507821a26aa5a8e98ea._comment
new file mode 100644
index 00000000..ff68d62e
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_9_c4bdf81496c5f507821a26aa5a8e98ea._comment
@@ -0,0 +1,19 @@
+[[!comment format=mdwn
+ username="grawity@2ea26be48562f66fcb9b66307da72b1e2e37453f"
+ nickname="grawity"
+ avatar="http://cdn.libravatar.org/avatar/7003e967f47003bae82966aa373de8ef"
+ subject="comment 9"
+ date="2018-09-10T04:44:37Z"
+ content="""
+> udev keeps the disk device files in place. Attempting to access the device then leads to an IO error, and then udev notices the device is gone and removes its files
+
+Udev maintains `/dev/disk/*` symlinks and systemd's .device units, but it relies 100% on receiving the kernel's uevents to trigger the maintenance. (For that matter, the actual `/dev/sd*` nodes are created by the kernel itself via devtmpfs, not by udev anymore.)
+
+Therefore that's a kernel problem. (Or... maybe just the way uhubctl works? Does the kernel even _know_ that the port is now powered off? I think it doesn't, because uhubctl sort of bypasses the whole USB stack.)
+
+I wonder what happens if you try to fake a kernel uevent using `udevadm trigger --action=remove /sys/<sysfs_path>` after the poweroff. (Or `echo remove > /sys/<sysfs_path>/uevent`.) That won't remove the device from kernel, just poke udev about its supposed removal.
+
+> https://www.spinics.net/lists/linux-usb/msg157413.html
+
+Aha. That's unfortunate. (Even though \"the API can always be enlarged\" I wouldn't hold my breath...) 
+"""]]

Added a comment
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_8_923f2e7da8fae9ebcb4417a663b15886._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_8_923f2e7da8fae9ebcb4417a663b15886._comment
new file mode 100644
index 00000000..1e82e86a
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_8_923f2e7da8fae9ebcb4417a663b15886._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="grawity@2ea26be48562f66fcb9b66307da72b1e2e37453f"
+ nickname="grawity"
+ avatar="http://cdn.libravatar.org/avatar/7003e967f47003bae82966aa373de8ef"
+ subject="comment 8"
+ date="2018-09-10T04:42:56Z"
+ content="""
+> In systemd unit this line probably doesn't mean what you seem to think it does
+
+No, it means exactly that. Multiple commands in ExecStart= separated by a standalone `;` token have been supported for a very long time. (Though they don't always make sense logically – e.g. if you have Type=forking, which command is supposed to be the daemon? why aren't they ExecStartPre's instead? – but in a `Type=oneshot` this usage is fine.)
+"""]]

comment
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_7_cd5572bcc465858890cf129f0b218844._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_7_cd5572bcc465858890cf129f0b218844._comment
new file mode 100644
index 00000000..2c40ea0e
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_7_cd5572bcc465858890cf129f0b218844._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 7"""
+ date="2018-09-09T22:28:23Z"
+ content="""
+<https://www.spinics.net/lists/linux-usb/msg157413.html>
+"""]]

comments
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_5_15393a74da8d1fd466a65a11ad284023._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_5_15393a74da8d1fd466a65a11ad284023._comment
new file mode 100644
index 00000000..b456a4dc
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_5_15393a74da8d1fd466a65a11ad284023._comment
@@ -0,0 +1,27 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""re: systemd unit syntax error"""
+ date="2018-09-09T16:24:47Z"
+ content="""
+No, my syntax is correct and works. According to systemd.syntax(7):
+
+	Empty lines and lines starting with "#" or ";" are ignored, which 
+	may be used for commenting.
+
+Nothing about use of those characters further into a line.
+
+(Some of systemd's docs do contain examples of using sh -c and escaping
+semicolons, so perhaps this has changed since earlier versions. Multiple
+ExecStart lines is another way to run multiple commands.)
+
+But in fact, the example I gave works. You can see the 20 second delay in the
+journal:
+
+	Sep 09 12:32:24 honeybee systemd[1]: Starting Startech usb hub port 4...
+	Sep 09 12:32:26 honeybee uhubctl[18819]: Current status for hub 2-1 [0409:005a, USB 2.00, 4 ports]
+	Sep 09 12:32:26 honeybee uhubctl[18819]:   Port 4: 0000 off
+	Sep 09 12:32:26 honeybee uhubctl[18819]: Sent power on request
+	Sep 09 12:32:26 honeybee uhubctl[18819]: New status for hub 2-1 [0409:005a, USB 2.00, 4 ports]
+	Sep 09 12:32:26 honeybee uhubctl[18819]:   Port 4: 0101 power connect [0480:0200]
+	Sep 09 12:32:46 honeybee systemd[1]: Started Startech usb hub port 4.
+"""]]
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_6_c6dbe656e101c3097d73b1aeed76c173._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_6_c6dbe656e101c3097d73b1aeed76c173._comment
new file mode 100644
index 00000000..bfc300d1
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_6_c6dbe656e101c3097d73b1aeed76c173._comment
@@ -0,0 +1,37 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 6"""
+ date="2018-09-09T16:49:36Z"
+ content="""
+@grawity, I tried the Requires on the device label,
+but it does not avoid the problem:
+
+	root@honeybee:/etc/systemd/system>ls /media/joey/archive-12
+	ls: cannot open directory '/media/joey/archive-12': No such device
+
+	Sep 09 13:33:50 honeybee systemd[1]: Starting Startech usb hub port 3...
+	Sep 09 13:33:50 honeybee uhubctl[23224]: Current status for hub 2-1 [0409:005a, USB 2.00, 4 ports]
+	Sep 09 13:33:50 honeybee uhubctl[23224]:   Port 3: 0000 off
+	Sep 09 13:33:50 honeybee uhubctl[23224]: Sent power on request
+	Sep 09 13:33:50 honeybee uhubctl[23224]: New status for hub 2-1 [0409:005a, USB 2.00, 4 ports]
+	Sep 09 13:33:50 honeybee uhubctl[23224]:   Port 3: 0101 power connect [1058:25ee]
+	Sep 09 13:33:50 honeybee systemd[1]: Started Startech usb hub port 3.
+	Sep 09 13:33:50 honeybee systemd[1]: Mounting archive-12...
+	Sep 09 13:33:50 honeybee systemd[1]: media-joey-archive\x2d12.mount: Mount process exited, code=exited status=32
+	Sep 09 13:33:50 honeybee systemd[1]: media-joey-archive\x2d12.mount: Failed with result 'exit-code'.
+	Sep 09 13:33:50 honeybee systemd[1]: Failed to mount archive-12.
+
+Ah, I think I see why. After the usb port is shut down, udev keeps the disk
+device files in place. Attempting to access the device then leads to an IO error,
+and *then* udev notices the device is gone and removes its files. So
+systemd's dependencies are working, but it's seeing stale information.
+
+Perhaps this is a bug in udev, that it's not noticing the usb port powered
+down. It seems to not get any kernel event for it at all, according to
+`udevadm monitor`.
+
+I thought maybe a different workaround would be to dd one byte from the
+disk after powering it down, or `udevadm trigger` the device manually.
+Unfortunately, the kernel auto-powers the usb port back up when either of
+those is done. So I'll stick with the sleep for now..
+"""]]

Added a comment: systemd unit syntax error
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_4_f514a67a0e4e84e5a9ca647bbc8c0b19._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_4_f514a67a0e4e84e5a9ca647bbc8c0b19._comment
new file mode 100644
index 00000000..a650d0b2
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_4_f514a67a0e4e84e5a9ca647bbc8c0b19._comment
@@ -0,0 +1,20 @@
+[[!comment format=mdwn
+ username="mk.fraggod@a2e97043e01bcf7237d068482b83a6cb9e179ca0"
+ nickname="mk.fraggod"
+ avatar="http://cdn.libravatar.org/avatar/db0d5b15da76246bed0ba3c253b5ea82"
+ subject="systemd unit syntax error"
+ date="2018-09-09T13:40:08Z"
+ content="""
+In systemd unit this line probably doesn't mean what you seem to think it does:
+
+    ExecStart=/usr/sbin/uhubctl -a on -p 4 ; /bin/sleep 20
+
+\"/bin/sleep 20\" there is probably irrelevant - a comment in an ini file.
+
+Unless debian patches systemd that way, whole ExecStart= line isn't passed to shell anyway, so if that part was passed to command, it'd probably just exit on parsing options.
+
+Something like this should work though:
+
+    ExecStart=/bin/bash -c \"uhubctl -a on -p 4 ; /bin/sleep 20\"
+
+"""]]

Added a comment: Monitoring USB drive health in Linux
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_3_3078a8364227e91bd33e78acd75cd079._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_3_3078a8364227e91bd33e78acd75cd079._comment
new file mode 100644
index 00000000..23950f45
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_3_3078a8364227e91bd33e78acd75cd079._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="Abishek_Muthian"
+ avatar="http://cdn.libravatar.org/avatar/1fe2acd0e7273426630dc7f02d05c9ea"
+ subject="Monitoring USB drive health in Linux"
+ date="2018-09-09T05:48:07Z"
+ content="""
+Hi Joey,
+
+Could you also elaborate on how you monitor your USB drive health, considering kernel doesn't seem to allow SAT ATA passthrough commands when using 'uas' driver.
+"""]]

Added a comment
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_2_7dc2b45f692c775ea1675e9bac771fe6._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_2_7dc2b45f692c775ea1675e9bac771fe6._comment
new file mode 100644
index 00000000..c7f59fa7
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_2_7dc2b45f692c775ea1675e9bac771fe6._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="grawity@2ea26be48562f66fcb9b66307da72b1e2e37453f"
+ nickname="grawity"
+ avatar="http://cdn.libravatar.org/avatar/7003e967f47003bae82966aa373de8ef"
+ subject="comment 2"
+ date="2018-09-08T19:57:59Z"
+ content="""
+As a side note, it sounds like you have several near-identical \"hub-port-X\" units (or at least they will become near-identical if the previous comment's suggestion with StopWhenUnneeded=true works out). These could be collapsed into a template `startech-usb-hub@.service` which uses `%i` in place of the port number everywhere.
+"""]]

Added a comment
diff --git a/blog/entry/usb_drives_with_no_phantom_load/comment_1_ba9b3c3ee0aa4ff7c1c79ea96197dd02._comment b/blog/entry/usb_drives_with_no_phantom_load/comment_1_ba9b3c3ee0aa4ff7c1c79ea96197dd02._comment
new file mode 100644
index 00000000..41994e49
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load/comment_1_ba9b3c3ee0aa4ff7c1c79ea96197dd02._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="grawity@2ea26be48562f66fcb9b66307da72b1e2e37453f"
+ nickname="grawity"
+ avatar="http://cdn.libravatar.org/avatar/7003e967f47003bae82966aa373de8ef"
+ subject="comment 1"
+ date="2018-09-08T19:50:26Z"
+ content="""
+> Seems there ought to be a way to declare an additional dependency and avoid needing that sleep?
+
+Your .mount unit can use `Requires=dev-disk-by\x2dlabel-passport.device`.
+
+(Actually I was quite sure that .mount units automatically depend on their What= device in any case, but I guess only an After= is implicit but a Requires= isn't.)
+
+> The combination of PartOf
+
+I think it would be simpler to use `StopWhenUnneeded=yes` in the .service (once you have the aforementioned Requires=dev-disk in your .mount unit). Such a combination _might_ be more reliable as well.
+"""]]

blog update
diff --git a/blog/entry/usb_drives_with_no_phantom_load.mdwn b/blog/entry/usb_drives_with_no_phantom_load.mdwn
new file mode 100644
index 00000000..1f28a99b
--- /dev/null
+++ b/blog/entry/usb_drives_with_no_phantom_load.mdwn
@@ -0,0 +1,65 @@
+For a long time I've not had any network attached storage at home, because
+it's offgrid and power budget didn't allow it. But now I have 16 
+terabytes of network attached storage, that uses no power at all when
+it's not in use, and automatically spins up on demand.
+
+I used a USB hub with per-port power control. But even with a USB drive's
+port powered down, there's a parasitic draw of around 3 watts per drive.
+Not a lot, but with 4 drives that's more power wasted than leaving a couple
+of ceiling lights on all the time. So I put all the equipment behind a
+relay too, so it can be fully powered down.
+
+I'm using systemd for automounting the drives, and have it configured to
+power a drive's USB port on and off as needed using
+[uhubctl](https://github.com/mvp/uhubctl).
+This was kind of tricky to work out how to do, but it works very well.
+
+Here's the mount unit for a drive, media-joey-passport.mount:
+
+	[Unit]
+	Description=passport
+	Requires=startech-hub-port-4.service
+	After=startech-hub-port-4.service
+	[Mount]
+	Options=noauto
+	What=/dev/disk/by-label/passport
+	Where=/media/joey/passport
+
+That's on port 4 of the USB hub, the startech-hub-port-4.service unit
+file is this:
+
+	[Unit]
+	Description=Startech usb hub port 4
+	PartOf=media-joey-passport.mount
+	[Service]
+	Type=oneshot
+	RemainAfterExit=true
+	ExecStart=/usr/sbin/uhubctl -a on -p 4 ; /bin/sleep 20
+	ExecStop=/usr/sbin/uhubctl -a off -p 4
+
+The combination of PartOf with Requires and After in these units makes 
+systemd start the port 4 service before mounting the drive, and 
+stop it after unmounting. This was the hardest part to work out.
+
+The `sleep 20` is a bit unfortunate, it seems that it can take a few seconds for
+the drive to power up enough for the kernel to see it, and so without that the
+mount can fail, leaving the drive powered on indefinitely. Seems there
+ought to be a way to declare an additional dependency and avoid needing that sleep?
+
+Finally, the automount unit for the drive, media-joey-passport.automount:
+
+	[Unit]
+	Description=Automount passport
+	[Automount]
+	Where=/media/joey/passport
+	TimeoutIdleSec=300
+	[Install]
+	WantedBy=multi-user.target
+
+The TimeoutIdleSec makes it unmount after around 5 minutes of not being used,
+and then its USB port gets powered off.
+
+I decided to not automate the relay as part of the above, instead I
+typically turn it on for 5 hours or so, and use the storage whenever I want
+during that window. One advantage to that is cron jobs can't spin up
+the drives in the early morning hours.

Added a comment: Thank you
diff --git a/blog/entry/camping_Roan_highlands/comment_2_2bc65c200a1709050fe42361ffbd658d._comment b/blog/entry/camping_Roan_highlands/comment_2_2bc65c200a1709050fe42361ffbd658d._comment
new file mode 100644
index 00000000..b0ec61fc
--- /dev/null
+++ b/blog/entry/camping_Roan_highlands/comment_2_2bc65c200a1709050fe42361ffbd658d._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="edhamilton9@1f08806bf5517489acd14136b49e97b63fb63519"
+ nickname="edhamilton9"
+ avatar="http://cdn.libravatar.org/avatar/a78e4861017c7e48a0e77174de2b25c8"
+ subject="Thank  you"
+ date="2018-08-27T12:09:20Z"
+ content="""
+Hi. I have Planet Debian in my feedreader, which is where I came across your blog. 
+My wallpaper right now is a sunset taken from Roan Mountain. I don't know where I found the picture. 
+It looks like a beautiful place. Thanks for posting it.
+
+Ed H
+"""]]

Added a comment
diff --git a/blog/entry/camping_Roan_highlands/comment_1_d585b45c3a92c36953948271b65a96d1._comment b/blog/entry/camping_Roan_highlands/comment_1_d585b45c3a92c36953948271b65a96d1._comment
new file mode 100644
index 00000000..62a2c07a
--- /dev/null
+++ b/blog/entry/camping_Roan_highlands/comment_1_d585b45c3a92c36953948271b65a96d1._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="sarahnoce@733718de58a0b1196931cd960415c06b77e892b4"
+ nickname="sarahnoce"
+ avatar="http://cdn.libravatar.org/avatar/50b2128e90983e8e2df283fd25d3c12b"
+ subject="comment 1"
+ date="2018-08-26T18:28:35Z"
+ content="""
+beautiful, joey!
+"""]]

typo
diff --git a/blog/entry/camping_Roan_highlands.mdwn b/blog/entry/camping_Roan_highlands.mdwn
index 1fa6ffea..fefc7581 100644
--- a/blog/entry/camping_Roan_highlands.mdwn
+++ b/blog/entry/camping_Roan_highlands.mdwn
@@ -1,3 +1,3 @@
 [[!img pics/tentroan.jpg size=800x caption="small tent overlooking a big view"]]
 
-My second time camping the Roan highlads on the AT.
+My second time camping the Roan highlands on the AT.

scale
diff --git a/blog/entry/camping_Roan_highlands.mdwn b/blog/entry/camping_Roan_highlands.mdwn
index 541b3011..1fa6ffea 100644
--- a/blog/entry/camping_Roan_highlands.mdwn
+++ b/blog/entry/camping_Roan_highlands.mdwn
@@ -1,3 +1,3 @@
-[[!img pics/tentroan.jpg size=1024x caption="small tent overlooking a big view"]]
+[[!img pics/tentroan.jpg size=800x caption="small tent overlooking a big view"]]
 
 My second time camping the Roan highlads on the AT.

scale
diff --git a/blog/entry/camping_Roan_highlands.mdwn b/blog/entry/camping_Roan_highlands.mdwn
index e6fce217..541b3011 100644
--- a/blog/entry/camping_Roan_highlands.mdwn
+++ b/blog/entry/camping_Roan_highlands.mdwn
@@ -1,3 +1,3 @@
-[[!img pics/tentroan.jpg size=100x caption="small tent overlooking a big view"]]
+[[!img pics/tentroan.jpg size=1024x caption="small tent overlooking a big view"]]
 
 My second time camping the Roan highlads on the AT.

scale
diff --git a/blog/entry/camping_Roan_highlands.mdwn b/blog/entry/camping_Roan_highlands.mdwn
index b3547916..e6fce217 100644
--- a/blog/entry/camping_Roan_highlands.mdwn
+++ b/blog/entry/camping_Roan_highlands.mdwn
@@ -1,3 +1,3 @@
-[[!img pics/tentroan.jpg width=100x caption="small tent overlooking a big view"]]
+[[!img pics/tentroan.jpg size=100x caption="small tent overlooking a big view"]]
 
 My second time camping the Roan highlads on the AT.

blog update
diff --git a/blog/entry/camping_Roan_highlands.mdwn b/blog/entry/camping_Roan_highlands.mdwn
new file mode 100644
index 00000000..b3547916
--- /dev/null
+++ b/blog/entry/camping_Roan_highlands.mdwn
@@ -0,0 +1,3 @@
+[[!img pics/tentroan.jpg width=100x caption="small tent overlooking a big view"]]
+
+My second time camping the Roan highlads on the AT.
diff --git a/blog/pics/tentroan.jpg b/blog/pics/tentroan.jpg
new file mode 100644
index 00000000..c59fc16c
Binary files /dev/null and b/blog/pics/tentroan.jpg differ

blog update
diff --git a/blog/entry/Dear_Ad_Networks.mdwn b/blog/entry/Dear_Ad_Networks.mdwn
new file mode 100644
index 00000000..934542bc
--- /dev/null
+++ b/blog/entry/Dear_Ad_Networks.mdwn
@@ -0,0 +1,11 @@
+In 1 week, I plan to benchmark all your advertisment delivery systems from
+IP address block 184.20/16.
+
+Please note attached
+[Intel microcode license](https://perens.com/2018/08/22/new-intel-microcode-license-restriction-is-not-acceptable/)
+may apply to your servers. If you don't want me benchmarking your 
+ad servers, simply blacklist my IP block now.
+
+Love, Joey
+
+PS The benchmarking will continue indefinitely.

ocracoke 2018
diff --git a/ocracode.mdwn b/ocracode.mdwn
index d15d2cbb..4586ea4a 100644
--- a/ocracode.mdwn
+++ b/ocracode.mdwn
@@ -117,3 +117,4 @@ describe your camping trip to Ocracoke.
 * [[2014|blog/entry/laptop_death]]
 * [[2015|ocracode/2015]]
 * [[2015|ocracode/2016]]
+* [[2018|ocracode/2018]]
diff --git a/ocracode/2018.mdwn b/ocracode/2018.mdwn
new file mode 100644
index 00000000..aac58829
--- /dev/null
+++ b/ocracode/2018.mdwn
@@ -0,0 +1,3 @@
+OBX1.1 P4/8/6 L7 SC5+++++db-c-- U1(no bugs)
+T0f0b0 R5wTst Bn-----b------m----- F++u+ SC+s+g10
+H---f0i3 V+++++s----m0 E++r--

typo
diff --git a/languages/discussion.mdwn b/languages/discussion.mdwn
index 96731bdb..45f17189 100644
--- a/languages/discussion.mdwn
+++ b/languages/discussion.mdwn
@@ -6,4 +6,4 @@ I know you mention JS. Though what about other 'languages' of the Web API puzzle
 Keep on hacking on Web applications Joey. You're very good at it. :)
 
 > Unlike English and Perl, HTML and CSS are not Turing complete
-> (barring horriible hacks), so they're not languages. --[[Joey]]
+> (barring horrible hacks), so they're not languages. --[[Joey]]

test
diff --git a/languages/discussion.mdwn b/languages/discussion.mdwn
index 7fe07891..96731bdb 100644
--- a/languages/discussion.mdwn
+++ b/languages/discussion.mdwn
@@ -5,5 +5,5 @@ I know you mention JS. Though what about other 'languages' of the Web API puzzle
 
 Keep on hacking on Web applications Joey. You're very good at it. :)
 
-> Unlike English and Perl, HTML and CSS are not Turing complete, so they're
-> not languages. --[[Joey]]
+> Unlike English and Perl, HTML and CSS are not Turing complete
+> (barring horriible hacks), so they're not languages. --[[Joey]]

typo
diff --git a/blog/entry/two_security_holes_and_a_new_library.mdwn b/blog/entry/two_security_holes_and_a_new_library.mdwn
index 2f92be0f..abaa505c 100644
--- a/blog/entry/two_security_holes_and_a_new_library.mdwn
+++ b/blog/entry/two_security_holes_and_a_new_library.mdwn
@@ -33,7 +33,7 @@ such private data, the confusion can result in private data being exposed.
 See [the_advisory](https://git-annex.branchable.com/security/CVE-2018-10857_and_CVE-2018-10859/)
 for details.
 
-Fixing this kind of security hoole is not necessarily easy, because we use
+Fixing this kind of security hole is not necessarily easy, because we use
 HTTP libraries, often via an API library, which may not give much
 control over following redirects. DNS rebinding attacks can be 
 used to defeat security checks, if the HTTP library doesn't expose 

RESTLESS
diff --git a/blog/entry/two_security_holes_and_a_new_library.mdwn b/blog/entry/two_security_holes_and_a_new_library.mdwn
index 317064bb..2f92be0f 100644
--- a/blog/entry/two_security_holes_and_a_new_library.mdwn
+++ b/blog/entry/two_security_holes_and_a_new_library.mdwn
@@ -14,6 +14,8 @@ remotes) that uses HTTP. And quite likely beyond git-annex to unrelated
 programs, but I'll let their developers talk about that. So quite a lot of
 people were involved in this behind the scenes.
 
+See also: [The RESTLESS Vulnerability: Non-Browser Based Cross-Domain HTTP Request Attacks](https://www.danieldent.com/blog/restless-vulnerability-non-browser-cross-domain-http-request-attacks/)
+
 And then there was the second security hole in git-annex, which took
 several days to notice, in collaboration with Daniel Dent. That one's
 potentially very nasty, allowing decryption of arbitrary gpg-encrypted

blog
diff --git a/blog/entry/two_security_holes_and_a_new_library.mdwn b/blog/entry/two_security_holes_and_a_new_library.mdwn
new file mode 100644
index 00000000..317064bb
--- /dev/null
+++ b/blog/entry/two_security_holes_and_a_new_library.mdwn
@@ -0,0 +1,61 @@
+For the past week and a half, I've been working on embargoed
+[security holes](https://git-annex.branchable.com/security/CVE-2018-10857_and_CVE-2018-10859/). 
+The embargo is over, and git-annex 6.20180626 has been
+[released](https://git-annex.branchable.com/news/security_fix_release/), 
+fixing those holes. I'm also announcing a new Haskell library, 
+[[code/http-client-restricted]], which could be used to avoid
+similar problems in other programs.
+
+Working in secret under a security embargo is mostly new to me, and I
+mostly don't like it, but it seems to have been the right call in this
+case. The first security hole I found in git-annex turned out to have a
+wider impact, affecting code in git-annex plugins (aka external special
+remotes) that uses HTTP. And quite likely beyond git-annex to unrelated
+programs, but I'll let their developers talk about that. So quite a lot of
+people were involved in this behind the scenes.
+
+And then there was the second security hole in git-annex, which took
+several days to notice, in collaboration with Daniel Dent. That one's
+potentially very nasty, allowing decryption of arbitrary gpg-encrypted
+files, although exploiting it would be hard. It logically
+followed from the first security hole, so it's good that the first
+security hole was under embagro long enough for us to think it all
+though.
+
+These security holes involved HTTP servers doing things to exploit
+clients that connect to them. For example, a HTTP server that a client asks
+for the content of a file stored on it can redirect to a file://
+on the client's disk, or to http://localhost/ or a private web server on
+the client's internal network. Once the client is tricked into downloading
+such private data, the confusion can result in private data being exposed.
+See [the_advisory](https://git-annex.branchable.com/security/CVE-2018-10857_and_CVE-2018-10859/)
+for details.
+
+Fixing this kind of security hoole is not necessarily easy, because we use
+HTTP libraries, often via an API library, which may not give much
+control over following redirects. DNS rebinding attacks can be 
+used to defeat security checks, if the HTTP library doesn't expose 
+the IP address it's connecting to.
+
+I faced this problem in git-annex's use of the Haskell
+[http-client](https://hackage.haskell.org/package/http-client/) library.
+So I had to write a new library, [[code/http-client-restricted]]. Thanks
+to the good design of the http-client library, particularly its Manager
+abstraction, my library extends it rather than needing to replace it,
+and can be used with any API library built on top of http-client.
+
+I get the impression that a lot of other language's HTTP libraries need
+to have similar things developed. Much like web browsers need to enforce
+same-origin policies, HTTP clients need to be able to reject certain
+redirects according to the security needs of the program using them.
+
+I kept a private journal while working on these security holes, and am
+publishing it now:
+
+* [day 1](https://git-annex.branchable.com/devblog/day_499__security_hole/)
+* [day 2](https://git-annex.branchable.com/devblog/day_500__security_hole_part_2/)
+* [day 3](https://git-annex.branchable.com/devblog/day_501__security_hole_part_3/)
+* [day 4](https://git-annex.branchable.com/devblog/day_502__security_hole_part_4/)
+* [day 5](https://git-annex.branchable.com/devblog/day_503__security_hole_part_5/)
+* [day 6](https://git-annex.branchable.com/devblog/day_504__security_hole_part_6/)
+* [day 7](https://git-annex.branchable.com/devblog/day_505__security_fix_release/)

new project
diff --git a/code.mdwn b/code.mdwn
index 1e8dec56..612043a0 100644
--- a/code.mdwn
+++ b/code.mdwn
@@ -15,9 +15,9 @@ The stuff that's swapped into my local cache at the moment.
 [[ikiwiki]]
 [[moreutils]]
 [[ikiwiki-hosting]]
-[[github-backup]]
 [[shell-monad]]
 [[reactive-banana-automation]]
+[[http-client-restricted]]
 [[easy-peasy-devicetree-squeezy]]
 [[scuttlebutt-types]]
 
@@ -33,6 +33,7 @@ In maintenance mode mostly, but I still have my hands in it somewhat.
 [[brainfuck-monad]]
 [[zxcvbn-c]]
 [[scroll]]
+[[github-backup]]
 
 ## Past projects
 
diff --git a/code/http-client-restricted.mdwn b/code/http-client-restricted.mdwn
new file mode 100644
index 00000000..4c47b212
--- /dev/null
+++ b/code/http-client-restricted.mdwn
@@ -0,0 +1,3 @@
+restricting the servers that http-client will use
+
+<http://hackage.haskell.org/package/http-client-restricted>

response
diff --git a/blog/entry/unifying_OS_installation_and_configuration_management/comment_2_cdf45b4ef0f72fdacba1cfeb6c3d3b09._comment b/blog/entry/unifying_OS_installation_and_configuration_management/comment_2_cdf45b4ef0f72fdacba1cfeb6c3d3b09._comment
new file mode 100644
index 00000000..c37bf6d7
--- /dev/null
+++ b/blog/entry/unifying_OS_installation_and_configuration_management/comment_2_cdf45b4ef0f72fdacba1cfeb6c3d3b09._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2018-06-13T14:21:30Z"
+ content="""
+Propellor tracks which OS's a property supports at the type level. So to
+add a new OS, you have to at least add the types for it.
+
+I imagine that UnixLike should cover Nixos well enough for most things,
+but perhaps there will be some places Nix diverges too much from standard
+unix practice for that to work, perhaps something to do with filesystem
+layout.
+
+If you look for "Arch Linux" in the git log you'll find a patch set that is
+a good example of the kind of changes you'll need to make.
+"""]]

Added a comment: NixOS Support
diff --git a/blog/entry/unifying_OS_installation_and_configuration_management/comment_1_d310c46c1581fa1c6807580d9a613364._comment b/blog/entry/unifying_OS_installation_and_configuration_management/comment_1_d310c46c1581fa1c6807580d9a613364._comment
new file mode 100644
index 00000000..a913cf6e
--- /dev/null
+++ b/blog/entry/unifying_OS_installation_and_configuration_management/comment_1_d310c46c1581fa1c6807580d9a613364._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="craige"
+ avatar="http://cdn.libravatar.org/avatar/64ac5816ea3a51347d1f699022d1fdc1"
+ subject="NixOS Support"
+ date="2018-06-13T06:50:28Z"
+ content="""
+G'day Joey. Loving this body of work. Thank you.
+
+After 20+ years of Debian everywhere, I switched to NixOS on my desktop 5 weeks ago.
+
+I'd like to keep using Propellor for that NixOS machine as well as my Debian fleet.
+
+Before I started trying to hack in support for NixOS, I thought I'd run a sanity check up the flag pole: is hacking in NixOS something I will actually need to do? (or does \"Unixlike\" cover most of my scenarios?)
+"""]]

`vidir` should be able to copy files as well
diff --git a/code/moreutils/discussion.mdwn b/code/moreutils/discussion.mdwn
index d54ca26b..d05982cc 100644
--- a/code/moreutils/discussion.mdwn
+++ b/code/moreutils/discussion.mdwn
@@ -289,8 +289,13 @@ Another improvement would be the addition would be to add checkboxes to control
 >> (although I'm not particularly interested in this, I only use git and tig is an
 >> excellent command-line utility to manage the repository). --G. Bilotta
 
+---
+
 How about adding copying ability to vidir?
 Items are recognized by the leading number in a line, right? A second instance of the same number should imply copying.
+> I tried using `vidir` like that today as I thought it had this feature already, but it doesn’t. Something like `%s/\(.*\)one\(.*\)/&\r\1two\2` (in `vim`) should copy every file containing “one” and replace it with “two” in the copy. That’s not too hard to add as a feature, or is it? -- K. Stephan
+
+---
 
 vidir is great, but when editing and deciding to abandon the sesssion,
 deleting the entire buffer should abort (like git commit messages) instead of

Added a comment: Can't really blame GitHub?
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_13_9b9caf8ab0be162f761e958a3452f4fb._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_13_9b9caf8ab0be162f761e958a3452f4fb._comment
new file mode 100644
index 00000000..252bc143
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_13_9b9caf8ab0be162f761e958a3452f4fb._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="http://milki.include-once.org/"
+ nickname="Mario"
+ avatar="http://cdn.libravatar.org/avatar/697b7e012d3908ba50728345a55969aa66635185ee363c20e5be90b54e6c5e9f"
+ subject="Can't really blame GitHub?"
+ date="2018-06-08T02:08:45Z"
+ content="""
+They both popularized and exploited a few design flaws of git. Rushing all eggs into another centralized basket is not really the lesson to be learned here.
+
+Git is not the only DVCS. It's just the one clinging to repositories-are-fileshrubbery thing. Nobody HAS TO make do with it merely because it's popular (again, GitHubs fault). Decentralization buys you nothing with an implied monoculture.
+"""]]

update link
diff --git a/blog/entry/my_haskell_controlled_offgrid_fridge.mdwn b/blog/entry/my_haskell_controlled_offgrid_fridge.mdwn
index 0cc02340..fc20c5af 100644
--- a/blog/entry/my_haskell_controlled_offgrid_fridge.mdwn
+++ b/blog/entry/my_haskell_controlled_offgrid_fridge.mdwn
@@ -38,7 +38,7 @@ used for something else (and to partly tackle the problem of using
 real-world time events when the underlying FRP library uses its own
 notion of time).
 
-[The code for my fridge](https://git.joeyh.name/index.cgi/joey/homepower.git/tree/reactive.hs#n72) 
+[The code for my fridge](https://git.joeyh.name/index.cgi/joey/homepower.git/tree/src/Automation/Fridge.hs) 
 is a work in progress since the fridge has not arrived yet, and because
 the question of in which situations an offgrid fridge should optimally 
 run and not run is really rather complicated.

response
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_12_11b5adc692c6d69b9596d3165fd5613d._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_12_11b5adc692c6d69b9596d3165fd5613d._comment
new file mode 100644
index 00000000..e4a49940
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_12_11b5adc692c6d69b9596d3165fd5613d._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""rate limit"""
+ date="2018-06-07T19:03:24Z"
+ content="""
+ Checking each issue for new comments takes an API call. The API is paginated == more API calls the more issues and comments there are. Finding comments attached to commits is additional API calls (and there was not a way to discover them other than trying every commit in turn last I checked). Repositories can have forks, which can have issues, which can have comments, for piles more API calls. (I know about this in some detail because I've written software to deal with all of it. It's constantly rate limited.)
+
+And then, most developers are not involved with a single software project. It's not uncommon to have dozens of dependencies you want to keep an eye on or are tangentially involved with in your work on a single project. Out of all your other projects.
+
+12 hours to check something out is not fertile ground for a distributed ecosystem to develop: As evidence see the lack of such an ecosystem.
+"""]]

Added a comment: Man management-level folks are older...
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_2e58412a6dde814e36d6acb786f35bc5._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_2e58412a6dde814e36d6acb786f35bc5._comment
new file mode 100644
index 00000000..baa733df
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_2e58412a6dde814e36d6acb786f35bc5._comment
@@ -0,0 +1,11 @@
+[[!comment format=mdwn
+ username="jason@84909c980a155d150ac3c9b2063e6248ee136634"
+ nickname="jason"
+ avatar="http://cdn.libravatar.org/avatar/445e077e0b53b5b104c2bfc969792a17"
+ subject="Man management-level folks are older..."
+ date="2018-06-07T13:11:55Z"
+ content="""
+I wonder how many closed-source companies using github have managers that remember \"DOS ain't done 'till Lotus don't run\" and are regretting making their family jewels available to MS.  And someone else being payed for it.
+
+I haven't seen the closed-source, private repo contracts, so they might have appropriate protections.
+"""]]

Added a comment: SIT
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_89ab048df6679b32af3cd412a00b89f2._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_89ab048df6679b32af3cd412a00b89f2._comment
new file mode 100644
index 00000000..77a07327
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_89ab048df6679b32af3cd412a00b89f2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="yrashk"
+ avatar="http://cdn.libravatar.org/avatar/ae2b294e24fd2e472bfca45ab19050c5"
+ subject="SIT"
+ date="2018-06-06T20:54:30Z"
+ content="""
+I wholeheartedly agree on the vendor lock-in with issues and pull requests. I've had a feeling that GitHub sort of well-intendedly hijacked open source communities. A few months ago, that pushed me to develop a resilient, future-proof, decentralized issue tracker that I later generalized for other problems as well ([SIT](https://sit.fyi)). I wrote a bit about my vision when I first announced it: [“Under the Covers of Code”](https://hackernoon.com/under-the-covers-of-code-3c4761fe965a)
+
+I really wanted to build something as future-proof and resilient as I can imagine, so SIT ended up not being specific to Git or any other SCM but instead relies on simple additive sets of files.
+"""]]

removed
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_7_0d1756dc1dc4bacc18be8d494b019ce9._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_7_0d1756dc1dc4bacc18be8d494b019ce9._comment
deleted file mode 100644
index d7611c3c..00000000
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_7_0d1756dc1dc4bacc18be8d494b019ce9._comment
+++ /dev/null
@@ -1,10 +0,0 @@
-[[!comment format=mdwn
- username="yrashk"
- avatar="http://cdn.libravatar.org/avatar/ae2b294e24fd2e472bfca45ab19050c5"
- subject="comment 7"
- date="2018-06-06T19:36:34Z"
- content="""
-I wholeheartedly agree on the vendor lock-in with issues and pull requests. I've had a feeling that GitHub sort of well-intentedly hijacked open source communities. A few months ago, that pushed me to develop a resilient, future-proof, decentralized issue tracker that I later federalized for other problems as well ([SIT](https://sit.fyi)). I wrote a bit about my vision when I first announced it: [“Under the Covers of Code”](https://hackernoon.com/under-the-covers-of-code-3c4761fe965a). I wanted to build something really future-proof so I didn't opt to make it just git-based, but rather file-based and merge-conflict-free so it can be used with any SCM (or even without one)
-
-Maybe you'll find it useful.
-"""]]

Added a comment
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_36cc922c4ee94bbd42acd9141af93f2b._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_36cc922c4ee94bbd42acd9141af93f2b._comment
new file mode 100644
index 00000000..f1797f0d
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_36cc922c4ee94bbd42acd9141af93f2b._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="gramplestramp"
+ avatar="http://cdn.libravatar.org/avatar/9867d203519e089dc247072a4c8ab730"
+ subject="comment 10"
+ date="2018-06-06T20:00:16Z"
+ content="""
+The API rate limit is 5000 requests per hour. If that's a barrier to you extracting your project data, then you're clearly doing something wrong.
+
+Also, the word you're looking for is \"criterion\". Be more precise in your vocabulary!
+"""]]

removed
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_5623dc7ba19a13e412bd0aa85cc960d1._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_5623dc7ba19a13e412bd0aa85cc960d1._comment
deleted file mode 100644
index 2c4d1bf7..00000000
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_5623dc7ba19a13e412bd0aa85cc960d1._comment
+++ /dev/null
@@ -1,14 +0,0 @@
-[[!comment format=mdwn
- username="joeyh.name-20180606@c06bf6e0535bd537459660ee51f038ff70082861"
- nickname="joeyh.name-20180606"
- avatar="http://cdn.libravatar.org/avatar/838f7b4df8043e9a45ba50f9a178beab"
- subject="gists and wikis"
- date="2018-06-06T19:49:25Z"
- content="""
-> Consider all the data that's used to provide the value-added features on top of git. Issue tracking, wikis, notes in commits, lists of forks, pull requests, access controls, hooks, other configuration, etc.
-> Is that data stored in a git repository?
->
-> Github avoids doing that 
-
-Not quite true. Both gists and wiki pages are backed by git.
-"""]]

removed
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_fe8fae6de275b86ad2f72da5e8f804f6._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_fe8fae6de275b86ad2f72da5e8f804f6._comment
deleted file mode 100644
index 81e5adc1..00000000
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_fe8fae6de275b86ad2f72da5e8f804f6._comment
+++ /dev/null
@@ -1,14 +0,0 @@
-[[!comment format=mdwn
- username="joeyh.name-20180606@c06bf6e0535bd537459660ee51f038ff70082861"
- nickname="joeyh.name-20180606"
- avatar="http://cdn.libravatar.org/avatar/838f7b4df8043e9a45ba50f9a178beab"
- subject="gists and wikis"
- date="2018-06-06T19:49:18Z"
- content="""
-> Consider all the data that's used to provide the value-added features on top of git. Issue tracking, wikis, notes in commits, lists of forks, pull requests, access controls, hooks, other configuration, etc.
-> Is that data stored in a git repository?
->
-> Github avoids doing that 
-
-Not quite true. Both gists and wiki pages are backed by git.
-"""]]

Added a comment: gists and wikis
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_5623dc7ba19a13e412bd0aa85cc960d1._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_5623dc7ba19a13e412bd0aa85cc960d1._comment
new file mode 100644
index 00000000..2c4d1bf7
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_11_5623dc7ba19a13e412bd0aa85cc960d1._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joeyh.name-20180606@c06bf6e0535bd537459660ee51f038ff70082861"
+ nickname="joeyh.name-20180606"
+ avatar="http://cdn.libravatar.org/avatar/838f7b4df8043e9a45ba50f9a178beab"
+ subject="gists and wikis"
+ date="2018-06-06T19:49:25Z"
+ content="""
+> Consider all the data that's used to provide the value-added features on top of git. Issue tracking, wikis, notes in commits, lists of forks, pull requests, access controls, hooks, other configuration, etc.
+> Is that data stored in a git repository?
+>
+> Github avoids doing that 
+
+Not quite true. Both gists and wiki pages are backed by git.
+"""]]

Added a comment: gists and wikis
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_fe8fae6de275b86ad2f72da5e8f804f6._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_fe8fae6de275b86ad2f72da5e8f804f6._comment
new file mode 100644
index 00000000..81e5adc1
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_10_fe8fae6de275b86ad2f72da5e8f804f6._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joeyh.name-20180606@c06bf6e0535bd537459660ee51f038ff70082861"
+ nickname="joeyh.name-20180606"
+ avatar="http://cdn.libravatar.org/avatar/838f7b4df8043e9a45ba50f9a178beab"
+ subject="gists and wikis"
+ date="2018-06-06T19:49:18Z"
+ content="""
+> Consider all the data that's used to provide the value-added features on top of git. Issue tracking, wikis, notes in commits, lists of forks, pull requests, access controls, hooks, other configuration, etc.
+> Is that data stored in a git repository?
+>
+> Github avoids doing that 
+
+Not quite true. Both gists and wiki pages are backed by git.
+"""]]

Added a comment: gists and wikis
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_9_723355b3f8c2592230f474d19b5533ed._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_9_723355b3f8c2592230f474d19b5533ed._comment
new file mode 100644
index 00000000..65f571db
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_9_723355b3f8c2592230f474d19b5533ed._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="joeyh.name-20180606@c06bf6e0535bd537459660ee51f038ff70082861"
+ nickname="joeyh.name-20180606"
+ avatar="http://cdn.libravatar.org/avatar/838f7b4df8043e9a45ba50f9a178beab"
+ subject="gists and wikis"
+ date="2018-06-06T19:49:03Z"
+ content="""
+> Consider all the data that's used to provide the value-added features on top of git. Issue tracking, wikis, notes in commits, lists of forks, pull requests, access controls, hooks, other configuration, etc.
+> Is that data stored in a git repository?
+>
+> Github avoids doing that 
+
+Not quite true. Both gists and wiki pages are backed by git.
+"""]]

Added a comment: Pagure as a replacement for GitHub
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_8_dce62f1de299f02120160e08bc4d4661._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_8_dce62f1de299f02120160e08bc4d4661._comment
new file mode 100644
index 00000000..c06f1e6f
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_8_dce62f1de299f02120160e08bc4d4661._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://ngompa.id.fedoraproject.org/"
+ nickname="ngompa"
+ avatar="http://cdn.libravatar.org/avatar/af8a9293484ed04b89081d848929b19a"
+ subject="Pagure as a replacement for GitHub"
+ date="2018-06-06T19:45:10Z"
+ content="""
+> Consider all the data that's used to provide the value-added features on top of git. Issue tracking, wikis, notes in commits, lists of forks, pull requests, access controls, hooks, other configuration, etc.
+> **Is that data stored in a git repository?**
+
+Fedora's [Pagure](https://pagure.io/pagure) mostly satisfies this requirement. All issues, comments, PR metadata, etc. are stored as Git repositories internally. You can pull, commit, and push through it that way. It also supports \"remote pull requests\" where the git repository of the source branch isn't hosted on the same server as the repo being targeted. The source repo doesn't even have to run Pagure!
+
+It uses Gitolite underneath to manage ACLs, and that isn't managed through Git repos, but instead through the application with settings in the database. But I'd argue all the meaningful information is available in a useful form.
+"""]]

Added a comment
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_7_0d1756dc1dc4bacc18be8d494b019ce9._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_7_0d1756dc1dc4bacc18be8d494b019ce9._comment
new file mode 100644
index 00000000..d7611c3c
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_7_0d1756dc1dc4bacc18be8d494b019ce9._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="yrashk"
+ avatar="http://cdn.libravatar.org/avatar/ae2b294e24fd2e472bfca45ab19050c5"
+ subject="comment 7"
+ date="2018-06-06T19:36:34Z"
+ content="""
+I wholeheartedly agree on the vendor lock-in with issues and pull requests. I've had a feeling that GitHub sort of well-intentedly hijacked open source communities. A few months ago, that pushed me to develop a resilient, future-proof, decentralized issue tracker that I later federalized for other problems as well ([SIT](https://sit.fyi)). I wrote a bit about my vision when I first announced it: [“Under the Covers of Code”](https://hackernoon.com/under-the-covers-of-code-3c4761fe965a). I wanted to build something really future-proof so I didn't opt to make it just git-based, but rather file-based and merge-conflict-free so it can be used with any SCM (or even without one)
+
+Maybe you'll find it useful.
+"""]]

Added a comment: git-dit
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_6_3a87a89f1b4f243bc2bbff95a058f43a._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_6_3a87a89f1b4f243bc2bbff95a058f43a._comment
new file mode 100644
index 00000000..0428573e
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_6_3a87a89f1b4f243bc2bbff95a058f43a._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="girst"
+ avatar="http://cdn.libravatar.org/avatar/109c4908433659b8675806b7ba06d980"
+ subject="git-dit"
+ date="2018-06-06T19:19:59Z"
+ content="""
+There is some effort to get issues into the repository itself: https://github.com/neithernut/git-dit
+
+
+"""]]

username
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
index 06a83aa3..99cd0b66 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
@@ -1,5 +1,5 @@
 [[!comment format=mdwn
- username="joeyh@52ab0fe1b447869e9a584778dae52170a7f5a3a6"
+ username="colbyrussell"
  nickname="colbyrussell"
  avatar="http://cdn.libravatar.org/avatar/2d590c8209c6af9b181dcd151a639c1f"
  subject="Git repos and abstraction level"
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
index 791e84bb..8392c090 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
@@ -1,5 +1,5 @@
 [[!comment format=mdwn
- username="joeyh@52ab0fe1b447869e9a584778dae52170a7f5a3a6"
+ username="colbyrussell"
  nickname="colbyrussell"
  avatar="http://cdn.libravatar.org/avatar/2d590c8209c6af9b181dcd151a639c1f"
  subject="comment 4"

response
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
index 0e6ac226..06a83aa3 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
@@ -1,6 +1,6 @@
 [[!comment format=mdwn
  username="joeyh@52ab0fe1b447869e9a584778dae52170a7f5a3a6"
- nickname="joeyh"
+ nickname="colbyrussell"
  avatar="http://cdn.libravatar.org/avatar/2d590c8209c6af9b181dcd151a639c1f"
  subject="Git repos and abstraction level"
  date="2018-06-06T18:13:15Z"
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
index 58f251bf..791e84bb 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
@@ -1,6 +1,6 @@
 [[!comment format=mdwn
  username="joeyh@52ab0fe1b447869e9a584778dae52170a7f5a3a6"
- nickname="joeyh"
+ nickname="colbyrussell"
  avatar="http://cdn.libravatar.org/avatar/2d590c8209c6af9b181dcd151a639c1f"
  subject="comment 4"
  date="2018-06-06T18:17:23Z"
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_5_2389223ef35c20ee06996c54c7a8d5ec._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_5_2389223ef35c20ee06996c54c7a8d5ec._comment
new file mode 100644
index 00000000..61cdd80d
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_5_2389223ef35c20ee06996c54c7a8d5ec._comment
@@ -0,0 +1,22 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 5"""
+ date="2018-06-06T18:22:43Z"
+ content="""
+@colbyrussell, my guess is you logged in by email with
+joeyh@yourdomain.com. I've adjusted the nickname displayed.
+
+To your point: I have done a fair bit of exploration of what makes sense to
+shoehorn into git and how to do it, and issues and PRs and project
+configuration data are really pretty trivial to do. And it's been done,
+many times before -- <https://dist-bugs.branchable.com/> -- but
+<https://xkcd.com/927/> applies to those efforts. So I'm not suggesting
+this from a naive position.
+
+And while your logic is impeccible, so is the relentless logic of VC backed
+startups and how they develop. No criteria are perfect (see above footnote), 
+but I do feel this is a good one, and better in this case than 
+"is it free software?" for pointing in the direction of some solutions.
+(Combine the two criteria and you get the 
+[Franklin Street Statement](http://wiki.p2pfoundation.net/Franklin_Street_Statement_on_Freedom_and_Network_Services)..)
+"""]]

Added a comment
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
new file mode 100644
index 00000000..58f251bf
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_4_1f56947aac0f997fe1bb24acd15a8217._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="joeyh@52ab0fe1b447869e9a584778dae52170a7f5a3a6"
+ nickname="joeyh"
+ avatar="http://cdn.libravatar.org/avatar/2d590c8209c6af9b181dcd151a639c1f"
+ subject="comment 4"
+ date="2018-06-06T18:17:23Z"
+ content="""
+I don't know why that comment is showing up as coming from \"joeyh\"; that's actually me (@colbyrussell.com), and I didn't select any option to attribute it to \"joeyh\" (or in any other way, for that matter).
+"""]]

Added a comment: Git repos and abstraction level
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
new file mode 100644
index 00000000..0e6ac226
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_3_2b686b0c4167535126dae9a60be89503._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="joeyh@52ab0fe1b447869e9a584778dae52170a7f5a3a6"
+ nickname="joeyh"
+ avatar="http://cdn.libravatar.org/avatar/2d590c8209c6af9b181dcd151a639c1f"
+ subject="Git repos and abstraction level"
+ date="2018-06-06T18:13:15Z"
+ content="""
+That first paragraph is a killer opener, like a song that's ridiculously good by how brutal it manages to be because of the way every line packs a punch.
+
+Having said that, it doesn't follow that because GitHub made deliberate choices for anticompetitive lock-in, then another solution—say, a P2P one—should therefore store projects' \"extras\" in Git repos.
+
+In other words:
+
+*If $PARTY had chosen Git for $USECASE, it wouldn't have let them achieve lock-in*, does not mean, *project extras stored in something besides Git necessarily results in lock-in*.  It's possible that Git repos are the entirely wrong abstraction for this.  Indeed, insisting on stuffing all the auxiliary stuff into Git, too, (and all the implications of choosing those constraints) strongly smells of that phenomenon where people pick up one abstraction and then try to shoehorn it in everywhere else, regardless of whether it's well-suited for that use case or not.  I write this even knowing your affinity and relationship to Git with git-annex & co.
+"""]]

comment
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_2_20dc6365bc57456c7b44aa368e2f9819._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_2_20dc6365bc57456c7b44aa368e2f9819._comment
new file mode 100644
index 00000000..b125dbe2
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_2_20dc6365bc57456c7b44aa368e2f9819._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="joey"
+ subject="""comment 2"""
+ date="2018-06-06T17:49:53Z"
+ content="""
+And data is the plural of datum. Except in common usage neither is.
+
+And this kind of pedantry feels like a tactic. 
+
+Oh, and your comment was committed to git, so at least it demonstrated
+something useful.
+"""]]

Correct a spelling mistake.
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
index cc651ff3..7dd36d5d 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
@@ -1,4 +1,4 @@
-I could write a lot of things about the Github aquisition by Microsoft.
+I could write a lot of things about the Github acquisition by Microsoft.
 About Github's embrace and extend of git, and how it passed unnoticed by
 people who now fear the same thing now that Microsoft is in the
 picture. About the stultifying effects of Github's centralization, and

Added a comment: Criteria
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_1_0d77a12534da43028d5eacdc3b25a660._comment b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_1_0d77a12534da43028d5eacdc3b25a660._comment
new file mode 100644
index 00000000..3b3d87be
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github/comment_1_0d77a12534da43028d5eacdc3b25a660._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="moses.skoda@5596bce29110454b6f2f526c9ebd0c6b123bee49"
+ nickname="moses.skoda"
+ avatar="http://cdn.libravatar.org/avatar/df1440e57234792f07c901384e07ef6b"
+ subject="Criteria"
+ date="2018-06-06T17:28:30Z"
+ content="""
+Hi, just an FYI that I thought might be appreciated: *criteria* is a plural form of the word *criterion*
+"""]]

clarify
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
index e759e763..cc651ff3 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
@@ -35,5 +35,5 @@ an opportunity to get us out of the trap we now find ourselves in.
 
 [1] Although in the case of a P2P system which uses a distributed data
 structure, that can have many of the same benefits as using git. 
-So I'd give git-ssb, which stores issues etc as ssb messages, a pass
-on this, for example.
+So, git-ssb, which stores issues etc as ssb messages, is just as good,
+for example.

fix link
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
index 776ab030..e759e763 100644
--- a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
@@ -14,7 +14,7 @@ top of git. Issue tracking, wikis, notes in commits, lists of forks, pull
 requests, access controls, hooks, other configuration, etc.  
 **Is that data stored in a git repository?**
 
-Github [avoids doing that](a_Github_survey) and there's a good
+Github [[avoids doing that|a_Github_survey]] and there's a good
 reason why: By keeping this data in their own database, they lock you into
 the service. Consider if Github issues had been stored in a git repository
 next to the code. Anyone could quickly and easily clone the issue data,

blog update
diff --git a/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
new file mode 100644
index 00000000..776ab030
--- /dev/null
+++ b/blog/entry/the_single_most_important_criteria_when_replacing_Github.mdwn
@@ -0,0 +1,39 @@
+I could write a lot of things about the Github aquisition by Microsoft.
+About Github's embrace and extend of git, and how it passed unnoticed by
+people who now fear the same thing now that Microsoft is in the
+picture. About the stultifying effects of Github's centralization, and
+its retardant effect on general innovation in spaces around git and
+software development infrastructure.
+
+Instead I'd rather highlight one simple criteria you can consider when
+you are evaluating any git hosting service, whether it's Gitlab or
+something self-hosted, or federated, or P2P[1], or whatever:
+
+Consider all the data that's used to provide the value-added features on
+top of git. Issue tracking, wikis, notes in commits, lists of forks, pull
+requests, access controls, hooks, other configuration, etc.  
+**Is that data stored in a git repository?**
+
+Github [avoids doing that](a_Github_survey) and there's a good
+reason why: By keeping this data in their own database, they lock you into
+the service. Consider if Github issues had been stored in a git repository
+next to the code. Anyone could quickly and easily clone the issue data,
+consume it, write alternative issue tracking interfaces, which then start
+accepting git pushes of issue updates and syncing all around. That would have
+quickly became *the* de-facto distributed issue tracking data format.
+
+Instead, Github stuck it in a database, with a rate-limited API, and while
+this probably had as much to do with expediency, and a certain centralized
+mindset, as intentional lock-in at first, it's now become such good lock-in
+that Microsoft felt Github was worth $7 billion.
+
+So, if whatever thing you're looking at instead of Github doesn't do
+this, it's at worst hoping to emulate that, or at best it's neglecting
+an opportunity to get us out of the trap we now find ourselves in.
+
+----
+
+[1] Although in the case of a P2P system which uses a distributed data
+structure, that can have many of the same benefits as using git. 
+So I'd give git-ssb, which stores issues etc as ssb messages, a pass
+on this, for example.

poll vote (watched it all, liked it)
diff --git a/blog/entry/watch_me_code_for_half_an_hour.mdwn b/blog/entry/watch_me_code_for_half_an_hour.mdwn
index ca8b8fad..9a6c362d 100644
--- a/blog/entry/watch_me_code_for_half_an_hour.mdwn
+++ b/blog/entry/watch_me_code_for_half_an_hour.mdwn
@@ -14,7 +14,7 @@ Not shown is the hour I spent the next day changing the "optimize"
 subcommand implemented here into "--auto" options that can be passed to
 [[code/git-annex]]'s get and drop commands.
 
-[[!poll 48 "watched it all, liked it" 8 "watched some, boring" 4 "too long for me" 15 "too haskell for me" 13 "not interested"]]
+[[!poll 49 "watched it all, liked it" 8 "watched some, boring" 4 "too long for me" 15 "too haskell for me" 13 "not interested"]]
 
 [[!meta title="watch me program for half an hour"]]
 [[!tag haskell]]

poll vote (watched it all, liked it)
diff --git a/blog/entry/watch_me_code_for_half_an_hour.mdwn b/blog/entry/watch_me_code_for_half_an_hour.mdwn
index d80f87e9..ca8b8fad 100644
--- a/blog/entry/watch_me_code_for_half_an_hour.mdwn
+++ b/blog/entry/watch_me_code_for_half_an_hour.mdwn
@@ -14,7 +14,7 @@ Not shown is the hour I spent the next day changing the "optimize"
 subcommand implemented here into "--auto" options that can be passed to
 [[code/git-annex]]'s get and drop commands.
 
-[[!poll 47 "watched it all, liked it" 9 "watched some, boring" 4 "too long for me" 15 "too haskell for me" 13 "not interested"]]
+[[!poll 48 "watched it all, liked it" 8 "watched some, boring" 4 "too long for me" 15 "too haskell for me" 13 "not interested"]]
 
 [[!meta title="watch me program for half an hour"]]
 [[!tag haskell]]