summary refs log tree commit diff
path: root/www
diff options
context:
space:
mode:
Diffstat (limited to 'www')
-rw-r--r--www/causal.agency/.gitignore3
-rw-r--r--www/causal.agency/Makefile31
-rw-r--r--www/causal.agency/alpha.html92
-rw-r--r--www/causal.agency/catgirl.pty97
-rw-r--r--www/causal.agency/index.775
-rw-r--r--www/causal.agency/index.html.in101
-rw-r--r--www/causal.agency/index.sed5
-rw-r--r--www/causal.agency/lands.html176
-rw-r--r--www/causal.agency/play.pty23
-rw-r--r--www/causal.agency/scheme.pty10
-rw-r--r--www/causal.agency/scheme.sed6
-rw-r--r--www/causal.agency/style.css28
-rw-r--r--www/causal.agency/torus.pty774
-rw-r--r--www/git.causal.agency/.gitignore12
-rw-r--r--www/git.causal.agency/Makefile61
-rw-r--r--www/git.causal.agency/about-filter.sh10
-rw-r--r--www/git.causal.agency/cgitrc13
-rw-r--r--www/git.causal.agency/custom.css36
-rw-r--r--www/git.causal.agency/filter.c158
-rw-r--r--www/git.causal.agency/index.781
-rw-r--r--www/git.causal.agency/source-filter.sh3
-rw-r--r--www/photo.causal.agency/.gitignore6
-rw-r--r--www/photo.causal.agency/0062/body1
-rw-r--r--www/photo.causal.agency/0062/date1
-rw-r--r--www/photo.causal.agency/0062/film1
-rw-r--r--www/photo.causal.agency/0062/lens1
-rw-r--r--www/photo.causal.agency/0063/body1
-rw-r--r--www/photo.causal.agency/0063/date1
-rw-r--r--www/photo.causal.agency/0063/film1
-rw-r--r--www/photo.causal.agency/0063/lens1
-rw-r--r--www/photo.causal.agency/0064/body1
-rw-r--r--www/photo.causal.agency/0064/date1
-rw-r--r--www/photo.causal.agency/0064/film1
-rw-r--r--www/photo.causal.agency/0064/lens1
-rw-r--r--www/photo.causal.agency/0065/body1
-rw-r--r--www/photo.causal.agency/0065/date1
-rw-r--r--www/photo.causal.agency/0065/film1
-rw-r--r--www/photo.causal.agency/0065/lens1
-rw-r--r--www/photo.causal.agency/0066/body1
-rw-r--r--www/photo.causal.agency/0066/date1
-rw-r--r--www/photo.causal.agency/0066/film1
-rw-r--r--www/photo.causal.agency/0066/lens1
-rw-r--r--www/photo.causal.agency/0067/body1
-rw-r--r--www/photo.causal.agency/0067/date1
-rw-r--r--www/photo.causal.agency/0067/film1
-rw-r--r--www/photo.causal.agency/0067/lens1
-rw-r--r--www/photo.causal.agency/0068/body1
-rw-r--r--www/photo.causal.agency/0068/date1
-rw-r--r--www/photo.causal.agency/0068/film1
-rw-r--r--www/photo.causal.agency/0068/lens1
-rw-r--r--www/photo.causal.agency/0069/body1
-rw-r--r--www/photo.causal.agency/0069/date1
-rw-r--r--www/photo.causal.agency/0069/film1
-rw-r--r--www/photo.causal.agency/0069/lens1
-rw-r--r--www/photo.causal.agency/0070/body1
-rw-r--r--www/photo.causal.agency/0070/date1
-rw-r--r--www/photo.causal.agency/0070/film1
-rw-r--r--www/photo.causal.agency/0070/lens1
-rw-r--r--www/photo.causal.agency/0071/body1
-rw-r--r--www/photo.causal.agency/0071/date1
-rw-r--r--www/photo.causal.agency/0071/film1
-rw-r--r--www/photo.causal.agency/0071/lens1
-rw-r--r--www/photo.causal.agency/0072/body1
-rw-r--r--www/photo.causal.agency/0072/date1
-rw-r--r--www/photo.causal.agency/0072/film1
-rw-r--r--www/photo.causal.agency/0072/lens1
-rw-r--r--www/photo.causal.agency/0073/body1
-rw-r--r--www/photo.causal.agency/0073/date1
-rw-r--r--www/photo.causal.agency/0073/film1
-rw-r--r--www/photo.causal.agency/0073/lens1
-rw-r--r--www/photo.causal.agency/0074/body1
-rw-r--r--www/photo.causal.agency/0074/date1
-rw-r--r--www/photo.causal.agency/0074/film1
-rw-r--r--www/photo.causal.agency/0074/lens1
-rw-r--r--www/photo.causal.agency/0075/body1
-rw-r--r--www/photo.causal.agency/0075/date1
-rw-r--r--www/photo.causal.agency/0075/film1
-rw-r--r--www/photo.causal.agency/0075/lens1
-rw-r--r--www/photo.causal.agency/0076/body1
-rw-r--r--www/photo.causal.agency/0076/date1
-rw-r--r--www/photo.causal.agency/0076/film1
-rw-r--r--www/photo.causal.agency/0076/lens1
-rw-r--r--www/photo.causal.agency/0077/body1
-rw-r--r--www/photo.causal.agency/0077/date1
-rw-r--r--www/photo.causal.agency/0077/film1
-rw-r--r--www/photo.causal.agency/0077/lens1
-rw-r--r--www/photo.causal.agency/0078/body1
-rw-r--r--www/photo.causal.agency/0078/date1
-rw-r--r--www/photo.causal.agency/0078/film1
-rw-r--r--www/photo.causal.agency/0078/lens1
-rw-r--r--www/photo.causal.agency/0079/body1
-rw-r--r--www/photo.causal.agency/0079/date1
-rw-r--r--www/photo.causal.agency/0079/film1
-rw-r--r--www/photo.causal.agency/0079/lens1
-rw-r--r--www/photo.causal.agency/0080/body1
-rw-r--r--www/photo.causal.agency/0080/date1
-rw-r--r--www/photo.causal.agency/0080/film1
-rw-r--r--www/photo.causal.agency/0080/lens1
-rw-r--r--www/photo.causal.agency/0080/note3
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0832.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0850.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0852.txt4
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0858.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0859.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0865.txt2
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0890.txt9
-rw-r--r--www/photo.causal.agency/2024-04-14/IMG_1054.txt5
-rw-r--r--www/photo.causal.agency/2024-04-14/IMG_1058.txt6
-rw-r--r--www/photo.causal.agency/2024-04-14/IMG_1066.txt10
-rw-r--r--www/photo.causal.agency/2024-04-19/IMG_1158.txt6
-rw-r--r--www/photo.causal.agency/2024-04-20/IMG_1225.txt8
-rw-r--r--www/photo.causal.agency/2024-04-20/IMG_1234.txt8
-rw-r--r--www/photo.causal.agency/2024-04-20/IMG_1245.txt17
-rw-r--r--www/photo.causal.agency/2024-04-20/IMG_1253.txt7
-rw-r--r--www/photo.causal.agency/2024-04-20/IMG_1254.txt8
-rw-r--r--www/photo.causal.agency/2024-04-30/IMG_1619.txt8
-rw-r--r--www/photo.causal.agency/2024-05-03/IMG_1684.txt7
-rw-r--r--www/photo.causal.agency/2024-05-03/IMG_1692.txt4
-rw-r--r--www/photo.causal.agency/2024-05-03/IMG_1706.txt4
-rw-r--r--www/photo.causal.agency/2024-05-03/IMG_1724.txt3
-rw-r--r--www/photo.causal.agency/2024-05-03/IMG_1730.txt9
-rw-r--r--www/photo.causal.agency/2024-05-03/IMG_1748.txt4
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_1951.txt12
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_1969.txt7
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_1973.txt3
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_1996.txt4
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_1998.txt3
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_2009.txt4
-rw-r--r--www/photo.causal.agency/2024-05-06/IMG_2015.txt4
-rw-r--r--www/photo.causal.agency/2024-05-31/IMG_2078.txt5
-rw-r--r--www/photo.causal.agency/2024-05-31/IMG_2079.txt7
-rw-r--r--www/photo.causal.agency/2024-05-31/IMG_2084.txt4
-rw-r--r--www/photo.causal.agency/2024-05-31/IMG_2103.txt8
-rw-r--r--www/photo.causal.agency/2024-05-31/IMG_2114.txt6
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-009A.txt9
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-011A.txt6
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-012A.txt9
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-015A.txt6
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-016A.txt5
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-020A.txt12
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-024A.txt5
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-026A.txt2
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-028A.txt5
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-030A.txt7
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-031A.txt7
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-032A.txt7
-rw-r--r--www/photo.causal.agency/2024-06-08/R1-07534-036A.txt12
-rw-r--r--www/photo.causal.agency/2024-06-08/film1
-rw-r--r--www/photo.causal.agency/2024-06-08/lens1
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-002A.txt14
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-003A.txt6
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-007A.txt5
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-009A.txt7
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-010A.txt8
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-012A.txt3
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-013A.txt7
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-015A.txt4
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-016A.txt4
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-029A.txt4
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-031A.txt4
-rw-r--r--www/photo.causal.agency/2024-06-12/film1
-rw-r--r--www/photo.causal.agency/2024-06-12/lens1
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910004.txt5
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910008.txt3
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910009.txt7
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910014.txt4
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910015.txt4
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910016.txt2
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910017.txt3
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910019.txt5
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910021.txt6
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910022.txt4
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910023.txt4
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910026.txt10
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910027.txt2
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910031.txt3
-rw-r--r--www/photo.causal.agency/2024-06-22/000093910032.txt10
-rw-r--r--www/photo.causal.agency/2024-06-22/film1
-rw-r--r--www/photo.causal.agency/2024-06-22/lens1
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820005.txt8
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820006.txt7
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820008.txt9
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820010.txt9
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820011.txt10
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820012.txt3
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820013.txt7
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820018.txt5
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820019.txt2
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820022.txt4
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820023.txt3
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820026.txt3
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820029.txt3
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820033.txt3
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820035.txt7
-rw-r--r--www/photo.causal.agency/2024-06-25/000099820038.txt5
-rw-r--r--www/photo.causal.agency/2024-06-25/film1
-rw-r--r--www/photo.causal.agency/2024-06-25/lens1
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800001.txt11
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800002.txt4
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800007.txt4
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800008.txt4
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800011.txt3
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800017.txt2
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800020.txt7
-rw-r--r--www/photo.causal.agency/2024-07-01/000099800021.txt4
-rw-r--r--www/photo.causal.agency/2024-07-01/film1
-rw-r--r--www/photo.causal.agency/2024-07-01/lens1
-rw-r--r--www/photo.causal.agency/2024-07-03/000099800022.txt6
-rw-r--r--www/photo.causal.agency/2024-07-03/000099800023.txt4
-rw-r--r--www/photo.causal.agency/2024-07-03/000099800032.txt9
-rw-r--r--www/photo.causal.agency/2024-07-03/000099800036.txt3
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810001.txt4
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810002.txt4
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810008.txt3
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810013.txt6
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810014.txt7
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810017.txt6
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810019.txt5
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810021.txt4
-rw-r--r--www/photo.causal.agency/2024-07-03/000099810022.txt4
-rw-r--r--www/photo.causal.agency/2024-07-03/film1
-rw-r--r--www/photo.causal.agency/2024-07-03/lens1
-rw-r--r--www/photo.causal.agency/2024-07-04/000099810029.txt6
-rw-r--r--www/photo.causal.agency/2024-07-04/000099810033.txt6
-rw-r--r--www/photo.causal.agency/2024-07-04/000099810036.txt2
-rw-r--r--www/photo.causal.agency/2024-07-04/film1
-rw-r--r--www/photo.causal.agency/2024-07-04/lens1
-rw-r--r--www/photo.causal.agency/2024-07-06/000005110004.txt8
-rw-r--r--www/photo.causal.agency/2024-07-06/000005110005.txt5
-rw-r--r--www/photo.causal.agency/2024-07-06/000005110012.txt3
-rw-r--r--www/photo.causal.agency/2024-07-06/000005110013.txt7
-rw-r--r--www/photo.causal.agency/2024-07-06/000005110014.txt3
-rw-r--r--www/photo.causal.agency/2024-07-06/000005110017.txt2
-rw-r--r--www/photo.causal.agency/2024-07-06/film1
-rw-r--r--www/photo.causal.agency/2024-07-06/lens1
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110025.txt5
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110026.txt8
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110028.txt3
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110029.txt9
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110030.txt5
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110033.txt6
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110035.txt6
-rw-r--r--www/photo.causal.agency/2024-07-09/000005110036.txt8
-rw-r--r--www/photo.causal.agency/2024-07-09/film1
-rw-r--r--www/photo.causal.agency/2024-07-09/lens1
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180002.txt3
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180006.txt10
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180010.txt8
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180014.txt3
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180020.txt11
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180023.txt5
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180025.txt6
-rw-r--r--www/photo.causal.agency/2024-07-14/000009180028.txt3
-rw-r--r--www/photo.causal.agency/2024-07-14/film1
-rw-r--r--www/photo.causal.agency/2024-07-14/lens1
-rw-r--r--www/photo.causal.agency/2024-07-27/000025480003.txt5
-rw-r--r--www/photo.causal.agency/2024-07-27/000025480009.txt2
-rw-r--r--www/photo.causal.agency/2024-07-27/000025480010.txt5
-rw-r--r--www/photo.causal.agency/2024-07-27/000025480012.txt7
-rw-r--r--www/photo.causal.agency/2024-07-27/film1
-rw-r--r--www/photo.causal.agency/2024-07-27/lens1
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480014.txt3
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480017.txt5
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480018.txt5
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480028.txt11
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480030.txt21
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480033.txt7
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480034.txt8
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480035.txt7
-rw-r--r--www/photo.causal.agency/2024-07-29/000025480036.txt15
-rw-r--r--www/photo.causal.agency/2024-07-29/film1
-rw-r--r--www/photo.causal.agency/2024-07-29/lens1
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490001.txt2
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490002.txt4
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490003.txt2
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490004.txt6
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490009.txt4
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490010.txt3
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490012.txt5
-rw-r--r--www/photo.causal.agency/2024-07-30/000025490014.txt5
-rw-r--r--www/photo.causal.agency/2024-07-30/film1
-rw-r--r--www/photo.causal.agency/2024-07-30/lens1
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490019.txt5
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490026.txt5
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490027.txt6
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490029.txt6
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490030.txt5
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490031.txt4
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490035.txt7
-rw-r--r--www/photo.causal.agency/2024-08-02/000025490036.txt11
-rw-r--r--www/photo.causal.agency/2024-08-02/film1
-rw-r--r--www/photo.causal.agency/2024-08-02/lens1
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420002.txt5
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420005.txt4
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420007.txt3
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420011.txt2
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420012.txt4
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420015.txt4
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420016.txt8
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420020.txt2
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420024.txt3
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420026.txt3
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420027.txt8
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420028.txt2
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420029.txt3
-rw-r--r--www/photo.causal.agency/2024-08-10/000031420034.txt4
-rw-r--r--www/photo.causal.agency/2024-08-10/body1
-rw-r--r--www/photo.causal.agency/2024-08-10/film1
-rw-r--r--www/photo.causal.agency/2024-08-10/lens1
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750004.txt2
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750007.txt7
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750008.txt3
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750009.txt2
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750010.txt3
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750013.txt5
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750014.txt8
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750016.txt7
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750024.txt6
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750027.txt5
-rw-r--r--www/photo.causal.agency/2024-08-22/000044750028.txt3
-rw-r--r--www/photo.causal.agency/2024-08-22/body1
-rw-r--r--www/photo.causal.agency/2024-08-22/film1
-rw-r--r--www/photo.causal.agency/2024-08-22/lens1
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740001.txt8
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740002.txt5
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740010.txt5
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740014.txt4
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740017.txt2
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740021.txt5
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740024.txt8
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740030.txt8
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740031.txt4
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740033.txt6
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740034.txt6
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740035.txt4
-rw-r--r--www/photo.causal.agency/2024-08-23/000044740036.txt14
-rw-r--r--www/photo.causal.agency/2024-08-23/body1
-rw-r--r--www/photo.causal.agency/2024-08-23/film1
-rw-r--r--www/photo.causal.agency/2024-08-23/lens1
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730001.txt6
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730002.txt4
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730004.txt5
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730008.txt6
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730012.txt3
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730014.txt3
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730018.txt4
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730026.txt8
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730028.txt2
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730029.txt2
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730030.txt1
-rw-r--r--www/photo.causal.agency/2024-08-24/000044730035.txt4
-rw-r--r--www/photo.causal.agency/2024-08-24/body1
-rw-r--r--www/photo.causal.agency/2024-08-24/film1
-rw-r--r--www/photo.causal.agency/2024-08-24/lens1
-rw-r--r--www/photo.causal.agency/2024-08-29/000054970002.txt3
-rw-r--r--www/photo.causal.agency/2024-08-29/000054970004.txt5
-rw-r--r--www/photo.causal.agency/2024-08-29/body1
-rw-r--r--www/photo.causal.agency/2024-08-29/film1
-rw-r--r--www/photo.causal.agency/2024-08-29/lens1
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970017.txt11
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970018.txt7
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970019.txt6
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970021.txt11
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970022.txt3
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970023.txt3
-rw-r--r--www/photo.causal.agency/2024-09-02/000054970029.txt6
-rw-r--r--www/photo.causal.agency/2024-09-02/body1
-rw-r--r--www/photo.causal.agency/2024-09-02/film1
-rw-r--r--www/photo.causal.agency/2024-09-02/lens1
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000003.txt6
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000009.txt5
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000010.txt3
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000014.txt4
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000017.txt4
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000018.txt5
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000023.txt5
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000024.txt5
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000025.txt5
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000026.txt4
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000027.txt3
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000032.txt4
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000033.txt4
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000038.txt4
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000042.txt3
-rw-r--r--www/photo.causal.agency/2024-09-05/06124000044.txt8
-rw-r--r--www/photo.causal.agency/2024-09-05/body1
-rw-r--r--www/photo.causal.agency/2024-09-05/film1
-rw-r--r--www/photo.causal.agency/2024-09-05/lens1
-rw-r--r--www/photo.causal.agency/2024-09-07/body1
-rw-r--r--www/photo.causal.agency/2024-09-07/film1
-rw-r--r--www/photo.causal.agency/2024-09-07/lens1
-rw-r--r--www/photo.causal.agency/2024-09-12/body1
-rw-r--r--www/photo.causal.agency/2024-09-12/film1
-rw-r--r--www/photo.causal.agency/2024-09-12/lens1
-rw-r--r--www/photo.causal.agency/2024-09-14/body1
-rw-r--r--www/photo.causal.agency/2024-09-14/film1
-rw-r--r--www/photo.causal.agency/2024-09-14/lens1
-rw-r--r--www/photo.causal.agency/2024-09-15/body1
-rw-r--r--www/photo.causal.agency/2024-09-15/film1
-rw-r--r--www/photo.causal.agency/2024-09-15/lens1
-rw-r--r--www/photo.causal.agency/2024-09-22/body1
-rw-r--r--www/photo.causal.agency/2024-09-22/film1
-rw-r--r--www/photo.causal.agency/2024-09-22/lens1
-rw-r--r--www/photo.causal.agency/2024-09-28/body1
-rw-r--r--www/photo.causal.agency/2024-09-28/film1
-rw-r--r--www/photo.causal.agency/2024-09-28/lens1
-rw-r--r--www/photo.causal.agency/2024-09-29/body1
-rw-r--r--www/photo.causal.agency/2024-09-29/film1
-rw-r--r--www/photo.causal.agency/2024-09-29/lens1
-rw-r--r--www/photo.causal.agency/2024-10-01/body1
-rw-r--r--www/photo.causal.agency/2024-10-01/film1
-rw-r--r--www/photo.causal.agency/2024-10-01/lens1
-rw-r--r--www/photo.causal.agency/2024-10-05/body1
-rw-r--r--www/photo.causal.agency/2024-10-05/film1
-rw-r--r--www/photo.causal.agency/2024-10-05/lens1
-rw-r--r--www/photo.causal.agency/2024-10-06/body1
-rw-r--r--www/photo.causal.agency/2024-10-06/film1
-rw-r--r--www/photo.causal.agency/2024-10-06/lens1
-rw-r--r--www/photo.causal.agency/2024-10-12/body1
-rw-r--r--www/photo.causal.agency/2024-10-12/film1
-rw-r--r--www/photo.causal.agency/2024-10-12/lens1
-rw-r--r--www/photo.causal.agency/2024-10-17/body1
-rw-r--r--www/photo.causal.agency/2024-10-17/film1
-rw-r--r--www/photo.causal.agency/2024-10-17/lens1
-rw-r--r--www/photo.causal.agency/2024-10-20/body1
-rw-r--r--www/photo.causal.agency/2024-10-20/film1
-rw-r--r--www/photo.causal.agency/2024-10-20/lens1
-rw-r--r--www/photo.causal.agency/2024-10-23/body1
-rw-r--r--www/photo.causal.agency/2024-10-23/film1
-rw-r--r--www/photo.causal.agency/2024-10-23/lens1
-rw-r--r--www/photo.causal.agency/2024-10-27/body1
-rw-r--r--www/photo.causal.agency/2024-10-27/film1
-rw-r--r--www/photo.causal.agency/2024-10-27/lens1
-rw-r--r--www/photo.causal.agency/2024-11-02/body1
-rw-r--r--www/photo.causal.agency/2024-11-02/film1
-rw-r--r--www/photo.causal.agency/2024-11-02/lens1
-rw-r--r--www/photo.causal.agency/2024-11-06/body1
-rw-r--r--www/photo.causal.agency/2024-11-06/film1
-rw-r--r--www/photo.causal.agency/2024-11-06/lens1
-rw-r--r--www/photo.causal.agency/2024-11-09/body1
-rw-r--r--www/photo.causal.agency/2024-11-09/film1
-rw-r--r--www/photo.causal.agency/2024-11-09/lens1
-rw-r--r--www/photo.causal.agency/2024-11-12/body1
-rw-r--r--www/photo.causal.agency/2024-11-12/film1
-rw-r--r--www/photo.causal.agency/2024-11-12/lens1
-rw-r--r--www/photo.causal.agency/2024-11-16/body1
-rw-r--r--www/photo.causal.agency/2024-11-16/film1
-rw-r--r--www/photo.causal.agency/2024-11-16/lens1
-rw-r--r--www/photo.causal.agency/2024-11-18/body1
-rw-r--r--www/photo.causal.agency/2024-11-18/film1
-rw-r--r--www/photo.causal.agency/2024-11-18/lens1
-rw-r--r--www/photo.causal.agency/2024-11-23/body1
-rw-r--r--www/photo.causal.agency/2024-11-23/film1
-rw-r--r--www/photo.causal.agency/2024-11-23/lens1
-rw-r--r--www/photo.causal.agency/2024-12-21/body1
-rw-r--r--www/photo.causal.agency/2024-12-21/film1
-rw-r--r--www/photo.causal.agency/2024-12-21/lens1
-rw-r--r--www/photo.causal.agency/2024-12-28/body1
-rw-r--r--www/photo.causal.agency/2024-12-28/film1
-rw-r--r--www/photo.causal.agency/2024-12-28/lens1
-rw-r--r--www/photo.causal.agency/2025-01-18/body1
-rw-r--r--www/photo.causal.agency/2025-01-18/film1
-rw-r--r--www/photo.causal.agency/2025-01-18/lens1
-rw-r--r--www/photo.causal.agency/2025-01-26/body1
-rw-r--r--www/photo.causal.agency/2025-01-26/film1
-rw-r--r--www/photo.causal.agency/2025-01-26/lens1
-rw-r--r--www/photo.causal.agency/2025-02-08/body1
-rw-r--r--www/photo.causal.agency/2025-02-08/film1
-rw-r--r--www/photo.causal.agency/2025-02-08/lens1
-rw-r--r--www/photo.causal.agency/2025-02-11/body1
-rw-r--r--www/photo.causal.agency/2025-02-11/film1
-rw-r--r--www/photo.causal.agency/2025-02-11/lens1
-rw-r--r--www/photo.causal.agency/2025-02-17/body1
-rw-r--r--www/photo.causal.agency/2025-02-17/film1
-rw-r--r--www/photo.causal.agency/2025-02-17/lens1
-rw-r--r--www/photo.causal.agency/2025-02-23/body1
-rw-r--r--www/photo.causal.agency/2025-02-23/film1
-rw-r--r--www/photo.causal.agency/2025-02-23/lens1
-rw-r--r--www/photo.causal.agency/2025-02-25/body1
-rw-r--r--www/photo.causal.agency/2025-02-25/film1
-rw-r--r--www/photo.causal.agency/2025-02-25/lens1
-rw-r--r--www/photo.causal.agency/2025-03-15/body1
-rw-r--r--www/photo.causal.agency/2025-03-15/film1
-rw-r--r--www/photo.causal.agency/2025-03-15/lens1
-rw-r--r--www/photo.causal.agency/2025-03-16/body1
-rw-r--r--www/photo.causal.agency/2025-03-16/film1
-rw-r--r--www/photo.causal.agency/2025-03-16/lens1
-rw-r--r--www/photo.causal.agency/2025-03-18/body1
-rw-r--r--www/photo.causal.agency/2025-03-18/film1
-rw-r--r--www/photo.causal.agency/2025-03-18/lens1
-rw-r--r--www/photo.causal.agency/2025-03-19/body1
-rw-r--r--www/photo.causal.agency/2025-03-19/film1
-rw-r--r--www/photo.causal.agency/2025-03-19/lens1
-rw-r--r--www/photo.causal.agency/2025-03-22/body1
-rw-r--r--www/photo.causal.agency/2025-03-22/film1
-rw-r--r--www/photo.causal.agency/2025-03-22/lens1
-rw-r--r--www/photo.causal.agency/2025-03-23/body1
-rw-r--r--www/photo.causal.agency/2025-03-23/film1
-rw-r--r--www/photo.causal.agency/2025-03-23/lens1
-rw-r--r--www/photo.causal.agency/c35/body1
-rw-r--r--www/photo.causal.agency/c35/lens1
-rw-r--r--www/photo.causal.agency/fx-3/body1
-rw-r--r--www/photo.causal.agency/fx-3/lens1
-rw-r--r--www/photo.causal.agency/gear.html65
-rw-r--r--www/photo.causal.agency/generate.sh284
-rw-r--r--www/photo.causal.agency/mastodon.sh54
-rw-r--r--www/photo.causal.agency/rsync.sh5
-rw-r--r--www/photo.causal.agency/trips.html365
-rw-r--r--www/temp.causal.agency/.gitignore1
-rw-r--r--www/temp.causal.agency/Makefile15
-rw-r--r--www/temp.causal.agency/up.c193
-rw-r--r--www/text.causal.agency/.gitignore2
-rw-r--r--www/text.causal.agency/010-irc-suite.732
-rw-r--r--www/text.causal.agency/011-libretls.7220
-rw-r--r--www/text.causal.agency/012-inability.739
-rw-r--r--www/text.causal.agency/013-hot-tips.7156
-rw-r--r--www/text.causal.agency/014-using-vi.7135
-rw-r--r--www/text.causal.agency/015-reusing-tags.7155
-rw-r--r--www/text.causal.agency/016-using-openbsd.7505
-rw-r--r--www/text.causal.agency/017-unpasswords.7153
-rw-r--r--www/text.causal.agency/018-operating-systems.786
-rw-r--r--www/text.causal.agency/019-mailing-list.7286
-rw-r--r--www/text.causal.agency/020-c-style.7172
-rw-r--r--www/text.causal.agency/021-time-machine.7144
-rw-r--r--www/text.causal.agency/022-swans-are-dead.7164
-rw-r--r--www/text.causal.agency/023-sparse-checkout.7144
-rw-r--r--www/text.causal.agency/024-seprintf.7137
-rw-r--r--www/text.causal.agency/025-v6-pwd.7330
-rw-r--r--www/text.causal.agency/026-git-comment.7190
-rw-r--r--www/text.causal.agency/027-openbsd-linode.7202
-rw-r--r--www/text.causal.agency/028-names.781
-rw-r--r--www/text.causal.agency/029-topics.7116
-rw-r--r--www/text.causal.agency/030-discs.7114
-rw-r--r--www/text.causal.agency/031-books-2021.7127
-rw-r--r--www/text.causal.agency/032-albums-2021.7173
-rw-r--r--www/text.causal.agency/033-jorts.7485
-rw-r--r--www/text.causal.agency/034-voices.756
-rw-r--r--www/text.causal.agency/035-addendum-2021.7111
-rw-r--r--www/text.causal.agency/036-compassion.7105
-rw-r--r--www/text.causal.agency/037-care.7167
-rw-r--r--www/text.causal.agency/038-agency.785
-rw-r--r--www/text.causal.agency/039-apologies.781
-rw-r--r--www/text.causal.agency/040-sound-memory.7165
-rw-r--r--www/text.causal.agency/041-albums-2022.7185
-rw-r--r--www/text.causal.agency/042-comfort-music.762
-rw-r--r--www/text.causal.agency/043-little-blessings.778
-rw-r--r--www/text.causal.agency/044-film-review.7208
-rw-r--r--www/text.causal.agency/Makefile53
-rw-r--r--www/text.causal.agency/colb.c16
-rw-r--r--www/text.causal.agency/feed.sh40
550 files changed, 9006 insertions, 1104 deletions
diff --git a/www/causal.agency/.gitignore b/www/causal.agency/.gitignore
index 7935a3c1..b00b1c3c 100644
--- a/www/causal.agency/.gitignore
+++ b/www/causal.agency/.gitignore
@@ -1,3 +1,4 @@
-*.html
+index.html
+leveler.html
 scheme.css
 scheme.png
diff --git a/www/causal.agency/Makefile b/www/causal.agency/Makefile
index 407a85d8..8c74f8f1 100644
--- a/www/causal.agency/Makefile
+++ b/www/causal.agency/Makefile
@@ -1,30 +1,23 @@
-WEBROOT = /usr/local/www/causal.agency
+WEBROOT = /var/www/causal.agency
 
-FILES = index.html scheme.png
+GEN = index.html scheme.css scheme.png
+FILES = ${GEN} style.css alpha.html lands.html
 
 all: ${FILES}
 
-install: ${FILES}
-	install -C -m 644 ${FILES} ${WEBROOT}
-
-INCLUDES = scheme.css torus.html play.html catgirl.html scheme.html
-
-index.html: index.html.in index.sed ${INCLUDES}
-	sed -f index.sed index.html.in > index.html
-
-FLAGS_torus.pty = -n -h 25
-FLAGS_scheme.pty = -n -h 10
+.SUFFIXES: .7 .html
 
-.SUFFIXES: .html .pty
+.7.html:
+	mandoc -T html -O style=style.css $< > $@
 
-.pty.html:
-	shotty ${FLAGS_$<} $< > $@
-
-scheme.css: scheme.sed
-	scheme -s | sed -f scheme.sed > scheme.css
+scheme.css:
+	scheme -st > scheme.css
 
 scheme.png:
 	scheme -g > scheme.png
 
+install: ${FILES}
+	install -C -m 644 ${FILES} ${WEBROOT}
+
 clean:
-	rm -f *.html scheme.css scheme.png
+	rm -f ${GEN}
diff --git a/www/causal.agency/alpha.html b/www/causal.agency/alpha.html
new file mode 100644
index 00000000..0d83f530
--- /dev/null
+++ b/www/causal.agency/alpha.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>all 26 letters of the alphabet RANKED</title>
+<style>
+body, button { font-size: 200%; text-align: center; }
+button { margin: 1em; padding: 1ch; }
+button#shuffle { font-size: 100%; }
+</style>
+
+which letter do you like more?
+<p>
+<button id="a">A</button>
+<button id="b">B</button>
+<p>
+<details>
+<summary>current ranking</summary>
+<p>
+<span id="ranking">ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<p>
+<button id="shuffle">reshuffle</button>
+</details>
+
+<script>
+let buttonA = document.getElementById("a");
+let buttonB = document.getElementById("b");
+let ranking = document.getElementById("ranking");
+
+let alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
+let rand = (bound) => Math.floor(Math.random() * bound);
+function shuffle() {
+	for (let i = alpha.length - 1; i > 0; --i) {
+		let j = rand(i + 1);
+		let x = alpha[i];
+		alpha[i] = alpha[j];
+		alpha[j] = x;
+	}
+}
+if (localStorage.getItem("alpha")) {
+	alpha = localStorage.getItem("alpha").split("");
+} else {
+	shuffle();
+}
+
+let index = 0;
+let even = true;
+function choose(o) {
+	if (o == "b") {
+		let x = alpha[index];
+		alpha[index] = alpha[index + 1];
+		alpha[index + 1] = x;
+	}
+	index += 2;
+	if (index > alpha.length - 2) {
+		even = !even;
+		index = (even ? 0 : 1);
+	}
+	update();
+}
+
+document.onkeydown = function(event) {
+	if (event.key.toUpperCase() == alpha[index]) {
+		choose("a");
+	} else if (event.key.toUpperCase() == alpha[index + 1]) {
+		choose("b");
+	}
+}
+
+function update() {
+	localStorage.setItem("alpha", alpha.join(""));
+	ranking.innerText = alpha.join("");
+	let a = buttonA;
+	let b = buttonB;
+	if (rand(2)) {
+		a = buttonB;
+		b = buttonA;
+	}
+	let lc = (c) => c;
+	if (rand(2)) lc = (c) => c.toLowerCase();
+	a.innerText = lc(alpha[index]);
+	b.innerText = lc(alpha[index + 1]);
+	a.onclick = () => choose("a");
+	b.onclick = () => choose("b");
+}
+update();
+
+document.getElementById("shuffle").onclick = function() {
+	if (confirm("Are you SURE you want to throw away all your hard work?")) {
+		shuffle();
+		update();
+	}
+}
+</script>
diff --git a/www/causal.agency/catgirl.pty b/www/causal.agency/catgirl.pty
deleted file mode 100644
index 651e83db..00000000
--- a/www/causal.agency/catgirl.pty
+++ /dev/null
@@ -1,97 +0,0 @@
-[?1049h(B[?7h[?1h=[?1004h[?2004h(B(B 0 <network> 
(Bcatgirl(B is GPLv3 fwee softwawe ^w^  code is avaiwable fwomhttps://git.causal.agency/catgirl

-Traveling...

-]2;chat.freenode.net <network>
--adams.freenode.net- *** Looking up your hostname...

--adams.freenode.net- *** Checking Ident

--adams.freenode.net- *** Couldn't look up your hostname

-(B
--adams.freenode.net- *** No Ident response

-(B
-You arrive in freenode

-
--(B Welcome to adams.freenode.net. Thanks to ATW Internet Kft

--(B (http://www.atw.hu) for sponsoring this server!

--
--(B ADAMS, DOUGLAS (1952-2001).  Author of The Hitch Hikers Guide

--(B to the Galaxy and many other witty and humourous books,

--(B portrayed in his uniquely British irony. He is sorely missed

-
--(B by many millions of devoted fans. "So long and thanks for all

--(B the books!"

--
--(B Welcome to freenode - supporting the free and open source

--(B software communities since 1998.

--
-(B
--(B By connecting to freenode you indicate that you have read and

--(B accept our policies and guidelines as set out on https://freenode.net

--
-(B
--(B In the event that you observe behaviour that contravenes our policies,

--(B please notify a volunteer staff member via private message, or send us an

--(B e-mail to complaints@freenode.net -- we will do our best to address the

-
--(B situation within a reasonable period of time, and we may request further

--(B information or, as appropriate, involve other parties such as channel

-  operators

--(B Group Contacts representing an on-topic group.

-
--
--(B freenode runs an open proxy scanner.

--
--(B If you are looking for assistance, you may be able to find a list of

--(B volunteer staff on '/stats p' (shows only on-call staff) or by joining

--(B #freenode and using the '/who freenode/staff/*' command. You may message

-
--(B any of us at any time. Please note that freenode predominantly provides

--(B assistance via private message, and while we have a network channel the

--(B primary venue for support requests is via private message to a member

--(B of the volunteer staff team.

--
-(B
--(B From time to time, volunteer staff may send server-wide notices relating to

--(B the project, or the communities that we host. The majority of such notices

--(B will be sent as wallops, and you can '/mode <yournick> +w' to ensure that you

--(B do not miss them. Important messages relating to the freenode project,

-  including

-
--(B notices of upcoming maintenance and other scheduled downtime will be issued

-  as

--(B global notices.

--
--(B Representing an on-topic project? Don't forget to register, more information

--(B can be found on the https://freenode.net website under "Group Registration".

--
-(B
--(B Thank you also to our server sponsors for the sustained support in keeping

-  the

--(B network going for close to two decades.

--
--(B Thank you for using freenode!

- 1 freenode-connect (2) 
(B]2;freenode <network> (+2!) 1 freenode-connect (2) (B 2 #ascii.town 

-(B
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-catgirl(B arrives in #ascii.town(B

-The sign in #ascii.town(B reads: https://ascii.town public SSH services and IRC

-things <3 AGPL

-In #ascii.town(B are catgirl, gjabell, danopia, larbob, ep, nonlinear, epilys,

-benharri, june, yourfate, josuah

-<catgirl> (B]2;freenode #ascii.town (+2!)
/close 1(B 1(B
<catgirl> (B]2;freenode #ascii.townhello, world!
- 

-<catgirl> (B(B(1) 
(B* june(B waves
-(B]2;freenode #ascii.town (1)]2;freenode #ascii.town
\ No newline at end of file
diff --git a/www/causal.agency/index.7 b/www/causal.agency/index.7
new file mode 100644
index 00000000..75c37d87
--- /dev/null
+++ b/www/causal.agency/index.7
@@ -0,0 +1,75 @@
+.Dd June 16, 2024
+.Dt CAUSAL.AGENCY 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm june
+.Nd enthusiast (she/they)
+.
+.Sh SYNOPSIS
+.Nm mail
+.Mt june@causal.agency
+.Nm
+in
+.Li #ascii.town
+on tilde.chat
+.
+.Sh DESCRIPTION
+I like photography,
+Magic: The Gathering
+and making mostly IRC software in C.
+I like
+.Ox
+but also the GPL.
+I'm learning how to be a person.
+.
+.Pp
+.Lk https://git.causal.agency code
+\(em
+.Lk https://text.causal.agency words
+\(em
+.Lk https://photo.causal.agency photos
+\(em
+.Lk /list/ mailist
+.
+.Pp
+These are some things I've done:
+.Bl -tag -width Ds
+.It Lk https://git.causal.agency/pounce/about pounce
+a multi-client-first IRC bouncer
+.It Lk https://git.causal.agency/catgirl/about catgirl
+a cosy IRC client
+.It Lk https://git.causal.agency/litterbox/about litterbox
+a full-text search IRC logger
+.It Lk https://git.causal.agency/scooper/about scooper
+a web interface for litterbox
+.It Lk https://git.causal.agency/kitd/about kitd
+a process supervisor
+.It Lk https://git.causal.agency/imbox/about "imbox & git-fetch-email"
+a tool to pull patches out of IMAP
+.It Lk https://git.causal.agency/bubger/about bubger
+a mailing list archive generator for IMAP
+.It Lk https://git.causal.agency/notemap/about notemap
+a tool to mirror text files to IMAP notes
+.It Lk https://ascii.town/explore.html torus@ascii.town
+a collaborative ASCII art project
+.It Lk ssh://play@ascii.town play@ascii.town
+some games to play over
+.Xr ssh 1
+.It Lk https://git.causal.agency/cards/about cards
+a
+.Pa CARDS.DLL
+loader for SDL
+.It Lk scheme.png scheme
+an earthy terminal colour scheme
+.El
+.
+.Sh SEE ALSO
+.Bl -bullet
+.It
+.Lk /bin/ bin
+.It
+.Lk lands.html "Magic lands quiz"
+.It
+.Lk alpha.html "alphabet ranking game"
+.El
diff --git a/www/causal.agency/index.html.in b/www/causal.agency/index.html.in
deleted file mode 100644
index a8f95926..00000000
--- a/www/causal.agency/index.html.in
+++ /dev/null
@@ -1,101 +0,0 @@
-<!DOCTYPE html>
-<title>Causal Agency</title>
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<style>
-body {
-	font-family: monospace;
-	max-width: 80ch;
-	margin: 2em auto;
-	padding: 0 1ch;
-}
-h1 {
-	font-size: inherit;
-	margin: 1em 0 0;
-}
-p { margin: 0 0 1em 4ch; }
-a { text-decoration: none; }
-/* scheme.css */
-</style>
-
-<p>
-Hi.
-I'm an aspiring person.
-I'm still trying to figure out how to be.
-<p>
-You can find me in
-<a href="ircs://chat.freenode.net:6697/#ascii.town">#ascii.town</a>
-on freenode
-or send mail to june@.
-<p>
-These are things I've made.
-
-<h1><a href="https://git.causal.agency/pounce/about">pounce</a></h1>
-<p>
-multi-client IRC bouncer
-
-<h1><a href="https://git.causal.agency/litterbox/about">litterbox</a></h1>
-<p>
-full-text search IRC logger
-
-<h1>catgirl</h1>
-<p>
-artisanal IRC client
-<p>
-<a href="ssh://chat@ascii.town">ssh chat@ascii.town</a>
---
-<a href="https://git.causal.agency/catgirl/about">git</a>
-<p>
-<!-- catgirl.html -->
-
-<h1><a href="https://git.causal.agency/imbox/about">imbox & git-fetch-email</a></h1>
-<p>
-IMAP to mbox
-
-<h1><a href="https://git.causal.agency/notemap/about">notemap</a></h1>
-<p>
-IMAP notes mirror
-
-<h1>torus</h1>
-<p>
-collaborative ASCII art project
-<p>
-<a href="ssh://torus@ascii.town">ssh torus@ascii.town</a>
---
-<a href="https://ascii.town/explore.html">explore</a>
---
-<a href="https://git.causal.agency/torus">git</a>
-<p>
-<!-- torus.html -->
-
-<h1>play</h1>
-<p>
-2048 clone with scoreboard
-<p>
-<a href="ssh://play@ascii.town">ssh play@ascii.town</a>
---
-<a href="https://git.causal.agency/play">git</a>
-<p>
-<!-- play.html -->
-
-<h1><a href="https://git.causal.agency/cards/about">cards</a></h1>
-<p>
-CARDS.DLL loader for SDL
-
-<h1>scheme</h1>
-<p>
-earthy terminal colours
-<p>
-<a href="scheme.png">palette</a>
---
-<a href="bin/scheme.html">src</a>
-<!-- scheme.html -->
-
-<h1><a href="bin/">bin</a></h1>
-<p>
-little utilities
-
-<h1>text</h1>
-<p>
-words about code
-<p>
-<a href="https://text.causal.agency">text.causal.agency</a>
diff --git a/www/causal.agency/index.sed b/www/causal.agency/index.sed
deleted file mode 100644
index 0123ec1e..00000000
--- a/www/causal.agency/index.sed
+++ /dev/null
@@ -1,5 +0,0 @@
-/[*] scheme[.]css/r scheme.css
-/!-- torus[.]html/r torus.html
-/!-- play[.]html/r play.html
-/!-- catgirl[.]html/r catgirl.html
-/!-- scheme[.]html/r scheme.html
diff --git a/www/causal.agency/lands.html b/www/causal.agency/lands.html
new file mode 100644
index 00000000..7aaadd80
--- /dev/null
+++ b/www/causal.agency/lands.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html>
+<title>Lands Quiz</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<style>
+html { font: 14pt sans-serif; line-height: 1.5em; }
+body { padding: 1em 1ch; max-width: 78ch; margin: auto; }
+h1 { text-align: center; }
+h2 { margin-top: 0; }
+button { font-size: 100%; padding: 0.5em 1ch; }
+img { max-width: 100%; }
+div.cols { display: grid; grid-template-columns: 1fr 1fr; gap: 2ch; }
+</style>
+
+<h1 id="loading">Loading...</h1>
+<h1 id="error" hidden>Failed to load cards :(</h1>
+
+<div id="game" hidden>
+<h1>Magic Lands Quiz</h1>
+<p>Try to guess the colours of mana each land produces!</p>
+<div class="cols">
+	<div>
+		<img id="back" src="https://backs.scryfall.io/normal/0/a/0aeebaf5-8c7d-4636-9e82-8c27447861f7.jpg">
+		<a id="link" target="_blank">
+			<img id="image1" hidden>
+			<img id="image2" hidden>
+		</a>
+	</div>
+	<div>
+		<h2 id="name"></h2>
+		<input type="checkbox" id="w"> <label for="w">White</label><br>
+		<input type="checkbox" id="u"> <label for="u">Blue</label><br>
+		<input type="checkbox" id="b"> <label for="b">Black</label><br>
+		<input type="checkbox" id="r"> <label for="r">Red</label><br>
+		<input type="checkbox" id="g"> <label for="g">Green</label><br>
+		<p><button id="submit">Submit</button></p>
+		<h3>Score: <span id="score">0</span>/<span id="total">0</span></h3>
+	</div>
+</div>
+</div>
+
+<script>
+function shuffle(arr) {
+	let rand = (bound) => Math.floor(Math.random() * bound);
+	for (let i = arr.length-1; i > 0; --i) {
+		let j = rand(i+1);
+		let x = arr[i];
+		arr[i] = arr[j];
+		arr[j] = x;
+	}
+}
+
+const CardBack =
+"https://backs.scryfall.io/normal/0/a/0aeebaf5-8c7d-4636-9e82-8c27447861f7.jpg";
+
+function hideCard() {
+	document.getElementById("back").hidden = false;
+	document.getElementById("image1").hidden = true;
+	document.getElementById("image2").hidden = true;
+}
+
+function showCard(card) {
+	document.getElementById("back").hidden = true;
+	document.getElementById("link").href = card.scryfall_uri;
+	let image1 = document.getElementById("image1");
+	let image2 = document.getElementById("image2");
+	if (card.card_faces) {
+		image1.src = card.card_faces[0].image_uris.normal;
+		image2.src = card.card_faces[1].image_uris.normal;
+		image1.hidden = false;
+		image2.hidden = false;
+	} else {
+		image1.src = card.image_uris.normal;
+		image1.hidden = false;
+	}
+}
+
+function resetChecks() {
+	for (let c of "wubrg") {
+		let input = document.getElementById(c);
+		input.checked = false;
+		input.disabled = false;
+		input.labels[0].style.fontWeight = "normal";
+	}
+}
+
+function checkChecks(card) {
+	let score = 0;
+	let total = 0;
+	let checked = 0;
+	for (let c of "wubrg") {
+		let input = document.getElementById(c);
+		let produced = card.produced_mana.includes(c.toUpperCase());
+		if (produced) {
+			total++;
+			input.labels[0].style.fontWeight = "bold";
+			if (input.checked) score++;
+		}
+		if (input.checked) checked++;
+		input.disabled = true;
+	}
+	if (checked > total) score -= (checked - total);
+	if (score < 0) score = 0;
+	return { score: score, total: total };
+}
+
+document.onkeydown = function(event) {
+	for (let c of "wubrg") {
+		if (event.key == c) {
+			let input = document.getElementById(c);
+			if (!input.disabled) input.checked ^= true;
+		}
+	}
+	if (event.key == "Enter") {
+		document.getElementById("submit").click();
+	}
+}
+
+let score = 0;
+let total = 0;
+let cards = [];
+let card = null;
+
+function nextCard() {
+	hideCard();
+	resetChecks();
+	card = cards.shift();
+	document.getElementById("name").innerText = card.name;
+}
+
+document.getElementById("submit").onclick = function() {
+	if (card) {
+		let { score: cardScore, total: cardTotal } = checkChecks(card);
+		total += cardTotal;
+		score += cardScore;
+		document.getElementById("score").innerText = score;
+		document.getElementById("total").innerText = total;
+		showCard(card);
+		card = null;
+		if (cards.length) {
+			this.innerText = "Next card";
+		} else {
+			this.disabled = true;
+			this.innerText = "No more cards";
+		}
+	} else {
+		nextCard();
+		this.innerText = "Submit";
+	}
+}
+
+function loadCards(resp) {
+	let loading = document.getElementById("loading");
+	let error = document.getElementById("error");
+	let game = document.getElementById("game");
+	if (resp.status != 200) {
+		loading.hidden = true;
+		error.hidden = false;
+	}
+	resp.json().then((json) => {
+		cards.push(...json.data);
+		if (json.has_more) {
+			setTimeout(() => fetch(json.next_page).then(loadCards), 50);
+		} else {
+			loading.hidden = true;
+			game.hidden = false;
+			shuffle(cards);
+			nextCard();
+		}
+	});
+}
+
+const Search =
+"https://api.scryfall.com/cards/search?q=t:land+id>=2+produces>=2+produces!=wubrg";
+fetch(Search).then(loadCards);
+
+</script>
diff --git a/www/causal.agency/play.pty b/www/causal.agency/play.pty
deleted file mode 100644
index 3da44fb7..00000000
--- a/www/causal.agency/play.pty
+++ /dev/null
@@ -1,23 +0,0 @@
-[?12l[?25h[?1h=[?25l[?1h=0

-
-                              Use the arrow keys to

-     .      .      .      .   slide and merge tiles.

-                              Press q to quit.

-                              
-   .      .      .      .   
-                            
-                            
-   .      .      2      2   
-                            
-                            
-   .      .      .      .   
-                            4          2          
-                     
-   4      .      .   
-                               2                    .          
-       
-   .   
-       
-              
-   4      2   
-              
\ No newline at end of file
diff --git a/www/causal.agency/scheme.pty b/www/causal.agency/scheme.pty
deleted file mode 100644
index 74be2196..00000000
--- a/www/causal.agency/scheme.pty
+++ /dev/null
@@ -1,10 +0,0 @@
-                                                                                

-                                                                                

-                                                                                

-                                                                                

-                                                                                

-                                                                                

-                                                                                

-                                                                                

-                                                                                

-                                                                                
diff --git a/www/causal.agency/scheme.sed b/www/causal.agency/scheme.sed
deleted file mode 100644
index bf18085b..00000000
--- a/www/causal.agency/scheme.sed
+++ /dev/null
@@ -1,6 +0,0 @@
-s/[.]bg0/html, &/
-s/[.]fg15/html, &/
-s/[.]fg12/a, &/
-s/[.]fg13/a:visited, &/
-
-s/[.]fg8 { color: \([^;]*\); }/pre { border: 1px dashed \1; } &/
diff --git a/www/causal.agency/style.css b/www/causal.agency/style.css
new file mode 100644
index 00000000..265c62c2
--- /dev/null
+++ b/www/causal.agency/style.css
@@ -0,0 +1,28 @@
+@import url("scheme.css");
+
+table.head, table.foot { width: 100%; }
+td.head-rtitle, td.foot-os { text-align: right; }
+td.head-vol { text-align: center; }
+div.Pp { margin: 1ex 0ex; }
+div.Nd, div.Bf, div.Op { display: inline; }
+span.Pa, span.Ad { font-style: italic; }
+span.Ms { font-weight: bold; }
+dl.Bl-diag > dt { font-weight: bold; }
+code.Nm, code.Fl, code.Cm, code.Ic, code.In, code.Fd, code.Fn,
+code.Cd { font-weight: bold; font-family: inherit; }
+
+div.head, div.foot { display: flex; justify-content: space-between; }
+.head-ltitle, .foot-date { flex: 1; }
+.head-vol { flex: 0 1 auto; text-align: center; }
+.head-rtitle, .foot-os { flex: 1; text-align: right; }
+
+html { font-family: monospace; line-height: 1.25em; }
+body { max-width: 80ch; margin: 1em auto; padding: 0 1ch; }
+table { border-collapse: collapse; }
+table.Nm code.Nm { padding-right: 1ch; }
+table.foot { margin-top: 1em; }
+
+html { background-color: var(--ansi16); color: var(--ansi17); }
+a { color: var(--ansi4); }
+a:visited { color: var(--ansi5); }
+a.permalink { color: var(--ansi3); text-decoration: none; }
diff --git a/www/causal.agency/torus.pty b/www/causal.agency/torus.pty
deleted file mode 100644
index 1e147970..00000000
--- a/www/causal.agency/torus.pty
+++ /dev/null
@@ -1,774 +0,0 @@
-[?1h=[?25l┌──────────────────────────────────────────────────────────────────────────────┐│ Welcome to ascii.town!          q quit  Q teleport  m mini-map  ? help       ││                                                                              ││    k       0 1 2 3 4 5 6 7    esc navigation mode     s copy                 ││  y ↑ u                          i insert mode         p paste                ││ h ←∙→ l    ) ! @ # $ % ^ &      a insert after        ~ paint color          ││  b ↓ n                          I insert direction    * paint bright         ││    j      8 bright  9 invert    R draw mode           ( paint invert         ││               ` pipette         . line mode         C-a increment            ││ \ fast                          r replace           C-x decrement            ││                                 x erase        HJKLYUBN swap cell            ││                                                                              ││ F1 @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno                          ││ F2  ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼                                          ││ F3 αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■                                           ││ F4 ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀                          ││ F5 ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»                          ││                                                                              ││                                                                              ││ This is AGPLv3 Free Software!                                                ││ Code is available from <https://code.causal.agency/june/torus>.              ││                                                                              ││                                                                              ││ Press ? to open this help again. Press any key to continue...                │└──────────────────────────────────────────────────────────────────────────────┘─[?12l[?25hPress ? for help!│   this space now frees     \ y \ CP437 ☻ ♥♦♣♠ ░▒▓█  (000,000)─────────────────┘   It's Free Real Estate     \ y \  ╒══════════════════════╕

-For a good   (0_0) | y | │ ascii.town guestbook │ 

-time, go in                   a                 | y | ╞══════════════════════╡

-any direction.     RR w         | y | │ - june         

-Pls don't publicg@conferencRRRRuRRRRR.forsale   | y | │ - scott      

-vandal. ThereRRRRRRRRRR           |   | │ - cjm        

-are huuuuuge    helo woldr  RRRRRRRR    r a     | l?| │ - erik       

-tracts of       aaaac  RRRRRR     What's up?j/| │ - swgillespie

-unused land.RRRR       poop   | a▼| │ - dikaiosune

-if u do vandal                 RR       test    | o     - danopia    

-make it funny  but maybe dont   hey  000 sdddddd|   | │ - Connor_____

-PROTIP: Press ESC to escape input modes  q,,,,,,| a   │ - tokenrove          │

-2048 clone: ssh play@ascii.town  <3     aa      | y | │ - mykey      │

-    G O O D B Y E  W I T C H E S . T Osjjj :(   | y | │ - dmrd               │ 

-vim controls, eh?.__________________. Conjor    | y | │ - hiya               │

- . . . . . . . . |   Out of space?  | Wasj whut?| y | │ - arke 

-. Welcome to. . .|Try typing 1Q, 2Q,| Herj      | y | │ - cmr

- . . . the TOWN. |3Q or 4Q to travel|   wjoft   | y | │ - Grissess (:D)      │

-  . . . . . . . .|to far-away lands |   ajoo    | y | │ - eternaleye (ipv6)  │

-  .. . . . . . . '------------------'    j test | y | │ - meena      

-  sad   hi friends  hello  cybre! ^Yes?  j ni   | y | │ - b0rk      boy __   │

- nethack    yo how do i select black??? aj sxD  | y | │ - fbernier     /  '  │

-   boi    clown townjj this is as wired 0j dasdksajklj│ - mguaypaq     |     │

-  *   hot tip: don't ruin shit    *    * j *  / yq/ * │ - rkallos      V     │
-
-
-
-
-
-
-
-
-
-
-
-
(The client tries to check if you'll     j    | y |///│ - fsj         │1

-be able to see all the colours now.)     j    | y |\\\│ - Sylvhem     └──────┐//                                         j    | y |///│ - iliana <3          │\\         ] gas pedal ┐ this is just \    j    | y |\\\│ - tjk                │//  .__    [ brakes    ┘ to toggle fast nowj    | y |///│ - duckinator   \\  |\     } curly gas pedal   :)          j  elo y |\\\│ (pup@mastodon.social)│//    \    { curly brakes                  j    | y |///│ - bug(@chitter.xyz)  │\\ Looking for something interesting?      j    | y |\\\│ - peidran    // Aside from scattered pages all over,    j    | y |///│ - KitRedgrave\\ there's some development left and up froj    | y |\\\│ - vimtingu  // here.  The bulletin is over to the rightj->  | y |///│ - thomas@touhey.org  │\\ somewhere.  And there's stuff all along j    | y |\\\│ - frewsxcv    \.fr   │// the torus if you follow it around.      j    | y |///│ - NecroTechno <3     │\\                                    \    j    | y |\\\│ - er1n       │// NEW: press m to open the mini-map  _\|       | y |///│ - quantified         │\\      and see what's nearby                   | y |\\\│   @cybre.space       │//                        yoooooo yw!           | y |///│ - nightpool (cybre)  │\\    aaa\]\\y wat           hey vanta          | y |\\\│ - ghosty//    UrFU !d               this is dope       | y |///│ - lynn (@chordbug)   │\\     RTF - chempion!       thx 4 sharing      | y |\\\│ - vantablack         │// This is actually amazing.                    | y |///│ //wxyzzyrd   \\Don't forget to grab the source:             | y |\\\│ //international <3   │//                              hi RC!         | y |///│ - maren              │\\ $ git clone \                                | y |\\\│ - rose               │//   https://code.causal.agency/june/torus.git  | y |///│   (@BLASTPROCESSlNG) │/\/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│ - grainloom   2

-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│   @cybre.space~~~~~~~~~hi~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│   @slimelia  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│ - jfo~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~jh~~~~| y |~~~│   @Phairupegiont~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│ - chr@cybre.space <3 │~~~~~~~~~~~~ i want to marry lynn ~~~~~~~~~~~~~~| y |~~~│ - elomatreb :3       │~~~~~~~~~~~~~~~~~~~same~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│ - minerobber~~~~~~~~~~~~~~~~~~~same tbh ~~~~~~~~~~~~~~~~   ~| y |~~~│   @tilde.town~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ I iiiiikhjk been ~| y |~~~│ - selfsame(~town)    │~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ moving around ~| y |~~~│ - Zhorken@awoo.space │~~~~~~~~~~ I am bad at VIM ~~~~~~ I didnt know ~| y |~~~│ - noiob@awoo.space   │~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ this is~vim~| y |~~~│ -               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~it's vim~| y |~~~│ - aeon~~~~~~~~~~vim is  bad hello lynn~~~~~~~~~ ~~~~~~| y |~~~│ - unascribed         │~~~~~~~~~~(lovely application, this)~~~~~~~~~~~~| y |~~~│ ~ nee (hidamari.blue)│~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│ ~ curiouser          │~~~~~~~~this is as much nethack               ~~| y |~~~│ - clouded  ~~~~~~~~as it is vim  ~~~~~~~~~ sry i cnt drw ~~| y |~~~│ - flacs (@f1ac5)     │~~~~~~~~~~~~~~~~~~~     ~~~~~~~               ~~| y |~~~│ - xenonnsmb (~town)  │~~~~~~~~~~~~~~~~~~~~emacs keys pls~+2~~~~~~~~~~~| y |~~~│ - Jakob              │~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| y |~~~│ - rose!              │~~~~~~~~oh no its vim~~~~~~~~~~whoops~~~~~~~~~~~| y |~~~│   (@mahoushoujorose) │~~~~~~~~help im trapped in a vim factory~~~~~~~~| y |~~~│ - jess (@dogs ~town) │~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~I messed| yq|~~~│ - rachel (@arjache)  │~~~
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^ ^^^  | y |   │ - Falkreon 3

-            Roses are red.                 ^  | y |   │ - mitosis@manhater.io│

-          Violets are blue.                ^  | y |   │ - yrgfm    

-Some people don't think                    ^  | y |   │ - felix   

-                 ascii.town be like it is.    | y |   │ - ndiesslin     

-              But it do!                   ^  | y |   │ - matth             

-                                           ^  | y |   │ - timi        

- .-.  .-. .-.  .-. .-..-. .----. .-.  .-.  ^  | y |   │ - @andwhatnot2 

- }  \/  {  \ \/ /  | ' /  } |__}  \ \  /   ^  | y |   │ - Spocky     

- | {  } |   `-\ }  | . \  } '__}   `-  }      | y |   │ - Kid Iccurus    

- `-'  `-'     `-'  `-'`-` `----'      -'      | y |   │ - tom@slime.global :3

-                                              | y |   │ -                    │ 

-                                              | y |   │  lr            

-                                              | y |   │ - fennecs (helo)

-                     this poem sd             | y |   │ - @amsomniac (mastod

-                     is factually             | y |   │    on)               

-                   incorrect, but             | y |   │ - maxj     

-                   at least it rhymes         | y |   │   AdamThePhantump was

-                       i love this place      | y |   │   here. Boo! :)      └┐

-                                              | y |   │   Tsuki "Hello guys !"│

-             now I can't sleep                | y |   │ - @dejawu_           ┌┘

-                                              | y |   │ - @eal  

-                             zzzz             | y |   │   @social.sakamoto.gq

-                                              | y |   │ - frenata            

-we are addicts. we need an intervention       | yq|   │ - banjo            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
What is this big fucking line of 'y'?        -Ethan    4

-  What is this big fucking line of 'y', you - Profpatsch  └──────┐

-  may ask yourself? It's the torus ouroboros,viv@cybre.space

-  ayying its own lmao.                        | y - dom96 ;)                             | cloin                - dbucklin i went all the way around the       - hiljusti  

-                         ros                   │ - @ercts_mxms  

-             leave some notes on the           │ -f@r4ch0

-           way for your fellow travellersr     │ ffffff               

-                                 ~chr         │ -Harper              
-     this is pretty sweet    │ -@discordalert

-           -meena                             | y |   │ - von   ShadowRZ      world wide web!            (@ShadowRZ@mastodoninternet                    .xyz

- Your journey begins now.                 |   │ - QBFreak

-                                        y |   │ - @scanlime  +Tuco <3wow this is very exciting       | y |   │   @diode.zone        │-b0rk - zer00              │        O         |   │ - kokakoda│

-  ifdfd\|/(!)  - m3tax         
-o_O|       (!!!!!)    ~~~zgebiit~~~     

- / \hey b0rk!! - gauntlet

-                           a                            - lastrik
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
                                     - CX    5

- ######################################     - tomjschwanke 

-#                                    #      - @aliasless     

- #              Mastodon              #         @awoo.wolfgirl.

- #  #    engineering

- # Giving social networks back to you #  - cosine  

- # Free, decentralized microblogging  #       - stevenleeg

-#            #- steampunc   

- #      https://joinmastodon.org      #- @blinry

-######################################   - ben@tilde.team          - Alpatron#6158
-   #################################### Calamitous  
-#             #       
-#Witches Town#   │           
-#                                  #                   
-#      Mastodon instance for       #       

-       # queer   feministanarchists #         

-       #         #                     
-#      https://witches.town        #            
-####################################       

-<<<more advertising goes over there<<<          

-   ,-._.~~~^-v^v^v**=>                     

-  /life is better on/ <3                         

-  */a.weirder.earth/*                      

-   \______________/*       love you| yq|   │          │
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    6

-  someone.. feel free to reuse this space.              └

-  it's uh... i wouldn't feel bad about                 

-  erasing whatever this is                            

-                                 

-            Tidied. The ASCII Janitor.           

-                                                         

-                                          

-      WHATS UP MY GLIB GLOBS?                   

-       W U B A L U B A D U B D U B                       *~~~~~~~~~~~~~~~~~~~~~~~*                   
-     < tilde.town <3s u      >                   
-    *~~~~~~~~~~~~~~~~~~~~~~~*         .
- < shell in today >          
-           *~~~~~~~~~~~~~~~~*        
-                       < :3 >         i want to avoid
-                       *~~~~*       confusion for new
-                 │ people though
- this thing is cool                  or make the guestbook

-too bad i   ssss u  u k k                  go AROUNDWAYS        │ 

-             s    u  u kk             to be continued...
-           ssss u  u kk │   │ we need to move the
-              s u  u k k     ├───┘ text below elsewhere └─┐           ssss uuuu k  k  at ascii art│ (Snek petting dude moved to│             -xenonnsmb, from ~town000,009.)  │ 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  7

-                                          

-                                           Shrine of the church 
-                                 empty lot             o o o o 
-          COME ON DOWN               o        oTO ASCII TOWN~~~ o     ..   o                             o   |----    o
-                         o   ||       o
-          uiwiidr                 o    ---     o  of                            o   |.       o                    o   ..       o                          o    \---    oI walked the               o     ,/    oourobouros             o   '     oand all I got was this   o o   o o   lousy t-shirt         o         
-_---.___,---_       | y |  ┌┘    GNU   Emacs └─┐/             \        │=========================│     /|  |y|  |\          │ https://gnu.org/s/emacs │|       |           │=========================│|       |     <- amazing shirt|  └┐                      ┌─┘|_______|         would i buy it?|   │ Emacs faithfuls  |   │                            |   │                 \|/  │       maybe           │ signqbelow:v   │
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      │ - [X] nee     8

- i may prefer vim, but emacs has tetris   │ - [X] byxor

-which is a stellar feature     │ - [X  @amsomniac (   

-honestly makes me like emacs  │     ]mastodon )      │                           │ - [X] tokenrove 
-l  shame it doesn't have  │ - [X] rkallos Gj  a text editor             │ - [X  nephariuz 

-      fucking heretics   SHAME!!!       │ -      evoxel   

-emacs doesn't have :smile though :)  │ - :wq!<CR>           │M         │                      │       li  │                    │ - [M-x] zge     N            │                                |   │                

-o---------o o----o        y |   │              A

-|| |    |                       │              

-|| |    |                       U|         | |    |        │                │ 

-|         | o----o      stop here  │                      │ 

-|         |         │                      │C

-|         | 000129          go down until you  │                      │ 

-|         |                reach        ok  ││ 

-|         |     100              │                      │ 

-o---------o e|   │     q                │S

- U:%*-  *Tetris*      Top (1,0)      (Tetris Projqctile[rms])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      │               9

-    +/////////////////+                   │            

-    //you@cybre.space//          │                   

-    +/////////////////+                     
-/\/\/\/\/\\\/\/\/\/\/\             │                

-   /                     /    │              

-   \ pleroma.soykaf.com  \   │                

-   /     see   the       /             │              

-   \   -   entire   -    \   I miss Karl...  │                   

-   /     fediverse /   

-   \ \            

-    \/\/\/\/\///\/\/\/\/\/   │               │          .      /---------------------\  

-                    |I'm petting the snek.|   

-           |                     |  

-           |        ^U^          |  

-                    \---------------------/  

-       [X] TODO: move this too            \     

-       [ ] TODO: write todo list            @/   

-       [X] TODO: hey, me too               /|   

-                   / \  

-       ##########################  

-       # TODO: advertise things #     |   │      

-       ##########################             | yq|   │     q                │
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-││10

-                       │└──────┐

-                      ││

-            #          ││
-   ##   #       ##    ││
-    ##   #       ##     ││
-          #             ││
-         ####    ││
-                 ##                     ││
-      #   ###   ##     │     a│
-      ## ## ## ##      │(hells         │
-       ###   ### Capouet│  guettbook     │
-lol this is awesome│    s retch│                       │      goals)│                        ││                       ││                       ││                       ││
-                                    ││
-                             │  │
-todo: write todo list    ││   ▓▓
-                          ▒▒
-                          ░░
-                           
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-   (000,011)   W 

-    E 
-         E 
- 3333333333333333 E 333333333333   3 E 333 3333   3   3 E 3333333333333333 E              E             H                   E 

-                      E           . H  E 

-   vi for the vin! E   E   E  E  E 
-                      E             E             E                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  2  iiit  llgwfth                                                       Acme is best editor :P 
- is that a plan9 reference    
- is that a Jojo's referenc  .  is that a let's encryp          
-                    d s f            s            ffd hello there            o f    l   eGenre l? d           j
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  p3  x      m        p  p  
-i want to pet a soft girl      p
-and call her by her first nameu
-god, i'm so lonely. b                         l
-You can do it i                         c
-Go out there and talk to peopleg                      @
-Even if it doesnt go anywhere, don'tc
-see it as a loss, see it as practiceo     n
-I believe in you     f     e
-You will be succesful     r     e
-You just have to try...     n              c
-UwU     e
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    .4y
-o
-u
-r
-d
-a
-                         t
-                              a
-                   .
-f
-             o
-r
-                              wheres area
-                              you   l
-                              going ethere
-                isnothing
-                     downhere
-                       i promise
-   (there is)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-      015 
- 
-or is there? 
-wow
-  
-you all just 
-bbhello 
-       |   |           
-Rewrite this in Nim for better     
-performance and easier maintenance.
-https://nim-lang.org       
-Sorry, couldn't resist :P         Rewrite it in Idris to prove itscorrectness :P  
-Remove it :P       
-dasdasdasdsa          
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-6write.
-
-jjjjjjjjjjj
-     see,What's that creepingi told you  waaaaayyy over there?-------------------->                              
-                                   
-                    
-                                                                       
-            
-q           
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-7What is this ?:wqq      there istrust me        | yi wrapped                .          
-   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-8                 

-Ancient legend tells of the treasure

-of the legendary pirate,                     

-Cap'n Jasmine Sharkbait!

-No one knows where its shiny and well shaded

-glory is hidden, and many have perished

-trying to find it.

-
-   stuff is here                     | 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-(000,019)MDG - boi

-
-                                    

-                                             

-                        

-                                            why though

-======================================D

-                  

-
-                (i legitput tape                     | on my       screen
-to do this)you are crazyyou will be seen asa visionaryhello tilde.town hereqweird flex but ok
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-     020         
-please                     stop
-this
-is
-silly

-                                       itllllllllllllll nois                  lovely
-"Root? Where we're going wet
-don't need root!"people havedied tryingdon't try :(
-   don't stop!there's nice artuwujust ahead   
-|||                     vvv 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
                                              | @ | comment space!!! <3(000,021)                                              | @

-                                              | @ |  __________________ 

-                                              > @ > |                  |   

-                                              > @ > | >>> MORE ART >>> | 

-                                              > @ > | (on (001, 021))  |      

-                 #                            > @ > |___________  _____|     

-   ############# #           ##############   | @     

-                                              | @ |       ooh what you drawing

-     /     /     /       /         /          | @ |   just a little landscape

-                                  /           | @ |  nice!! keep it up ^o^

-        /                     /               | @ |   thank you =v=

-                   /              /           | @ 

-           /                /                 | @oh wait hi rose

-                                              | @ |  this is wonderful

-                     /                        | @hi alice!!

-               #### ####                      | @ |                          

-                #######                       | @ |     art restored to its

-         /       ##|##      /                 | @ |     former glory         

-               ####|####                      | @ |  cmon, play nice yall

-                ## |  ##                      | @ |             yeah!

-||||||||||||||||||||\|||||||||||||||||||||||||| @

-#####################\########################| @ |  thanks for watching

-######################\#######################| @ |  i guess it's done now   

-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^| @q|  wonderful :)  might do morer
\ No newline at end of file
diff --git a/www/git.causal.agency/.gitignore b/www/git.causal.agency/.gitignore
index 8d20f25d..eaed8039 100644
--- a/www/git.causal.agency/.gitignore
+++ b/www/git.causal.agency/.gitignore
@@ -1,3 +1,13 @@
+*.html
 about-filter
-hi
+compress
+ctags
+email-filter
+filter
+gzip
+hilex
+htagml
+mandoc
+mtags
+owner-filter
 source-filter
diff --git a/www/git.causal.agency/Makefile b/www/git.causal.agency/Makefile
index 28e08ba5..86b9f3eb 100644
--- a/www/git.causal.agency/Makefile
+++ b/www/git.causal.agency/Makefile
@@ -1,18 +1,53 @@
-ETC = /usr/local/etc
-WWW = /usr/local/www/cgit
-LIBEXEC = /usr/local/libexec
+PREFIX = /var/www
+CONFDIR = ${PREFIX}/conf
+DATADIR = ${PREFIX}/cgit
+BINDIR = ${PREFIX}/bin
+WEBROOT = ${PREIFX}/git.causal.agency
 
-BIN = ../../bin
-BINS = about-filter source-filter hi
+CFLAGS += -Wall -Wextra
+LDFLAGS = -static -pie
 
-install: cgitrc custom.css ${BINS}
-	install -m 644 cgitrc ${ETC}
-	install -m 644 custom.css ${WWW}
-	install ${BINS} ${LIBEXEC}
+BINS += about-filter
+BINS += ctags
+BINS += email-filter
+BINS += gzip
+BINS += hilex
+BINS += htagml
+BINS += mandoc
+BINS += mtags
+BINS += owner-filter
+BINS += source-filter
+
+HTMLS = index.html
+
+all: ${BINS} ${HTMLS}
+
+compress ctags mandoc:
+	${MAKE} -C /usr/src/usr.bin/$@ LDFLAGS='${LDFLAGS}'
+	mv /usr/src/usr.bin/$@/$@ $@
+	${MAKE} -C /usr/src/usr.bin/$@ clean
+
+gzip: compress
+	ln -f compress $@
 
-hi: ${BIN}/hi.c
-	${MAKE} -C ${BIN} $@
-	cp ${BIN}/$@ $@
+hilex htagml mtags:
+	rm -f ../../bin/$@
+	${MAKE} -C ../../bin $@ LDFLAGS='${LDFLAGS}'
+	mv ../../bin/$@ $@
+
+about-filter email-filter owner-filter source-filter: filter
+	ln -f filter $@
+
+index.html: index.7
+	mandoc -Thtml -Ostyle=https://causal.agency/style.css index.7 >index.html
+
+install: cgitrc custom.css ${BINS}
+	install -m 644 cgitrc ${CONFDIR}
+	install -m 644 custom.css ${DATADIR}
+	install -d -o www -g daemon ${PREFIX}/cache/cgit
+	install -d -m 1700 -o www -g daemon ${PREFIX}/tmp
+	install -s ${BINS} ${BINDIR}
+	install -m 644 ${HTMLS} ${WEBROOT}
 
 clean:
-	rm -f ${BINS}
+	rm -f compress filter ${BINS} ${HTMLS}
diff --git a/www/git.causal.agency/about-filter.sh b/www/git.causal.agency/about-filter.sh
deleted file mode 100644
index ea68fe05..00000000
--- a/www/git.causal.agency/about-filter.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-case "$1" in
-	(*.[1-9])
-		exec /usr/bin/mandoc -T html -O fragment,man=%N.%S,includes=../tree/%I
-		;;
-	(*)
-		exec /usr/local/libexec/hi -l text -f html
-		;;
-esac
diff --git a/www/git.causal.agency/cgitrc b/www/git.causal.agency/cgitrc
index c187e1ee..0666fd28 100644
--- a/www/git.causal.agency/cgitrc
+++ b/www/git.causal.agency/cgitrc
@@ -1,5 +1,6 @@
 root-title=causal agency
-root-desc=“then I'm sorry, no offence, but you write toy programs.”
+root-desc=“I think some people from the Gentoo project are behind this.”
+logo=
 
 clone-url=https://$HTTP_HOST/$CGIT_REPO_URL
 snapshots=tar.gz zip
@@ -13,15 +14,17 @@ repository-sort=age
 branch-sort=age
 
 css=/custom.css
-email-filter=/usr/local/libexec/cgit-email
-about-filter=/usr/local/libexec/about-filter
-source-filter=/usr/local/libexec/source-filter
+about-filter=/bin/about-filter
+source-filter=/bin/source-filter
+#owner-filter=/bin/owner-filter
+email-filter=/bin/email-filter
 
 readme=:README.7
 readme=:README
 
 remove-suffix=1
 enable-git-config=1
-scan-path=/home/june/pub
+scan-path=/git.causal.agency
 
+cache-root=/cache/cgit
 cache-size=1024
diff --git a/www/git.causal.agency/custom.css b/www/git.causal.agency/custom.css
index 80892b36..b3f4f425 100644
--- a/www/git.causal.agency/custom.css
+++ b/www/git.causal.agency/custom.css
@@ -14,12 +14,12 @@ div#cgit {
 	tab-size: 4;
 }
 
-div#cgit table#header td.logo {
-	display: none;
-}
 div#cgit table#header td.sub {
 	border-top: none;
 }
+div#cgit table#header td.sub.right {
+	padding-right: 1em;
+}
 div#cgit table.tabs {
 	border-bottom: none;
 }
@@ -49,20 +49,19 @@ div#cgit div#summary {
 	max-width: 80ch;
 }
 
-/* from hi(1) */
-div#cgit .hi.Keyword { color: dimgray; }
-div#cgit .hi.Macro { color: green; }
-div#cgit .hi.Tag { color: inherit; text-decoration: underline; }
-div#cgit .hi.String { color: teal; }
-div#cgit .hi.Format { color: teal; font-weight: bold; }
-div#cgit .hi.Interp { color: olive; }
-div#cgit .hi.Comment { color: navy; }
-div#cgit .hi.Todo { color: navy; font-weight: bold; }
-div#cgit .hi.DiffOld { color: red; }
-div#cgit .hi.DiffNew { color: green; }
-div#cgit .hi.Tag:target { color: goldenrod; outline: none; }
+/* for hilex(1) */
+div#cgit pre .Ke { color: dimgray; }
+div#cgit pre .Ma { color: green; }
+div#cgit pre .Co { color: navy; }
+div#cgit pre .St { color: teal; }
+div#cgit pre .Fo { color: teal; font-weight: bold; }
+div#cgit pre .Su { color: olive; }
+
+/* for htagml(1) */
+div#cgit pre a.tag { color: inherit; text-decoration: underline; }
+div#cgit pre a.tag:target { color: goldenrod; outline: none; }
 
-/* from mandoc(1) */
+/* for mandoc(1) */
 table.head, table.foot { width: 100%; }
 td.head-rtitle, td.foot-os { text-align: right; }
 td.head-vol { text-align: center; }
@@ -74,11 +73,12 @@ dl.Bl-diag > dt { font-weight: bold; }
 code.Nm, code.Fl, code.Cm, code.Ic, code.In, code.Fd, code.Fn,
 code.Cd { font-weight: bold; font-family: inherit; }
 
+h1.Sh { font-size: 1.5em; }
 table.Nm td:first-child { padding-right: 1ch; }
 code.Fl { white-space: nowrap; }
 span.RsT { font-style: italic; }
-dl.Bl-tag:not(.Bl-compact) dt { margin-top: 1em; }
-ul.Bl-bullet:not(.Bl-compact) li { margin-top: 1em; }
+dl.Bl-tag:not(.Bl-compact) > dt { margin-top: 1em; }
+ul.Bl-bullet:not(.Bl-compact) > li { margin-top: 1em; }
 div.Bd-indent { margin-left: 4ch; }
 table.Bl-column { width: 100%; }
 table.foot { margin-top: 1em; }
diff --git a/www/git.causal.agency/filter.c b/www/git.causal.agency/filter.c
new file mode 100644
index 00000000..7c7e9320
--- /dev/null
+++ b/www/git.causal.agency/filter.c
@@ -0,0 +1,158 @@
+#include <err.h>
+#include <fcntl.h>
+#include <fnmatch.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#define Q(...) #__VA_ARGS__
+
+#define MANDOC_OPTIONS "fragment,man=%N.%S,includes=../tree/%I"
+
+static int about(int argc, char *argv[]) {
+	if (argc < 2) return 1;
+	if (!fnmatch("README.[1-9]", argv[1], 0)) {
+		execlp("mandoc", "mandoc", "-T", "html", "-O", MANDOC_OPTIONS, NULL);
+		err(127, "mandoc");
+	} else if (!fnmatch("*.[1-9]", argv[1], 0)) {
+		execlp(
+			"mandoc", "mandoc", "-T", "html", "-O", "toc," MANDOC_OPTIONS, NULL
+		);
+		err(127, "mandoc");
+	} else {
+		execlp("hilex", "hilex", "-l", "text", "-f", "html", "-o", "pre", NULL);
+		err(127, "hilex");
+	}
+}
+
+static int email(void) {
+	size_t cap = 0;
+	char *buf = NULL;
+	if (getline(&buf, &cap, stdin) < 0) err(1, "getline");
+	if (buf[0] == 'C' && !strncmp(&buf[strcspn(buf, " ")], " McEnroe", 8)) {
+		printf("June%s", &buf[strcspn(buf, " ")]);
+	} else {
+		printf("%s", buf);
+	}
+	return 0;
+}
+
+static int owner(void) {
+	printf(Q(<a href="https://liberapay.com/june/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a>));
+	return 0;
+}
+
+#define CTAGS_PATTERN "*.[chlmy]"
+#define TEMPLATE "/tmp/filter.XXXXXXXXXX"
+
+static char tmp[PATH_MAX];
+static char tags[] = TEMPLATE;
+static void cleanup(void) {
+	unlink(tmp);
+	unlink(tags);
+}
+
+static int source(int argc, char *argv[]) {
+	if (argc < 2) return 1;
+	if (
+		strcmp("Makefile", argv[1]) &&
+		strcmp(".profile", argv[1]) &&
+		strcmp(".shrc", argv[1]) &&
+		fnmatch(CTAGS_PATTERN, argv[1], 0) &&
+		fnmatch("*.mk", argv[1], 0) &&
+		fnmatch("*.[1-9]", argv[1], 0) &&
+		fnmatch("*.sh", argv[1], 0)
+	) {
+		execlp("hilex", "hilex", "-t", "-n", argv[1], "-f", "html", NULL);
+		err(127, "hilex");
+	}
+
+	const char *ext = strrchr(argv[1], '.');
+	if (!strcmp(argv[1], ".profile") || !strcmp(argv[1], ".shrc")) {
+		ext = ".sh";
+	} else if (!strcmp(argv[1], "Makefile")) {
+		ext = ".mk";
+	} else if (!ext) {
+		ext = "";
+	}
+
+	snprintf(tmp, sizeof(tmp), TEMPLATE "%s", ext);
+	int fd = mkstemps(tmp, strlen(ext));
+	if (fd < 0) err(1, "%s", tmp);
+	atexit(cleanup);
+
+	char buf[4096];
+	for (ssize_t len; 0 < (len = read(STDIN_FILENO, buf, sizeof(buf)));) {
+		if (write(fd, buf, len) < 0) err(1, "%s", tmp);
+	}
+	if (close(fd) < 0) err(1, "%s", tmp);
+
+	fd = mkstemp(tags);
+	if (fd < 0) err(1, "%s", tags);
+	close(fd);
+	pid_t pid = fork();
+	if (pid < 0) err(1, "fork");
+	if (!pid) {
+		if (!fnmatch(CTAGS_PATTERN, argv[1], 0)) {
+			execlp("ctags", "ctags", "-w", "-f", tags, tmp, NULL);
+			warn("ctags");
+		} else {
+			execlp("mtags", "mtags", "-f", tags, tmp, NULL);
+			warn("mtags");
+		}
+		_exit(127);
+	}
+	int status;
+	if (wait(&status) < 0) err(1, "wait");
+
+	int rw[2];
+	if (pipe(rw) < 0) err(1, "pipe");
+	pid = fork();
+	if (pid < 0) err(1, "fork");
+	if (!pid) {
+		dup2(rw[1], STDOUT_FILENO);
+		close(rw[0]);
+		close(rw[1]);
+		execlp("hilex", "hilex", "-f", "html", tmp, NULL);
+		warn("hilex");
+		_exit(127);
+	}
+	pid = fork();
+	if (pid < 0) err(1, "fork");
+	if (!pid) {
+		dup2(rw[0], STDIN_FILENO);
+		close(rw[0]);
+		close(rw[1]);
+		execlp("htagml", "htagml", "-im", "-f", tags, tmp, NULL);
+		warn("htagml");
+		_exit(127);
+	}
+	close(rw[0]);
+	close(rw[1]);
+
+	if (wait(&status) < 0) err(1, "wait");
+	if (wait(&status) < 0) err(1, "wait");
+	return status;
+}
+
+int main(int argc, char *argv[]) {
+#ifdef __OpenBSD__
+	int error;
+	switch (getprogname()[0]) {
+		break; case 'a': error = pledge("stdio exec", NULL);
+		break; case 's': error = pledge("stdio tmppath proc exec", NULL);
+		break; default:  error = pledge("stdio", NULL);
+	}
+	if (error) err(1, "pledge");
+#endif
+	switch (getprogname()[0]) {
+		case 'a': return about(argc, argv);
+		case 'e': return email();
+		case 'o': return owner();
+		case 's': return source(argc, argv);
+		default: return 1;
+	}
+}
diff --git a/www/git.causal.agency/index.7 b/www/git.causal.agency/index.7
new file mode 100644
index 00000000..58a40dfe
--- /dev/null
+++ b/www/git.causal.agency/index.7
@@ -0,0 +1,81 @@
+.Dd January 12, 2024
+.Dt GIT.CAUSAL.AGENCY 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm causal agency
+.Nd \(dqI think some people from the Gentoo project are behind this.\(dq
+.
+.Sh DESCRIPTION
+basically cgit (awful software)
+getting hammered by web crawlers
+keeps making my machine crash.
+this static page will be here
+until I can find a better solution.
+clone urls and tarball urls are still functional.
+.
+.Bl -tag
+.It src \(em dontfiles
+.Dl git clone https://git.causal.agency/src
+.It ascii.town
+.Bl -tag
+.It torus \(em collaborative ASCII art
+.Dl git clone https://git.causal.agency/torus
+.It play \(em some games for SSH
+.Dl git clone https://git.causal.agency/play
+.El
+.It email
+.Bl -tag
+.It imbox \(em IMAP to mbox
+.Dl git clone https://git.causal.agency/imbox
+.It bubger \(em IMAP archive generator
+.Dl git clone https://git.causal.agency/bubger
+.It notemap \(em notemap
+.Dl git clone https://git.causal.agency/notemap
+.El
+.It forks
+.Bl -tag
+.It shulker \(em Discord to vanilla Minecraft bridge
+.Dl git clone https://git.causal.agency/shulker
+.It cgit-pink \(em web frontend for git
+.Dl git clone https://git.causal.agency/cgit-pink
+.It dash \(em patched shell with cmake build
+.Dl git clone https://git.causal.agency/dash
+.El
+.It games
+.Bl -tag
+.It wep \(em Windows Entertainment Pack recreations
+.Dl git clone https://git.causal.agency/wep
+.It cards \(em CARDS.DLL loader for SDL
+.Dl git clone https://git.causal.agency/cards
+.El
+.It irc
+.Bl -tag
+.It scooper \(em web interface for litterbox
+.Dl git clone https://git.causal.agency/scooper
+.It litterbox \(em IRC logger
+.Dl git clone https://git.causal.agency/litterbox
+.It pounce \(em IRC bouncer
+.Dl git clone https://git.causal.agency/pounce
+.It catgirl \(em IRC client
+.Dl git clone https://git.causal.agency/catgirl
+.El
+.It ports
+.Bl -tag
+.It jorts \(em my own ports tree for macOS
+.Dl git clone https://git.causal.agency/jorts
+.It exman \(em manuals for other systems
+.Dl git clone https://git.causal.agency/exman
+.It libretls \(em libtls for OpenSSL
+.Dl git clone https://git.causal.agency/libretls
+.It ports \(em Fx and Ox ports for this software
+.Dl git clone https://git.causal.agency/ports
+.El
+.It system
+.Bl -tag
+.It kitd \(em process supervisor for OpenBSD
+.Dl git clone https://git.causal.agency/kitd
+.It catsit \(em (deprecated) process supervisor
+.Dl git clone https://git.causal.agency/catsit
+.El
+.El
diff --git a/www/git.causal.agency/source-filter.sh b/www/git.causal.agency/source-filter.sh
deleted file mode 100644
index 4febc2e0..00000000
--- a/www/git.causal.agency/source-filter.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-exec /usr/local/libexec/hi -t -n "$1" -f html -o anchor
diff --git a/www/photo.causal.agency/.gitignore b/www/photo.causal.agency/.gitignore
new file mode 100644
index 00000000..e6e1a830
--- /dev/null
+++ b/www/photo.causal.agency/.gitignore
@@ -0,0 +1,6 @@
+*.jpg
+*.JPG
+app.json
+posted.txt
+static/
+token.json
diff --git a/www/photo.causal.agency/0062/body b/www/photo.causal.agency/0062/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0062/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0062/date b/www/photo.causal.agency/0062/date
new file mode 100644
index 00000000..26d2ee87
--- /dev/null
+++ b/www/photo.causal.agency/0062/date
@@ -0,0 +1 @@
+April 5-6, 2025
diff --git a/www/photo.causal.agency/0062/film b/www/photo.causal.agency/0062/film
new file mode 100644
index 00000000..24c56374
--- /dev/null
+++ b/www/photo.causal.agency/0062/film
@@ -0,0 +1 @@
+Kodak UltraMax 400
diff --git a/www/photo.causal.agency/0062/lens b/www/photo.causal.agency/0062/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0062/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0063/body b/www/photo.causal.agency/0063/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0063/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0063/date b/www/photo.causal.agency/0063/date
new file mode 100644
index 00000000..c85682d5
--- /dev/null
+++ b/www/photo.causal.agency/0063/date
@@ -0,0 +1 @@
+April 6, 2025
diff --git a/www/photo.causal.agency/0063/film b/www/photo.causal.agency/0063/film
new file mode 100644
index 00000000..24c56374
--- /dev/null
+++ b/www/photo.causal.agency/0063/film
@@ -0,0 +1 @@
+Kodak UltraMax 400
diff --git a/www/photo.causal.agency/0063/lens b/www/photo.causal.agency/0063/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0063/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0064/body b/www/photo.causal.agency/0064/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0064/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0064/date b/www/photo.causal.agency/0064/date
new file mode 100644
index 00000000..f1ec6872
--- /dev/null
+++ b/www/photo.causal.agency/0064/date
@@ -0,0 +1 @@
+April 4-6, 2025
diff --git a/www/photo.causal.agency/0064/film b/www/photo.causal.agency/0064/film
new file mode 100644
index 00000000..42423702
--- /dev/null
+++ b/www/photo.causal.agency/0064/film
@@ -0,0 +1 @@
+BT21 Star 400
diff --git a/www/photo.causal.agency/0064/lens b/www/photo.causal.agency/0064/lens
new file mode 100644
index 00000000..fcf3c232
--- /dev/null
+++ b/www/photo.causal.agency/0064/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7, Yashica ML 42-75 f/3.5-4.5
diff --git a/www/photo.causal.agency/0065/body b/www/photo.causal.agency/0065/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0065/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0065/date b/www/photo.causal.agency/0065/date
new file mode 100644
index 00000000..de490c39
--- /dev/null
+++ b/www/photo.causal.agency/0065/date
@@ -0,0 +1 @@
+April 6-12, 2025
diff --git a/www/photo.causal.agency/0065/film b/www/photo.causal.agency/0065/film
new file mode 100644
index 00000000..75a90c86
--- /dev/null
+++ b/www/photo.causal.agency/0065/film
@@ -0,0 +1 @@
+Ilford FP4 Plus 125
diff --git a/www/photo.causal.agency/0065/lens b/www/photo.causal.agency/0065/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0065/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0066/body b/www/photo.causal.agency/0066/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0066/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0066/date b/www/photo.causal.agency/0066/date
new file mode 100644
index 00000000..803a4b62
--- /dev/null
+++ b/www/photo.causal.agency/0066/date
@@ -0,0 +1 @@
+April 12, 2025
diff --git a/www/photo.causal.agency/0066/film b/www/photo.causal.agency/0066/film
new file mode 100644
index 00000000..f07cfc3e
--- /dev/null
+++ b/www/photo.causal.agency/0066/film
@@ -0,0 +1 @@
+Lomography CN 400
diff --git a/www/photo.causal.agency/0066/lens b/www/photo.causal.agency/0066/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/0066/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/0067/body b/www/photo.causal.agency/0067/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0067/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0067/date b/www/photo.causal.agency/0067/date
new file mode 100644
index 00000000..bbfc292a
--- /dev/null
+++ b/www/photo.causal.agency/0067/date
@@ -0,0 +1 @@
+April 12-13, 2025
diff --git a/www/photo.causal.agency/0067/film b/www/photo.causal.agency/0067/film
new file mode 100644
index 00000000..1a1b1714
--- /dev/null
+++ b/www/photo.causal.agency/0067/film
@@ -0,0 +1 @@
+Astrum Foto 200
diff --git a/www/photo.causal.agency/0067/lens b/www/photo.causal.agency/0067/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0067/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0068/body b/www/photo.causal.agency/0068/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0068/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0068/date b/www/photo.causal.agency/0068/date
new file mode 100644
index 00000000..c460408f
--- /dev/null
+++ b/www/photo.causal.agency/0068/date
@@ -0,0 +1 @@
+April 13-17, 2025
diff --git a/www/photo.causal.agency/0068/film b/www/photo.causal.agency/0068/film
new file mode 100644
index 00000000..6227f2a9
--- /dev/null
+++ b/www/photo.causal.agency/0068/film
@@ -0,0 +1 @@
+Wolfen UN 54
diff --git a/www/photo.causal.agency/0068/lens b/www/photo.causal.agency/0068/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0068/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0069/body b/www/photo.causal.agency/0069/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0069/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0069/date b/www/photo.causal.agency/0069/date
new file mode 100644
index 00000000..939dfe29
--- /dev/null
+++ b/www/photo.causal.agency/0069/date
@@ -0,0 +1 @@
+April 17, 2025
diff --git a/www/photo.causal.agency/0069/film b/www/photo.causal.agency/0069/film
new file mode 100644
index 00000000..cb06f7ff
--- /dev/null
+++ b/www/photo.causal.agency/0069/film
@@ -0,0 +1 @@
+Konica VX 400 Super (exp. 2008)
diff --git a/www/photo.causal.agency/0069/lens b/www/photo.causal.agency/0069/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0069/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0070/body b/www/photo.causal.agency/0070/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0070/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0070/date b/www/photo.causal.agency/0070/date
new file mode 100644
index 00000000..d0bfb87b
--- /dev/null
+++ b/www/photo.causal.agency/0070/date
@@ -0,0 +1 @@
+April 18, 2025
diff --git a/www/photo.causal.agency/0070/film b/www/photo.causal.agency/0070/film
new file mode 100644
index 00000000..24e393c6
--- /dev/null
+++ b/www/photo.causal.agency/0070/film
@@ -0,0 +1 @@
+JCH Streetpan 400
diff --git a/www/photo.causal.agency/0070/lens b/www/photo.causal.agency/0070/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/0070/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/0071/body b/www/photo.causal.agency/0071/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0071/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0071/date b/www/photo.causal.agency/0071/date
new file mode 100644
index 00000000..8eaecd35
--- /dev/null
+++ b/www/photo.causal.agency/0071/date
@@ -0,0 +1 @@
+April 18-20, 2025
diff --git a/www/photo.causal.agency/0071/film b/www/photo.causal.agency/0071/film
new file mode 100644
index 00000000..d41d547a
--- /dev/null
+++ b/www/photo.causal.agency/0071/film
@@ -0,0 +1 @@
+Rollei Reinhold 640
diff --git a/www/photo.causal.agency/0071/lens b/www/photo.causal.agency/0071/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/0071/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/0072/body b/www/photo.causal.agency/0072/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0072/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0072/date b/www/photo.causal.agency/0072/date
new file mode 100644
index 00000000..8eaecd35
--- /dev/null
+++ b/www/photo.causal.agency/0072/date
@@ -0,0 +1 @@
+April 18-20, 2025
diff --git a/www/photo.causal.agency/0072/film b/www/photo.causal.agency/0072/film
new file mode 100644
index 00000000..24c56374
--- /dev/null
+++ b/www/photo.causal.agency/0072/film
@@ -0,0 +1 @@
+Kodak UltraMax 400
diff --git a/www/photo.causal.agency/0072/lens b/www/photo.causal.agency/0072/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0072/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0073/body b/www/photo.causal.agency/0073/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0073/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0073/date b/www/photo.causal.agency/0073/date
new file mode 100644
index 00000000..668a1ac5
--- /dev/null
+++ b/www/photo.causal.agency/0073/date
@@ -0,0 +1 @@
+April 20, 2025
diff --git a/www/photo.causal.agency/0073/film b/www/photo.causal.agency/0073/film
new file mode 100644
index 00000000..6968664d
--- /dev/null
+++ b/www/photo.causal.agency/0073/film
@@ -0,0 +1 @@
+Ilford Ortho Plus 80
diff --git a/www/photo.causal.agency/0073/lens b/www/photo.causal.agency/0073/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/0073/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/0074/body b/www/photo.causal.agency/0074/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0074/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0074/date b/www/photo.causal.agency/0074/date
new file mode 100644
index 00000000..0aec6293
--- /dev/null
+++ b/www/photo.causal.agency/0074/date
@@ -0,0 +1 @@
+April 20-27, 2025
diff --git a/www/photo.causal.agency/0074/film b/www/photo.causal.agency/0074/film
new file mode 100644
index 00000000..326aaee3
--- /dev/null
+++ b/www/photo.causal.agency/0074/film
@@ -0,0 +1 @@
+Wolfen NP100
diff --git a/www/photo.causal.agency/0074/lens b/www/photo.causal.agency/0074/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/0074/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/0075/body b/www/photo.causal.agency/0075/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0075/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0075/date b/www/photo.causal.agency/0075/date
new file mode 100644
index 00000000..0aec6293
--- /dev/null
+++ b/www/photo.causal.agency/0075/date
@@ -0,0 +1 @@
+April 20-27, 2025
diff --git a/www/photo.causal.agency/0075/film b/www/photo.causal.agency/0075/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/0075/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/0075/lens b/www/photo.causal.agency/0075/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0075/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0076/body b/www/photo.causal.agency/0076/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0076/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0076/date b/www/photo.causal.agency/0076/date
new file mode 100644
index 00000000..3a8a41d3
--- /dev/null
+++ b/www/photo.causal.agency/0076/date
@@ -0,0 +1 @@
+April 27, 2025
diff --git a/www/photo.causal.agency/0076/film b/www/photo.causal.agency/0076/film
new file mode 100644
index 00000000..cb06f7ff
--- /dev/null
+++ b/www/photo.causal.agency/0076/film
@@ -0,0 +1 @@
+Konica VX 400 Super (exp. 2008)
diff --git a/www/photo.causal.agency/0076/lens b/www/photo.causal.agency/0076/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0076/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0077/body b/www/photo.causal.agency/0077/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0077/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0077/date b/www/photo.causal.agency/0077/date
new file mode 100644
index 00000000..a35d7362
--- /dev/null
+++ b/www/photo.causal.agency/0077/date
@@ -0,0 +1 @@
+April 27 – May 4, 2025
diff --git a/www/photo.causal.agency/0077/film b/www/photo.causal.agency/0077/film
new file mode 100644
index 00000000..ffcc1ab6
--- /dev/null
+++ b/www/photo.causal.agency/0077/film
@@ -0,0 +1 @@
+Flic Film Aurora 400
diff --git a/www/photo.causal.agency/0077/lens b/www/photo.causal.agency/0077/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0077/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0078/body b/www/photo.causal.agency/0078/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0078/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0078/date b/www/photo.causal.agency/0078/date
new file mode 100644
index 00000000..7e2a323a
--- /dev/null
+++ b/www/photo.causal.agency/0078/date
@@ -0,0 +1 @@
+April 27 – May 3, 2025
diff --git a/www/photo.causal.agency/0078/film b/www/photo.causal.agency/0078/film
new file mode 100644
index 00000000..6a2f64b6
--- /dev/null
+++ b/www/photo.causal.agency/0078/film
@@ -0,0 +1 @@
+AristaEDU Ultra 200
diff --git a/www/photo.causal.agency/0078/lens b/www/photo.causal.agency/0078/lens
new file mode 100644
index 00000000..ad833bed
--- /dev/null
+++ b/www/photo.causal.agency/0078/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7, Yashica ML Macro 55mm f/2.8
diff --git a/www/photo.causal.agency/0079/body b/www/photo.causal.agency/0079/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/0079/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/0079/date b/www/photo.causal.agency/0079/date
new file mode 100644
index 00000000..d44c408e
--- /dev/null
+++ b/www/photo.causal.agency/0079/date
@@ -0,0 +1 @@
+May 3, 2025
diff --git a/www/photo.causal.agency/0079/film b/www/photo.causal.agency/0079/film
new file mode 100644
index 00000000..7438f38e
--- /dev/null
+++ b/www/photo.causal.agency/0079/film
@@ -0,0 +1 @@
+Lucky SHD 400
diff --git a/www/photo.causal.agency/0079/lens b/www/photo.causal.agency/0079/lens
new file mode 100644
index 00000000..197595bc
--- /dev/null
+++ b/www/photo.causal.agency/0079/lens
@@ -0,0 +1 @@
+Yashica ML Macro 55mm f/2.8
diff --git a/www/photo.causal.agency/0080/body b/www/photo.causal.agency/0080/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/0080/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/0080/date b/www/photo.causal.agency/0080/date
new file mode 100644
index 00000000..17eb8868
--- /dev/null
+++ b/www/photo.causal.agency/0080/date
@@ -0,0 +1 @@
+May 4-14, 2025
diff --git a/www/photo.causal.agency/0080/film b/www/photo.causal.agency/0080/film
new file mode 100644
index 00000000..a87ca638
--- /dev/null
+++ b/www/photo.causal.agency/0080/film
@@ -0,0 +1 @@
+Konica 400 VX Super (exp. 2005)
diff --git a/www/photo.causal.agency/0080/lens b/www/photo.causal.agency/0080/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/0080/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/0080/note b/www/photo.causal.agency/0080/note
new file mode 100644
index 00000000..72945eda
--- /dev/null
+++ b/www/photo.causal.agency/0080/note
@@ -0,0 +1,3 @@
+first roll I didn't even have the lab scan as a backup!
+shot at EI 100 and clearly overexposed.
+is the one-stop-per-decade rule even real?
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0832.txt b/www/photo.causal.agency/2024-04-10/IMG_0832.txt
new file mode 100644
index 00000000..65724024
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0832.txt
@@ -0,0 +1,6 @@
+a red brick wall with some faded black graffiti.
+in the lower third, some bricks are missing
+from the outer layer in an arc shape.
+along the bottom is a ledge of conrete
+lightly covered in brick dust and chunks
+below the missing areas above.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0850.txt b/www/photo.causal.agency/2024-04-10/IMG_0850.txt
new file mode 100644
index 00000000..4cbb3def
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0850.txt
@@ -0,0 +1,6 @@
+grey steel beams of a building in early construction
+on a background of blue sky with some light clouds.
+the beams are intersecting at odd points,
+implying the final building will not be a simple box.
+the sun casts dark shadows into the interiors
+of the I-shaped metal.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0852.txt b/www/photo.causal.agency/2024-04-10/IMG_0852.txt
new file mode 100644
index 00000000..707d7cd6
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0852.txt
@@ -0,0 +1,4 @@
+in the foreground, a metal construction fence.
+behind that, the bright red arm of a sort of small crane.
+the arm is horizontal and crushing a perpendicular piece of fence,
+which has deformed smoothly under it.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0858.txt b/www/photo.causal.agency/2024-04-10/IMG_0858.txt
new file mode 100644
index 00000000..42f243e4
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0858.txt
@@ -0,0 +1,6 @@
+an uneven grid of old wooden-framed windows in an alley.
+the red paint on the frames is peeling badly,
+completely stripped in some spots.
+in the reflections of the lower windows
+we see the roofs of the opposite buildings
+and hints of clouds in the sky.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0859.txt b/www/photo.causal.agency/2024-04-10/IMG_0859.txt
new file mode 100644
index 00000000..ca33d7e0
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0859.txt
@@ -0,0 +1,6 @@
+an old backetball hoop mounted in an alley.
+the backboard has been graffitied
+and vines have invaded.
+a few red strands of net are left hanging from the hoop.
+the fence behind is painted with a design of yellow, purple, white and blue.
+it's the kind of hoop airbud might be hanging around.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0865.txt b/www/photo.causal.agency/2024-04-10/IMG_0865.txt
new file mode 100644
index 00000000..7a955fc2
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0865.txt
@@ -0,0 +1,2 @@
+deep tire tread pressed into mud in the center of an alley.
+a small branch of evergreen lies to one side.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0890.txt b/www/photo.causal.agency/2024-04-10/IMG_0890.txt
new file mode 100644
index 00000000..9d2cdc43
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0890.txt
@@ -0,0 +1,9 @@
+a pipe coming out of a light brown brick wall.
+the pipe comes out of a metal square in the centre of the wall,
+travels up and left for a bit,
+before continuing straight up out of frame.
+opposite, in the bottom right,
+is the top of a red metal grate in front
+of a ground-level window.
+the brick below where the pipe enters the wall
+is stained dark.
diff --git a/www/photo.causal.agency/2024-04-14/IMG_1054.txt b/www/photo.causal.agency/2024-04-14/IMG_1054.txt
new file mode 100644
index 00000000..f4803ee2
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-14/IMG_1054.txt
@@ -0,0 +1,5 @@
+a short wall of natural rock,
+all broken up somewhat neatly
+along horizontal and vertical lines.
+most of the rock is cool grey,
+while some parts are warm brown.
diff --git a/www/photo.causal.agency/2024-04-14/IMG_1058.txt b/www/photo.causal.agency/2024-04-14/IMG_1058.txt
new file mode 100644
index 00000000..21aeb189
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-14/IMG_1058.txt
@@ -0,0 +1,6 @@
+moss on a bit of exposed natural rock
+surrounded by mostly brown grass.
+there is shorter, darker green and brown moss,
+as well as longer lighter green moss.
+some small pieces of the rock are broken off
+and lay in little piles.
diff --git a/www/photo.causal.agency/2024-04-14/IMG_1066.txt b/www/photo.causal.agency/2024-04-14/IMG_1066.txt
new file mode 100644
index 00000000..81747287
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-14/IMG_1066.txt
@@ -0,0 +1,10 @@
+two green buds on the end of a thin branch
+on a blurry brown backdrop.
+the branch enters the frame
+from the bottom left corner,
+and there are three other pairs of buds
+along it,
+out of focus.
+there is a hint of another bebudded branch
+in the background,
+but there is otherwise very little green.
diff --git a/www/photo.causal.agency/2024-04-19/IMG_1158.txt b/www/photo.causal.agency/2024-04-19/IMG_1158.txt
new file mode 100644
index 00000000..e18bd6c7
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-19/IMG_1158.txt
@@ -0,0 +1,6 @@
+a glowing amber street lamp
+affixed to a telephone pole.
+across its round top
+there is peeling grey-brown paint.
+the lamp is surrounded
+by out of focus bare tree branches.
diff --git a/www/photo.causal.agency/2024-04-20/IMG_1225.txt b/www/photo.causal.agency/2024-04-20/IMG_1225.txt
new file mode 100644
index 00000000..525a4bf3
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-20/IMG_1225.txt
@@ -0,0 +1,8 @@
+close up of a squirrel atop a dark wood fence.
+its tail is curled on its back
+and it's facing left but looking at the camera.
+there are crumbs of dirt
+around its mouth and whiskers.
+you can see the little claws
+of its front paw in the foreground,
+while the other paw is curled to its chest.
diff --git a/www/photo.causal.agency/2024-04-20/IMG_1234.txt b/www/photo.causal.agency/2024-04-20/IMG_1234.txt
new file mode 100644
index 00000000..faee1be9
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-20/IMG_1234.txt
@@ -0,0 +1,8 @@
+a pigeon standing upright on some concrete.
+it's a usual grey city pigeon,
+with a mix of light and dark feathers
+on its wings,
+purple and green areas up its neck,
+and red feet.
+in the blurred background
+another pigeon is strutting past.
diff --git a/www/photo.causal.agency/2024-04-20/IMG_1245.txt b/www/photo.causal.agency/2024-04-20/IMG_1245.txt
new file mode 100644
index 00000000..c971da91
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-20/IMG_1245.txt
@@ -0,0 +1,17 @@
+a tall shot of the back of a beautifully coloured building.
+the brick wall has been painted a sort of pink,
+or at least it's faded to that colour.
+there is a splotch in the middle
+where the paint has worn off the brick,
+along with some stray bricks
+elsewhere that have been replaced.
+the spiral stairs descending
+from the back balconies of two floors
+have also been painted red,
+but have faded to pink
+closer to the top.
+everything is a little crooked.
+the old wooden-framed windows
+on the left,
+the more recently replaced doors,
+and the balconies.
diff --git a/www/photo.causal.agency/2024-04-20/IMG_1253.txt b/www/photo.causal.agency/2024-04-20/IMG_1253.txt
new file mode 100644
index 00000000..5158c533
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-20/IMG_1253.txt
@@ -0,0 +1,7 @@
+a CCTV camera on the corner
+of a black corrugated metal building.
+it's mounted on a beige rusting bracket
+coming off the wall at a right angle.
+it's an old-style boxy camera
+with a little hood.
+who knows if it's still connected to anything?
diff --git a/www/photo.causal.agency/2024-04-20/IMG_1254.txt b/www/photo.causal.agency/2024-04-20/IMG_1254.txt
new file mode 100644
index 00000000..4780f8b5
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-20/IMG_1254.txt
@@ -0,0 +1,8 @@
+a white pigeon walking in a paved alley.
+its visible eye is a beautiful dark orange,
+slightly lighter around its pupil.
+its mostly white plumage
+is dotted here and there by darker feathers,
+and its tail feathers in particular are dark.
+there's a hint of small green feathers
+around its neck.
diff --git a/www/photo.causal.agency/2024-04-30/IMG_1619.txt b/www/photo.causal.agency/2024-04-30/IMG_1619.txt
new file mode 100644
index 00000000..27f87311
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-30/IMG_1619.txt
@@ -0,0 +1,8 @@
+the seat of a rusted metal stool out in the way
+with a shallow pool of water on it.
+in the center is a handle-shaped hole,
+which is raised slightly,
+causing the water to pool further
+around the edges.
+there is a single fallen light green tree bud
+just near the hole.
diff --git a/www/photo.causal.agency/2024-05-03/IMG_1684.txt b/www/photo.causal.agency/2024-05-03/IMG_1684.txt
new file mode 100644
index 00000000..08624d6e
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-03/IMG_1684.txt
@@ -0,0 +1,7 @@
+a yellow-and-red flower.
+I don't know types of flowers.
+the petals are yellow and red,
+the colours flecked in each other
+like you would see on an apple.
+the tops of the petals have
+toothy looking bits.
diff --git a/www/photo.causal.agency/2024-05-03/IMG_1692.txt b/www/photo.causal.agency/2024-05-03/IMG_1692.txt
new file mode 100644
index 00000000..182319f2
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-03/IMG_1692.txt
@@ -0,0 +1,4 @@
+a pair of discarded shoes
+on the ground next to a black trash bag.
+the shoes are chunky running shoes,
+white at the front and baby blue at the back.
diff --git a/www/photo.causal.agency/2024-05-03/IMG_1706.txt b/www/photo.causal.agency/2024-05-03/IMG_1706.txt
new file mode 100644
index 00000000..d325d518
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-03/IMG_1706.txt
@@ -0,0 +1,4 @@
+a square window
+in the centre of a concrete wall
+covered in vines
+that haven't started growing leaves again yet.
diff --git a/www/photo.causal.agency/2024-05-03/IMG_1724.txt b/www/photo.causal.agency/2024-05-03/IMG_1724.txt
new file mode 100644
index 00000000..2dd5bb3d
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-03/IMG_1724.txt
@@ -0,0 +1,3 @@
+a telephone pole
+against a blue sky with some light clouds,
+cables coming off it in each diagonal.
diff --git a/www/photo.causal.agency/2024-05-03/IMG_1730.txt b/www/photo.causal.agency/2024-05-03/IMG_1730.txt
new file mode 100644
index 00000000..ca51034b
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-03/IMG_1730.txt
@@ -0,0 +1,9 @@
+a selfie taken in
+a particularly reflective window on the street,
+giving everything a slightly offset doubled look
+from the layers of glass.
+I'm wearing a red and purple floral patterned dress
+and a green jacket.
+I have red hair
+and I'm holding a canon DSLR
+up to my face.
diff --git a/www/photo.causal.agency/2024-05-03/IMG_1748.txt b/www/photo.causal.agency/2024-05-03/IMG_1748.txt
new file mode 100644
index 00000000..29bc3a76
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-03/IMG_1748.txt
@@ -0,0 +1,4 @@
+some kind of short tree
+spilling over tthe top of an alley wooden fence.
+its branches have thorns
+and are just started to grow leaves.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_1951.txt b/www/photo.causal.agency/2024-05-06/IMG_1951.txt
new file mode 100644
index 00000000..78fe46a7
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_1951.txt
@@ -0,0 +1,12 @@
+the top cube of a brutalist house,
+with one small window
+in each the centre of each face.
+the left face of the cube
+has an overhang above
+which continues down the side.
+the concrete has large curved grooves
+scattered over its surface.
+the sun is hitting the left face,
+shadowed by the overhang.
+behind the cube is a blue sky
+with scattered clouds.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_1969.txt b/www/photo.causal.agency/2024-05-06/IMG_1969.txt
new file mode 100644
index 00000000..6276a710
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_1969.txt
@@ -0,0 +1,7 @@
+some kind of black bird
+in the grass
+holding a grub of some kind
+in its beak.
+it has purple and green
+in its feathers similar to a pigeon,
+with some white streaks on its wings.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_1973.txt b/www/photo.causal.agency/2024-05-06/IMG_1973.txt
new file mode 100644
index 00000000..b23e190b
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_1973.txt
@@ -0,0 +1,3 @@
+a black bird standing in the grass
+with something small in its beak.
+its black feathers are spotted with white.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_1996.txt b/www/photo.causal.agency/2024-05-06/IMG_1996.txt
new file mode 100644
index 00000000..ddbc0a2b
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_1996.txt
@@ -0,0 +1,4 @@
+a standard issue city pigeon
+viewed from the side,
+standing atop a wooden fence
+with a blurred brick wall behind it.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_1998.txt b/www/photo.causal.agency/2024-05-06/IMG_1998.txt
new file mode 100644
index 00000000..42cf62cc
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_1998.txt
@@ -0,0 +1,3 @@
+a standard issue city pigeon
+standing on the corner of a balcony
+with the railing behind it.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_2009.txt b/www/photo.causal.agency/2024-05-06/IMG_2009.txt
new file mode 100644
index 00000000..60518f52
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_2009.txt
@@ -0,0 +1,4 @@
+a squirrel on the trunk of a tree,
+its body facing down
+and its head lifted towards the camera.
+ones of its paws is stretched out to the side.
diff --git a/www/photo.causal.agency/2024-05-06/IMG_2015.txt b/www/photo.causal.agency/2024-05-06/IMG_2015.txt
new file mode 100644
index 00000000..48494b77
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-06/IMG_2015.txt
@@ -0,0 +1,4 @@
+a standard issue city pigeon
+on a telephone cable
+in front of a brick wall,
+looking directly at the camera.
diff --git a/www/photo.causal.agency/2024-05-31/IMG_2078.txt b/www/photo.causal.agency/2024-05-31/IMG_2078.txt
new file mode 100644
index 00000000..5a08757c
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-31/IMG_2078.txt
@@ -0,0 +1,5 @@
+the side of a school building at sunset.
+the sun is hitting the top corner.
+on the left is the brick wall,
+in the centre there are two floors of windows,
+and on the right there are green trees.
diff --git a/www/photo.causal.agency/2024-05-31/IMG_2079.txt b/www/photo.causal.agency/2024-05-31/IMG_2079.txt
new file mode 100644
index 00000000..d88645c5
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-31/IMG_2079.txt
@@ -0,0 +1,7 @@
+the top of a theatre building at sunset.
+the top has a row of frosted glass windows
+with an unfrosted silhouette
+of a man sitting on a ladder.
+below the windows there's a white
+swirly teardrop pattern,
+which continues down into the shadow of the setting sun.
diff --git a/www/photo.causal.agency/2024-05-31/IMG_2084.txt b/www/photo.causal.agency/2024-05-31/IMG_2084.txt
new file mode 100644
index 00000000..b8ed4fc5
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-31/IMG_2084.txt
@@ -0,0 +1,4 @@
+a building of many intersecting shapes
+at sunset.
+brick, glass and concrete.
+only the top of the building is in direct sunlight.
diff --git a/www/photo.causal.agency/2024-05-31/IMG_2103.txt b/www/photo.causal.agency/2024-05-31/IMG_2103.txt
new file mode 100644
index 00000000..26b1e1cd
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-31/IMG_2103.txt
@@ -0,0 +1,8 @@
+a high-rise apartment building at sunset.
+the sun is hitting its left red brick side,
+which is broken up by white stripes
+between each floor.
+the front of the building
+has windows and balconies.
+some of the balconies near the top
+have people out on them.
diff --git a/www/photo.causal.agency/2024-05-31/IMG_2114.txt b/www/photo.causal.agency/2024-05-31/IMG_2114.txt
new file mode 100644
index 00000000..7702a374
--- /dev/null
+++ b/www/photo.causal.agency/2024-05-31/IMG_2114.txt
@@ -0,0 +1,6 @@
+a high-rise apartment building
+during or maybe just after sunset.
+in the light it appears beige.
+there is a row of balconies
+going up the side of the building,
+off-centre.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt
new file mode 100644
index 00000000..7affb93a
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt
@@ -0,0 +1,9 @@
+a view down an alley
+with the backs of buildings on the left
+and greenery on the right and above.
+right at the end of the alley
+some people are walking past.
+the top of the frame is over-exposed.
+the lens is focused at infinity
+down the length of the alley,
+which gives an interesting effect.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt
new file mode 100644
index 00000000..4628a2c2
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt
@@ -0,0 +1,6 @@
+a little wooden house(?) hanging from a tree.
+it's something you'd expect to have a lantern inside,
+I think.
+3 by 3 paned sides and a little overhanging roof.
+behind it is a wooden fence
+lightly covered in leaves.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt
new file mode 100644
index 00000000..aabe2b40
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt
@@ -0,0 +1,9 @@
+an old friend:
+the pipe coming out of a square patch
+in a yellow brick wall
+that I've photographed before on digital.
+the pipe comes out at an angle
+towards the top left
+then straightens out towards the top of the frame.
+in the bottom right
+there's the top of a window grate.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt
new file mode 100644
index 00000000..57fb909b
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt
@@ -0,0 +1,6 @@
+some pretty red-pink flowers
+on a tree in an alley
+growing over a wooden fence.
+one branch is in focus in the foreground,
+the rest are pleasantly blurred
+with a little bit of swirl.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt
new file mode 100644
index 00000000..a5bb9fa0
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt
@@ -0,0 +1,5 @@
+a concrete step out a back door into an alley.
+the top and near side of the step
+are covered in some kind of green.
+I don't know if that's a moss
+or something else.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt
new file mode 100644
index 00000000..5da2a186
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt
@@ -0,0 +1,12 @@
+the side of a weird old
+presumably european
+tiny car that's been rotting
+in an alley for who knows how long.
+the car is painted black
+and there's a bunch of graffiti in white
+on the door and back side
+as well as the window.
+on the door next to the handle
+there's a stenciled "GREMA".
+behind the car is a wooden fence
+with some deep green vines.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt
new file mode 100644
index 00000000..d82ec10e
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt
@@ -0,0 +1,5 @@
+a view down an alley
+with wooden fences along both sides
+and lots of greenery spilling over them,
+out of their bases,
+and hanging from above.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt
new file mode 100644
index 00000000..e891695b
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt
@@ -0,0 +1,2 @@
+some puffy pink flowers hanging from a tree
+amid wooden fences covered in vines.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt
new file mode 100644
index 00000000..dd732a64
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt
@@ -0,0 +1,5 @@
+an old friend:
+a boxy security camera
+mounted on the corner of
+a black corrugated metal wall.
+lots of green trees behind it.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt
new file mode 100644
index 00000000..f8be350d
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt
@@ -0,0 +1,7 @@
+a familiar sight:
+the back of a brick building
+painted in red
+and fading unevenly to pink.
+a spiral staircase descends
+past three doors on the right,
+and there are three windows on the left.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt
new file mode 100644
index 00000000..3614056a
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt
@@ -0,0 +1,7 @@
+another familiar sight:
+an old basketball hoop
+mounted against a wooden fence
+in an alley,
+vines growing over the backboard
+and scraps of netting
+hanging from the rim.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt
new file mode 100644
index 00000000..24678e0f
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt
@@ -0,0 +1,7 @@
+an askew lantern hanging
+next to a telephone pole.
+it's hanging by its hat,
+but its body is crooked.
+there's some rope hanging next to it,
+and there's some christmas lights
+looped around the telephone pole.
diff --git a/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt
new file mode 100644
index 00000000..b9fbf500
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt
@@ -0,0 +1,12 @@
+a selfie in a convex mirror
+mounted on a telephone pole.
+I appear quite small in the mirror.
+I'm standing in front
+of a building with
+colourful graffiti on it.
+behind the mirror
+is a yellow diamond road sign,
+and on the side of the pole
+is a no trash sign
+with a fine of up to $1000.
+behind is a blue cloudy sky.
diff --git a/www/photo.causal.agency/2024-06-08/film b/www/photo.causal.agency/2024-06-08/film
new file mode 100644
index 00000000..0555f564
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/film
@@ -0,0 +1 @@
+Fujifilm 400
diff --git a/www/photo.causal.agency/2024-06-08/lens b/www/photo.causal.agency/2024-06-08/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-08/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt
new file mode 100644
index 00000000..a233035e
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt
@@ -0,0 +1,14 @@
+the bottom of a spiral fire escape
+black metal stair.
+there's a piece of stone or concrete
+at the bottom
+with green moss growing on its edges.
+the surrounding ground
+is covered in dead leaves and such.
+there's a peculiar orange-ish
+mark that runs down
+the middle right side of the frame
+and wanders back and forth a little.
+don't know what's up with that
+and this is the only shot
+on the roll with it.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt
new file mode 100644
index 00000000..db048266
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt
@@ -0,0 +1,6 @@
+a short, wide factory-looking window
+in a dark brick wall behind a fence.
+many of the panes of glass are broken.
+honestly I'm posting this photo
+because I want to take it again
+on black & white film.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt
new file mode 100644
index 00000000..c6e673d9
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt
@@ -0,0 +1,5 @@
+a painted red metal fire escape spiral staircase
+climbing up the side of a narrow brick building.
+it goes all the way to the roof,
+where it becomes over-exposed
+and starts to blend into the sky behind it.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt
new file mode 100644
index 00000000..fa47b704
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt
@@ -0,0 +1,7 @@
+a telephone pole covered in paintball paint
+(I assume)
+in front of a brick wall.
+towards the bottom
+there are more red spots
+and towards the top
+there are more blue.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt
new file mode 100644
index 00000000..c71a81ac
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt
@@ -0,0 +1,8 @@
+pink flowers
+on a tree with green leaves
+against a bright blue sky.
+the contrast in colours
+between the pink, green and blue
+really pops.
+this is my favourite shot
+on the roll.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt
new file mode 100644
index 00000000..5d2096fa
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt
@@ -0,0 +1,3 @@
+a green metal staircase
+viewed as if about to climb it,
+hugging the back of a brick building.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt
new file mode 100644
index 00000000..56d6d814
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt
@@ -0,0 +1,7 @@
+a pink flower
+with a yellow centre
+and a couple of its friends
+on a pleasantly blurred
+background of the green bush
+its growing from
+and a bit of a brick wall.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt
new file mode 100644
index 00000000..a3cb3fcf
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt
@@ -0,0 +1,4 @@
+a plump light pink flower
+with really dense petal arrangement
+on a blurred background
+of dark green leaves.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt
new file mode 100644
index 00000000..7c94196c
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt
@@ -0,0 +1,4 @@
+a pile of old bricks in the sunlight.
+some of the faces of the bricks are painted grey-blue.
+this is another one I'd love to take again
+on black & white film.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt
new file mode 100644
index 00000000..c4383804
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt
@@ -0,0 +1,4 @@
+a wooden fence
+with vines growing across it
+and two steps fixed to the side of it.
+for cats to jump up, I suppose.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt
new file mode 100644
index 00000000..12b5fc48
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt
@@ -0,0 +1,4 @@
+an overgrown back yard
+with a metal staircase
+descending into it,
+viewed from under a tree.
diff --git a/www/photo.causal.agency/2024-06-12/film b/www/photo.causal.agency/2024-06-12/film
new file mode 100644
index 00000000..0555f564
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/film
@@ -0,0 +1 @@
+Fujifilm 400
diff --git a/www/photo.causal.agency/2024-06-12/lens b/www/photo.causal.agency/2024-06-12/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-12/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-06-22/000093910004.txt b/www/photo.causal.agency/2024-06-22/000093910004.txt
new file mode 100644
index 00000000..d5678989
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910004.txt
@@ -0,0 +1,5 @@
+the trunk of a large tree,
+with two hefty branches
+splitting off.
+the bark is in vertical lines
+with deep texture.
diff --git a/www/photo.causal.agency/2024-06-22/000093910008.txt b/www/photo.causal.agency/2024-06-22/000093910008.txt
new file mode 100644
index 00000000..33e1f56d
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910008.txt
@@ -0,0 +1,3 @@
+a piece of stone on the ground
+with moss growing in a little
+indent in its side.
diff --git a/www/photo.causal.agency/2024-06-22/000093910009.txt b/www/photo.causal.agency/2024-06-22/000093910009.txt
new file mode 100644
index 00000000..d67283fe
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910009.txt
@@ -0,0 +1,7 @@
+Ayla in a light coloured tshirt,
+short jorts,
+small backpack,
+white baseball cap
+from behind walking up stone steps
+towards a small stone building
+with a green door.
diff --git a/www/photo.causal.agency/2024-06-22/000093910014.txt b/www/photo.causal.agency/2024-06-22/000093910014.txt
new file mode 100644
index 00000000..1d61a0ca
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910014.txt
@@ -0,0 +1,4 @@
+a stone path
+leading towards
+stone steps leading up
+surrounded by trees.
diff --git a/www/photo.causal.agency/2024-06-22/000093910015.txt b/www/photo.causal.agency/2024-06-22/000093910015.txt
new file mode 100644
index 00000000..8dfe4fdc
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910015.txt
@@ -0,0 +1,4 @@
+a view of the montreal skyline
+from the lookout on the mountain.
+the sky is white.
+there is so much film grain.
diff --git a/www/photo.causal.agency/2024-06-22/000093910016.txt b/www/photo.causal.agency/2024-06-22/000093910016.txt
new file mode 100644
index 00000000..b47910ee
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910016.txt
@@ -0,0 +1,2 @@
+a pile of discarded ductwork
+and scraps of wood.
diff --git a/www/photo.causal.agency/2024-06-22/000093910017.txt b/www/photo.causal.agency/2024-06-22/000093910017.txt
new file mode 100644
index 00000000..c96be2fc
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910017.txt
@@ -0,0 +1,3 @@
+vines on a telephone pole
+in front of a brick building
+painted blue.
diff --git a/www/photo.causal.agency/2024-06-22/000093910019.txt b/www/photo.causal.agency/2024-06-22/000093910019.txt
new file mode 100644
index 00000000..1fc0cccf
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910019.txt
@@ -0,0 +1,5 @@
+a selfie in a convex mirror.
+the mirror is off to the top right.
+I'm wearing a green shirt.
+behind me is a somewhat decaying
+short brick building.
diff --git a/www/photo.causal.agency/2024-06-22/000093910021.txt b/www/photo.causal.agency/2024-06-22/000093910021.txt
new file mode 100644
index 00000000..e8e23272
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910021.txt
@@ -0,0 +1,6 @@
+a mismatched arrangement
+of rectangular window panes
+in a space roughly the size
+of a garage door.
+it is being slowly reclaimed
+by vines and bushes.
diff --git a/www/photo.causal.agency/2024-06-22/000093910022.txt b/www/photo.causal.agency/2024-06-22/000093910022.txt
new file mode 100644
index 00000000..6040fbc9
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910022.txt
@@ -0,0 +1,4 @@
+a view up between two buildings
+at a metal truss in silhouette
+against the almost white sky
+and some cables running between them.
diff --git a/www/photo.causal.agency/2024-06-22/000093910023.txt b/www/photo.causal.agency/2024-06-22/000093910023.txt
new file mode 100644
index 00000000..1313869d
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910023.txt
@@ -0,0 +1,4 @@
+moss and little plants
+growing on pavement in an alley
+at the base of rusty metal stairs,
+behind which is a large shallow puddle.
diff --git a/www/photo.causal.agency/2024-06-22/000093910026.txt b/www/photo.causal.agency/2024-06-22/000093910026.txt
new file mode 100644
index 00000000..2a6f4f9f
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910026.txt
@@ -0,0 +1,10 @@
+a set of metal doors
+in a blue brick building
+with what looks like a big duct pipe
+above them.
+it's not attached to anything
+it's just sitting over the doors
+like a giant unibrow.
+there is a little bridge leading towards the doors.
+to the right of the doors
+is the address number 2111.
diff --git a/www/photo.causal.agency/2024-06-22/000093910027.txt b/www/photo.causal.agency/2024-06-22/000093910027.txt
new file mode 100644
index 00000000..fb69223e
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910027.txt
@@ -0,0 +1,2 @@
+a cat in an alley,
+looking off to the left.
diff --git a/www/photo.causal.agency/2024-06-22/000093910031.txt b/www/photo.causal.agency/2024-06-22/000093910031.txt
new file mode 100644
index 00000000..b9c53122
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910031.txt
@@ -0,0 +1,3 @@
+a set of metal fence doors
+blocking a double-wide staircase
+up the side of a building.
diff --git a/www/photo.causal.agency/2024-06-22/000093910032.txt b/www/photo.causal.agency/2024-06-22/000093910032.txt
new file mode 100644
index 00000000..a0d13629
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/000093910032.txt
@@ -0,0 +1,10 @@
+natural gas pipework
+on a beige brick wall.
+there is a line of pipe
+going horizontal across
+the bottom of the frame,
+with one pipe coming off
+in the middle
+and going upwards,
+with a zig-zag
+and then continuing up at an angle.
diff --git a/www/photo.causal.agency/2024-06-22/film b/www/photo.causal.agency/2024-06-22/film
new file mode 100644
index 00000000..97a445ae
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/film
@@ -0,0 +1 @@
+Shanghai Color Film 400
diff --git a/www/photo.causal.agency/2024-06-22/lens b/www/photo.causal.agency/2024-06-22/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-22/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-06-25/000099820005.txt b/www/photo.causal.agency/2024-06-25/000099820005.txt
new file mode 100644
index 00000000..4f1f8d0d
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820005.txt
@@ -0,0 +1,8 @@
+the side of a building
+that's been covered in
+some sort of construction fabric,
+perhaps tyvek,
+then had horizontal boards of wood
+nailed over it.
+the fabric is torn in places
+and hanging down over itself.
diff --git a/www/photo.causal.agency/2024-06-25/000099820006.txt b/www/photo.causal.agency/2024-06-25/000099820006.txt
new file mode 100644
index 00000000..8cd526f2
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820006.txt
@@ -0,0 +1,7 @@
+the front of a large apartment block
+under construction
+which hasn't yet
+had its exterior wall installed.
+there are balcony platforms
+jutting out from the building
+with no walls or railings.
diff --git a/www/photo.causal.agency/2024-06-25/000099820008.txt b/www/photo.causal.agency/2024-06-25/000099820008.txt
new file mode 100644
index 00000000..05293f76
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820008.txt
@@ -0,0 +1,9 @@
+a backyard with spiral staircase
+descending into it,
+a wooden fence
+and brick dividing wall,
+lights hanging between
+the staircase and somewhere unseen.
+the back door
+has a small "beware of dog" sign
+in the bottom corner.
diff --git a/www/photo.causal.agency/2024-06-25/000099820010.txt b/www/photo.causal.agency/2024-06-25/000099820010.txt
new file mode 100644
index 00000000..e256a668
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820010.txt
@@ -0,0 +1,9 @@
+a low,
+short and wide
+window into a basement
+in a stone wall.
+there is a metal grate
+in front of the window
+with a pattern of three
+sideways H shapes
+separated by straight vertical bars.
diff --git a/www/photo.causal.agency/2024-06-25/000099820011.txt b/www/photo.causal.agency/2024-06-25/000099820011.txt
new file mode 100644
index 00000000..d04f2e30
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820011.txt
@@ -0,0 +1,10 @@
+a small horizontal metal door
+in a plaster wall
+with very flaky paint.
+there are two holes
+in the small door,
+a smaller one in the top left
+and a larger one in the bottom right.
+there are stars,
+possibly stickers,
+placed around the opening.
diff --git a/www/photo.causal.agency/2024-06-25/000099820012.txt b/www/photo.causal.agency/2024-06-25/000099820012.txt
new file mode 100644
index 00000000..03064297
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820012.txt
@@ -0,0 +1,3 @@
+four large flexible fabric tubes
+coming out of various windows
+in the side of a school building.
diff --git a/www/photo.causal.agency/2024-06-25/000099820013.txt b/www/photo.causal.agency/2024-06-25/000099820013.txt
new file mode 100644
index 00000000..f46ce8c0
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820013.txt
@@ -0,0 +1,7 @@
+the top of a building
+where a weirdly small
+cube sticks up above
+the rest of the roof,
+with a full size window
+in the side.
+cloudy sky behind the protrusion.
diff --git a/www/photo.causal.agency/2024-06-25/000099820018.txt b/www/photo.causal.agency/2024-06-25/000099820018.txt
new file mode 100644
index 00000000..cfd4089a
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820018.txt
@@ -0,0 +1,5 @@
+a cat sitting up
+in the open window
+of a weird tall garage extension type thing.
+its fur is sticking through the chicken wire
+that covers the bottom half of the window.
diff --git a/www/photo.causal.agency/2024-06-25/000099820019.txt b/www/photo.causal.agency/2024-06-25/000099820019.txt
new file mode 100644
index 00000000..b9c2a31a
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820019.txt
@@ -0,0 +1,2 @@
+an automatic sprinkler fire alarm
+on an external brick wall.
diff --git a/www/photo.causal.agency/2024-06-25/000099820022.txt b/www/photo.causal.agency/2024-06-25/000099820022.txt
new file mode 100644
index 00000000..4dd6cc34
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820022.txt
@@ -0,0 +1,4 @@
+a flat trolley
+with rope sitting on it.
+the floor of the trolley
+is warped upwards.
diff --git a/www/photo.causal.agency/2024-06-25/000099820023.txt b/www/photo.causal.agency/2024-06-25/000099820023.txt
new file mode 100644
index 00000000..ce39c313
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820023.txt
@@ -0,0 +1,3 @@
+a view into the interior courtyard
+of an abandoned building
+with a haphazardly boarded up window.
diff --git a/www/photo.causal.agency/2024-06-25/000099820026.txt b/www/photo.causal.agency/2024-06-25/000099820026.txt
new file mode 100644
index 00000000..965f97cc
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820026.txt
@@ -0,0 +1,3 @@
+an old style street lamp post
+in the middle of some leafy vines
+on a wooden alley wall.
diff --git a/www/photo.causal.agency/2024-06-25/000099820029.txt b/www/photo.causal.agency/2024-06-25/000099820029.txt
new file mode 100644
index 00000000..9a29161d
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820029.txt
@@ -0,0 +1,3 @@
+a little lantern house thing
+hanging from a tree,
+viewed from the corner.
diff --git a/www/photo.causal.agency/2024-06-25/000099820033.txt b/www/photo.causal.agency/2024-06-25/000099820033.txt
new file mode 100644
index 00000000..5c591d15
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820033.txt
@@ -0,0 +1,3 @@
+some piece of broken mechanical equipment
+lying on the ground next to a tree
+among little plants.
diff --git a/www/photo.causal.agency/2024-06-25/000099820035.txt b/www/photo.causal.agency/2024-06-25/000099820035.txt
new file mode 100644
index 00000000..75ff71b5
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820035.txt
@@ -0,0 +1,7 @@
+a cat looking sleepy
+lying on a little bench
+with a blanket over it
+on someone's porch.
+behind it is a window
+with a cat flap
+and to the right is a bicycle.
diff --git a/www/photo.causal.agency/2024-06-25/000099820038.txt b/www/photo.causal.agency/2024-06-25/000099820038.txt
new file mode 100644
index 00000000..925e3597
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/000099820038.txt
@@ -0,0 +1,5 @@
+mechanical bits
+at the bottom corner
+of a big metal dumpster bin
+you use to dispose of
+construction detritus.
diff --git a/www/photo.causal.agency/2024-06-25/film b/www/photo.causal.agency/2024-06-25/film
new file mode 100644
index 00000000..919ded67
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/film
@@ -0,0 +1 @@
+Ilford HP5 Plus 400
diff --git a/www/photo.causal.agency/2024-06-25/lens b/www/photo.causal.agency/2024-06-25/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-06-25/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-07-01/000099800001.txt b/www/photo.causal.agency/2024-07-01/000099800001.txt
new file mode 100644
index 00000000..fe6ea42d
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800001.txt
@@ -0,0 +1,11 @@
+a floor of a building raised on stilts,
+though they aren't in frame.
+it's a beige plaster wall
+with a set of doors
+in the centre
+guarded by just a fence
+with no balcony.
+the doors are flanked
+by windows on either side.
+the doors and windows
+have oversized outlines in grey.
diff --git a/www/photo.causal.agency/2024-07-01/000099800002.txt b/www/photo.causal.agency/2024-07-01/000099800002.txt
new file mode 100644
index 00000000..3f06a708
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800002.txt
@@ -0,0 +1,4 @@
+a smashed glass bottle
+on the curb.
+there are dead leaves
+and a tissue mixed in there.
diff --git a/www/photo.causal.agency/2024-07-01/000099800007.txt b/www/photo.causal.agency/2024-07-01/000099800007.txt
new file mode 100644
index 00000000..955e3e2b
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800007.txt
@@ -0,0 +1,4 @@
+vines on a wooden lattice
+separating two white garage doors
+each with a row of windows
+behind grates in their top segments.
diff --git a/www/photo.causal.agency/2024-07-01/000099800008.txt b/www/photo.causal.agency/2024-07-01/000099800008.txt
new file mode 100644
index 00000000..01949d67
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800008.txt
@@ -0,0 +1,4 @@
+a green leafy plant
+on a dark red, almost brown wall.
+the paint of the wall is chipped.
+the tops of the leaves are directly in the sun.
diff --git a/www/photo.causal.agency/2024-07-01/000099800011.txt b/www/photo.causal.agency/2024-07-01/000099800011.txt
new file mode 100644
index 00000000..942d94fd
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800011.txt
@@ -0,0 +1,3 @@
+some kind of weird bushy thing
+on the end of a tree branch
+glowing in the sun.
diff --git a/www/photo.causal.agency/2024-07-01/000099800017.txt b/www/photo.causal.agency/2024-07-01/000099800017.txt
new file mode 100644
index 00000000..eac31685
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800017.txt
@@ -0,0 +1,2 @@
+the side of an old red convertible car.
+it seems to be decaying a little bit.
diff --git a/www/photo.causal.agency/2024-07-01/000099800020.txt b/www/photo.causal.agency/2024-07-01/000099800020.txt
new file mode 100644
index 00000000..0b09138f
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800020.txt
@@ -0,0 +1,7 @@
+the front of an old red pickup truck
+parked in an alley
+surrounded by overgrown plants
+indicating it has not moved in a long time.
+the spot on the front grill
+where the ford badge should be
+is empty.
diff --git a/www/photo.causal.agency/2024-07-01/000099800021.txt b/www/photo.causal.agency/2024-07-01/000099800021.txt
new file mode 100644
index 00000000..09e406bf
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/000099800021.txt
@@ -0,0 +1,4 @@
+a stripey cat sneaking
+in an alley in front of a wooden fence
+and behind a big blue hose
+on the ground.
diff --git a/www/photo.causal.agency/2024-07-01/film b/www/photo.causal.agency/2024-07-01/film
new file mode 100644
index 00000000..dcb63ffb
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/film
@@ -0,0 +1 @@
+Kodak Gold 200
diff --git a/www/photo.causal.agency/2024-07-01/lens b/www/photo.causal.agency/2024-07-01/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-01/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-07-03/000099800022.txt b/www/photo.causal.agency/2024-07-03/000099800022.txt
new file mode 100644
index 00000000..32311eec
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099800022.txt
@@ -0,0 +1,6 @@
+a large moss-covered rock
+with the sun hitting
+a surface near the middle.
+right in the bottom right
+corner beside the rock
+is an old discarded soda can.
diff --git a/www/photo.causal.agency/2024-07-03/000099800023.txt b/www/photo.causal.agency/2024-07-03/000099800023.txt
new file mode 100644
index 00000000..0fa3459e
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099800023.txt
@@ -0,0 +1,4 @@
+an old discarded soda can
+with a faded red label
+lying on a bed of dead leaves
+next to a large moss-covered rock.
diff --git a/www/photo.causal.agency/2024-07-03/000099800032.txt b/www/photo.causal.agency/2024-07-03/000099800032.txt
new file mode 100644
index 00000000..6c9606aa
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099800032.txt
@@ -0,0 +1,9 @@
+view of the richelieu river
+from one of the peaks of
+mont saint-hilaire.
+there is a bridge
+crossing the river
+and a surrounding town.
+the horizon is hazy
+fading into an overcast sky
+in the distance.
diff --git a/www/photo.causal.agency/2024-07-03/000099800036.txt b/www/photo.causal.agency/2024-07-03/000099800036.txt
new file mode 100644
index 00000000..1889fdc9
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099800036.txt
@@ -0,0 +1,3 @@
+another view of the richelieu river,
+looking further into the distance
+at mont saint-bruno.
diff --git a/www/photo.causal.agency/2024-07-03/000099810001.txt b/www/photo.causal.agency/2024-07-03/000099810001.txt
new file mode 100644
index 00000000..d4518651
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810001.txt
@@ -0,0 +1,4 @@
+a view of the richelieu river
+between some trees.
+the greens are much deeper
+on this film stock.
diff --git a/www/photo.causal.agency/2024-07-03/000099810002.txt b/www/photo.causal.agency/2024-07-03/000099810002.txt
new file mode 100644
index 00000000..4669d861
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810002.txt
@@ -0,0 +1,4 @@
+Ayla on a peak of mont saint-hilaire
+looking down at her phone.
+she's wearing a pink tshirt
+and a white ballcap.
diff --git a/www/photo.causal.agency/2024-07-03/000099810008.txt b/www/photo.causal.agency/2024-07-03/000099810008.txt
new file mode 100644
index 00000000..9ef302f8
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810008.txt
@@ -0,0 +1,3 @@
+a short wooden signpost
+without a sign on it,
+planted in a mound of rocks.
diff --git a/www/photo.causal.agency/2024-07-03/000099810013.txt b/www/photo.causal.agency/2024-07-03/000099810013.txt
new file mode 100644
index 00000000..39f75d2e
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810013.txt
@@ -0,0 +1,6 @@
+a view past the river
+of the town surrounding it
+and the farmland beyond.
+the leaves of a tree
+in the lower left
+are blowing hard in the wind.
diff --git a/www/photo.causal.agency/2024-07-03/000099810014.txt b/www/photo.causal.agency/2024-07-03/000099810014.txt
new file mode 100644
index 00000000..1a49f2ce
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810014.txt
@@ -0,0 +1,7 @@
+view of the road
+(and rail?)
+leading out of town,
+above a wooden sign post
+pointing left for "Accueil",
+which is like several kilometres
+away from this peak.
diff --git a/www/photo.causal.agency/2024-07-03/000099810017.txt b/www/photo.causal.agency/2024-07-03/000099810017.txt
new file mode 100644
index 00000000..c95c121e
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810017.txt
@@ -0,0 +1,6 @@
+view of the richelieu river
+snaking away into the distance
+from a rocky peak
+of mont saint-hilaire.
+a small wooden signpost
+is stuck into a rock.
diff --git a/www/photo.causal.agency/2024-07-03/000099810019.txt b/www/photo.causal.agency/2024-07-03/000099810019.txt
new file mode 100644
index 00000000..a2e47562
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810019.txt
@@ -0,0 +1,5 @@
+a view of the richelieu river
+to the north.
+the town on this side
+appears to have many cookie-cutter houses.
+there is farmland not far beyond.
diff --git a/www/photo.causal.agency/2024-07-03/000099810021.txt b/www/photo.causal.agency/2024-07-03/000099810021.txt
new file mode 100644
index 00000000..64537e52
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810021.txt
@@ -0,0 +1,4 @@
+a large bird of prey
+gliding across the horizon
+with the town below
+and the river to the left.
diff --git a/www/photo.causal.agency/2024-07-03/000099810022.txt b/www/photo.causal.agency/2024-07-03/000099810022.txt
new file mode 100644
index 00000000..2dbaabd3
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/000099810022.txt
@@ -0,0 +1,4 @@
+a view from one peak,
+across another covered in trees,
+to the river, town and farmland
+in the distance.
diff --git a/www/photo.causal.agency/2024-07-03/film b/www/photo.causal.agency/2024-07-03/film
new file mode 100644
index 00000000..eca5ad01
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/film
@@ -0,0 +1 @@
+Kodak Gold 200, Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-07-03/lens b/www/photo.causal.agency/2024-07-03/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-03/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-07-04/000099810029.txt b/www/photo.causal.agency/2024-07-04/000099810029.txt
new file mode 100644
index 00000000..d3201be9
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-04/000099810029.txt
@@ -0,0 +1,6 @@
+a cluster of small pink flowers
+on a bush.
+there are other clusters in the background.
+one is nearer to the camera
+but only some of its buds
+have started blooming.
diff --git a/www/photo.causal.agency/2024-07-04/000099810033.txt b/www/photo.causal.agency/2024-07-04/000099810033.txt
new file mode 100644
index 00000000..da44c8ce
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-04/000099810033.txt
@@ -0,0 +1,6 @@
+a brick house crowded by trees.
+the front face is painted a light blue.
+there's a tall narrow window
+above a garage door,
+and a balcony
+with some cloth draped over its railing.
diff --git a/www/photo.causal.agency/2024-07-04/000099810036.txt b/www/photo.causal.agency/2024-07-04/000099810036.txt
new file mode 100644
index 00000000..fa3bba11
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-04/000099810036.txt
@@ -0,0 +1,2 @@
+a standard issue red fire hydrant
+crowded by green leaves.
diff --git a/www/photo.causal.agency/2024-07-04/film b/www/photo.causal.agency/2024-07-04/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-04/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-07-04/lens b/www/photo.causal.agency/2024-07-04/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-04/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-07-06/000005110004.txt b/www/photo.causal.agency/2024-07-06/000005110004.txt
new file mode 100644
index 00000000..67518ba3
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/000005110004.txt
@@ -0,0 +1,8 @@
+view looking up
+at the corner of a weird bit
+of a house's balcony type thing.
+the top edge of the roof
+extends over the edge of the inset balcony.
+I have no idea how to explain it.
+there are trees around it
+and sky behind it.
diff --git a/www/photo.causal.agency/2024-07-06/000005110005.txt b/www/photo.causal.agency/2024-07-06/000005110005.txt
new file mode 100644
index 00000000..5ce7cd82
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/000005110005.txt
@@ -0,0 +1,5 @@
+two small shattered lightbulbs
+on a sidewalk.
+they appear to be actual bulbs
+surrounded by plastic,
+and it's the plastic that's shattered.
diff --git a/www/photo.causal.agency/2024-07-06/000005110012.txt b/www/photo.causal.agency/2024-07-06/000005110012.txt
new file mode 100644
index 00000000..89e6e8df
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/000005110012.txt
@@ -0,0 +1,3 @@
+the reflection of
+a big concrete block factory-turned-office building
+in a large puddle.
diff --git a/www/photo.causal.agency/2024-07-06/000005110013.txt b/www/photo.causal.agency/2024-07-06/000005110013.txt
new file mode 100644
index 00000000..75fc3284
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/000005110013.txt
@@ -0,0 +1,7 @@
+an unnecessarily large concrete block
+of a building
+that I'm pretty sure was once factories
+but is now office space.
+there are two sections about 11 storeys tall
+separated by a narrow section
+that is only 3.
diff --git a/www/photo.causal.agency/2024-07-06/000005110014.txt b/www/photo.causal.agency/2024-07-06/000005110014.txt
new file mode 100644
index 00000000..bf423e19
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/000005110014.txt
@@ -0,0 +1,3 @@
+a view close to the ground
+on some railroad tracks
+right before they go around a bend.
diff --git a/www/photo.causal.agency/2024-07-06/000005110017.txt b/www/photo.causal.agency/2024-07-06/000005110017.txt
new file mode 100644
index 00000000..ea58b0bb
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/000005110017.txt
@@ -0,0 +1,2 @@
+a broken wooden picture frame
+on a wet sidewalk
diff --git a/www/photo.causal.agency/2024-07-06/film b/www/photo.causal.agency/2024-07-06/film
new file mode 100644
index 00000000..919ded67
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/film
@@ -0,0 +1 @@
+Ilford HP5 Plus 400
diff --git a/www/photo.causal.agency/2024-07-06/lens b/www/photo.causal.agency/2024-07-06/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-06/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-07-09/000005110025.txt b/www/photo.causal.agency/2024-07-09/000005110025.txt
new file mode 100644
index 00000000..ecc57512
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110025.txt
@@ -0,0 +1,5 @@
+close up of a a flower
+with a bee on it.
+the bee is reaching down
+between the petals
+and you can see its fuzzy butt.
diff --git a/www/photo.causal.agency/2024-07-09/000005110026.txt b/www/photo.causal.agency/2024-07-09/000005110026.txt
new file mode 100644
index 00000000..fe3296d2
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110026.txt
@@ -0,0 +1,8 @@
+the top edge of
+the corner of a stone building
+covered in vines.
+there are two pillars
+going up towards the top.
+the left one is covered in vines
+and the right one is bare.
+between the pillars is the top of a window.
diff --git a/www/photo.causal.agency/2024-07-09/000005110028.txt b/www/photo.causal.agency/2024-07-09/000005110028.txt
new file mode 100644
index 00000000..1e808379
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110028.txt
@@ -0,0 +1,3 @@
+a small bird perched atop a roof peak,
+looking towards me.
+I believe this was a cardinal.
diff --git a/www/photo.causal.agency/2024-07-09/000005110029.txt b/www/photo.causal.agency/2024-07-09/000005110029.txt
new file mode 100644
index 00000000..f5d38a6b
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110029.txt
@@ -0,0 +1,9 @@
+the side of a brick building
+centred around the brick
+bearing the erection year.
+the raised portions of the 19
+have fallen off,
+and only the 08 is left.
+above this is the edge of the roof
+and below it are two ornamental bricks
+at the tops of windows.
diff --git a/www/photo.causal.agency/2024-07-09/000005110030.txt b/www/photo.causal.agency/2024-07-09/000005110030.txt
new file mode 100644
index 00000000..cff02d83
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110030.txt
@@ -0,0 +1,5 @@
+close up of a spiky ball flower.
+on the left a butterfly is perched on it,
+on the bottom right a bee.
+there is another spiky ball flower
+below the butterfly.
diff --git a/www/photo.causal.agency/2024-07-09/000005110033.txt b/www/photo.causal.agency/2024-07-09/000005110033.txt
new file mode 100644
index 00000000..688546f6
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110033.txt
@@ -0,0 +1,6 @@
+three vertically stacked power lines
+at a junction where two sets
+of three smaller cables
+go off in opposite directions.
+the dark lines contrast nicely
+against the lighter background.
diff --git a/www/photo.causal.agency/2024-07-09/000005110035.txt b/www/photo.causal.agency/2024-07-09/000005110035.txt
new file mode 100644
index 00000000..fb7226c6
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110035.txt
@@ -0,0 +1,6 @@
+a ladder leading to the top of a roof
+against the sky.
+the ladder is quite a bit taller
+than it needs to be
+so it ascends into the sky
+a little bit.
diff --git a/www/photo.causal.agency/2024-07-09/000005110036.txt b/www/photo.causal.agency/2024-07-09/000005110036.txt
new file mode 100644
index 00000000..d0628000
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/000005110036.txt
@@ -0,0 +1,8 @@
+the column of bricks
+that was once a chimney
+on the side of a triangular roofed house.
+the bricks are painted a light colour
+but it is peeling in many places.
+there is one of those wireframe
+rectangular sort of satellite dish things
+on the side of the column.
diff --git a/www/photo.causal.agency/2024-07-09/film b/www/photo.causal.agency/2024-07-09/film
new file mode 100644
index 00000000..919ded67
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/film
@@ -0,0 +1 @@
+Ilford HP5 Plus 400
diff --git a/www/photo.causal.agency/2024-07-09/lens b/www/photo.causal.agency/2024-07-09/lens
new file mode 100644
index 00000000..96b4d0a0
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-09/lens
@@ -0,0 +1 @@
+Osawa MC 70–210mm ƒ/4–5
diff --git a/www/photo.causal.agency/2024-07-14/000009180002.txt b/www/photo.causal.agency/2024-07-14/000009180002.txt
new file mode 100644
index 00000000..57ce6c98
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180002.txt
@@ -0,0 +1,3 @@
+a big red flower
+in the centre of the frame
+with a dark green blurred background.
diff --git a/www/photo.causal.agency/2024-07-14/000009180006.txt b/www/photo.causal.agency/2024-07-14/000009180006.txt
new file mode 100644
index 00000000..938ec690
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180006.txt
@@ -0,0 +1,10 @@
+a weird plant with
+like long stalks of I guess seeds
+with little crowns of white flowers on the ends.
+the depth of field is really shallow
+so they come in and out of focus
+from the blurred green background.
+in the centre there's a bee
+on one of the flowered ends
+but it's too close to the camera
+it's not in focus.
diff --git a/www/photo.causal.agency/2024-07-14/000009180010.txt b/www/photo.causal.agency/2024-07-14/000009180010.txt
new file mode 100644
index 00000000..f1e891de
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180010.txt
@@ -0,0 +1,8 @@
+two windows at the top of a plateau building.
+the base of the building is green brick
+and the top roof part is orange shingles
+that appear very shiny in this photo.
+the windows set into the shingled part
+have big flattened triangle
+thingies on top.
+made of wood, you know.
diff --git a/www/photo.causal.agency/2024-07-14/000009180014.txt b/www/photo.causal.agency/2024-07-14/000009180014.txt
new file mode 100644
index 00000000..bf98a26b
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180014.txt
@@ -0,0 +1,3 @@
+close up of an orange and white cat's head
+looking away from the camera
+on a blurred green background.
diff --git a/www/photo.causal.agency/2024-07-14/000009180020.txt b/www/photo.causal.agency/2024-07-14/000009180020.txt
new file mode 100644
index 00000000..1f3763ae
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180020.txt
@@ -0,0 +1,11 @@
+a flower cluster
+in the shape of a ball
+where all the tiny flowers
+come out of a centre point
+on long stems.
+the flowers themselves
+are either green or closed.
+the depth of field is shallow
+so there's a nice effect
+as the stems pop out
+at different angles to the lens.
diff --git a/www/photo.causal.agency/2024-07-14/000009180023.txt b/www/photo.causal.agency/2024-07-14/000009180023.txt
new file mode 100644
index 00000000..3cc28e4d
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180023.txt
@@ -0,0 +1,5 @@
+an array of small whitish flowers
+some of which are too close to the camera
+to be in focus
+and some of which are too far from the camera
+to be in focus.
diff --git a/www/photo.causal.agency/2024-07-14/000009180025.txt b/www/photo.causal.agency/2024-07-14/000009180025.txt
new file mode 100644
index 00000000..6f0e7e9c
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180025.txt
@@ -0,0 +1,6 @@
+a building extension
+whose exterior walls
+are made of severely rusting metal.
+the building is viewed from its corner,
+looking at its top
+against a blue sky.
diff --git a/www/photo.causal.agency/2024-07-14/000009180028.txt b/www/photo.causal.agency/2024-07-14/000009180028.txt
new file mode 100644
index 00000000..5dcc0fa4
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/000009180028.txt
@@ -0,0 +1,3 @@
+a painted spiral staircase
+enclosed on three sides
+by exterior walls.
diff --git a/www/photo.causal.agency/2024-07-14/film b/www/photo.causal.agency/2024-07-14/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-07-14/lens b/www/photo.causal.agency/2024-07-14/lens
new file mode 100644
index 00000000..96b4d0a0
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-14/lens
@@ -0,0 +1 @@
+Osawa MC 70–210mm ƒ/4–5
diff --git a/www/photo.causal.agency/2024-07-27/000025480003.txt b/www/photo.causal.agency/2024-07-27/000025480003.txt
new file mode 100644
index 00000000..159a8688
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-27/000025480003.txt
@@ -0,0 +1,5 @@
+geese on the water.
+there's a group of three in the foreground.
+two on the left have their heads underwater
+and the one on the right looks like it's about to stick its head under.
+there are a handful more in the background.
diff --git a/www/photo.causal.agency/2024-07-27/000025480009.txt b/www/photo.causal.agency/2024-07-27/000025480009.txt
new file mode 100644
index 00000000..53856b80
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-27/000025480009.txt
@@ -0,0 +1,2 @@
+a green buoy in the middle of the river.
+the far shore is rocky with some trees.
diff --git a/www/photo.causal.agency/2024-07-27/000025480010.txt b/www/photo.causal.agency/2024-07-27/000025480010.txt
new file mode 100644
index 00000000..8d46b7f5
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-27/000025480010.txt
@@ -0,0 +1,5 @@
+the jacques-cartier bridge
+viewed from a perpendicular angle,
+right at the middle of it.
+a roller coaster can be seen behind it on the right
+and a cargo boat on the left.
diff --git a/www/photo.causal.agency/2024-07-27/000025480012.txt b/www/photo.causal.agency/2024-07-27/000025480012.txt
new file mode 100644
index 00000000..34555365
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-27/000025480012.txt
@@ -0,0 +1,7 @@
+an outdoor electrical outlet
+mounted on a big piece of stone,
+nestled in a corner
+made by other big pieces of stone.
+there are pine needles and white fluff
+on the ground in front of it.
+its door has come off.
diff --git a/www/photo.causal.agency/2024-07-27/film b/www/photo.causal.agency/2024-07-27/film
new file mode 100644
index 00000000..97a445ae
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-27/film
@@ -0,0 +1 @@
+Shanghai Color Film 400
diff --git a/www/photo.causal.agency/2024-07-27/lens b/www/photo.causal.agency/2024-07-27/lens
new file mode 100644
index 00000000..96b4d0a0
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-27/lens
@@ -0,0 +1 @@
+Osawa MC 70–210mm ƒ/4–5
diff --git a/www/photo.causal.agency/2024-07-29/000025480014.txt b/www/photo.causal.agency/2024-07-29/000025480014.txt
new file mode 100644
index 00000000..7d3094e0
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480014.txt
@@ -0,0 +1,3 @@
+a green spiral metal staircase
+going up a brick wall
+absolutely covered in leafy vines.
diff --git a/www/photo.causal.agency/2024-07-29/000025480017.txt b/www/photo.causal.agency/2024-07-29/000025480017.txt
new file mode 100644
index 00000000..19137d80
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480017.txt
@@ -0,0 +1,5 @@
+the back or side of a building,
+probably a short office building,
+with columns of windows
+separated by uh,
+protruding bits of the building.
diff --git a/www/photo.causal.agency/2024-07-29/000025480018.txt b/www/photo.causal.agency/2024-07-29/000025480018.txt
new file mode 100644
index 00000000..2712fe2f
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480018.txt
@@ -0,0 +1,5 @@
+the top edge of a building,
+including power line pole
+on the roof,
+metal beam sticking out the side,
+and a little stone chimney.
diff --git a/www/photo.causal.agency/2024-07-29/000025480028.txt b/www/photo.causal.agency/2024-07-29/000025480028.txt
new file mode 100644
index 00000000..0a56a06c
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480028.txt
@@ -0,0 +1,11 @@
+a view all the way up the side
+of an old brick factory building,
+7 storeys tall.
+all of the windows on the far right
+have been filled in with cement.
+some of the other windows
+have been filled in with
+what looks like corrugated metal.
+some of the remaining windows
+are the original 6x3 pane
+and some are single pane.
diff --git a/www/photo.causal.agency/2024-07-29/000025480030.txt b/www/photo.causal.agency/2024-07-29/000025480030.txt
new file mode 100644
index 00000000..3ac51b0d
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480030.txt
@@ -0,0 +1,21 @@
+the intersection or interior corner
+of old brick factory buildings.
+we're sort of looking at a vertical W shape,
+with two buildings on either side
+at a right angle,
+and one corner peice of building
+jutting out between the other two.
+the old factory windows
+of these buildings
+are in various states of boarded up
+or filled in with concrete
+or left as-is.
+there are pipes and ducts and conduits
+crawling all over the buildings.
+the right side wall
+of the middle building piece
+is covered in leafy vines.
+the middle section
+is shorter than the others
+and light is coming over top of it
+hitting the leftmost building.
diff --git a/www/photo.causal.agency/2024-07-29/000025480033.txt b/www/photo.causal.agency/2024-07-29/000025480033.txt
new file mode 100644
index 00000000..41594319
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480033.txt
@@ -0,0 +1,7 @@
+detail of the centre corner piece of building
+from the previous photo,
+with pipes going up along
+the left building where it intersects
+with the middle building,
+and a conduit going across
+the top of where the vines reach.
diff --git a/www/photo.causal.agency/2024-07-29/000025480034.txt b/www/photo.causal.agency/2024-07-29/000025480034.txt
new file mode 100644
index 00000000..8a2c3227
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480034.txt
@@ -0,0 +1,8 @@
+part of an old factory building,
+a storey or two up.
+what used to be a window
+has been filled in with big grey stone bricks,
+but the metal cage over the outside
+has been left in place.
+a whole array of pipes climbs
+the building to the left.
diff --git a/www/photo.causal.agency/2024-07-29/000025480035.txt b/www/photo.causal.agency/2024-07-29/000025480035.txt
new file mode 100644
index 00000000..4ec13a5e
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480035.txt
@@ -0,0 +1,7 @@
+the intersection of some old brick factory buildings.
+windows are variously boarded up or filled in.
+one of the walls has leafy vines climbing up it,
+stopping at a conduit that's going across.
+a large duct goes up the building
+next to the vines.
+light is pouring over the top edge of the building.
diff --git a/www/photo.causal.agency/2024-07-29/000025480036.txt b/www/photo.causal.agency/2024-07-29/000025480036.txt
new file mode 100644
index 00000000..0554a5de
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/000025480036.txt
@@ -0,0 +1,15 @@
+the brick wall of an old factory building
+with sets of 6x4 pane windows,
+where it looks like the middle 4x2
+panes swivel open.
+a round duct or chimney
+has been installed
+in one of the lower windows
+and goes up the outside of the building.
+two of the other windows
+have been filled in,
+one with brick
+and one with metal.
+they both have vents embedded in them.
+an array of pipes climbs halfway up
+the far right edge of this wall.
diff --git a/www/photo.causal.agency/2024-07-29/film b/www/photo.causal.agency/2024-07-29/film
new file mode 100644
index 00000000..97a445ae
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/film
@@ -0,0 +1 @@
+Shanghai Color Film 400
diff --git a/www/photo.causal.agency/2024-07-29/lens b/www/photo.causal.agency/2024-07-29/lens
new file mode 100644
index 00000000..705b4e57
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-29/lens
@@ -0,0 +1 @@
+Yashica ML Zoom 28–85mm ƒ/3.5–4.5
diff --git a/www/photo.causal.agency/2024-07-30/000025490001.txt b/www/photo.causal.agency/2024-07-30/000025490001.txt
new file mode 100644
index 00000000..290ac209
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490001.txt
@@ -0,0 +1,2 @@
+two empty swings in a park.
+beyond there is a bench and a trash can.
diff --git a/www/photo.causal.agency/2024-07-30/000025490002.txt b/www/photo.causal.agency/2024-07-30/000025490002.txt
new file mode 100644
index 00000000..5554d178
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490002.txt
@@ -0,0 +1,4 @@
+some sort of small power station type building.
+its address is 4131,
+and there's a lamp above that number.
+to the right there's a fenced off area.
diff --git a/www/photo.causal.agency/2024-07-30/000025490003.txt b/www/photo.causal.agency/2024-07-30/000025490003.txt
new file mode 100644
index 00000000..4b2573af
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490003.txt
@@ -0,0 +1,2 @@
+some round white paper lantern type things
+hanging under an elevated deck.
diff --git a/www/photo.causal.agency/2024-07-30/000025490004.txt b/www/photo.causal.agency/2024-07-30/000025490004.txt
new file mode 100644
index 00000000..81409be3
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490004.txt
@@ -0,0 +1,6 @@
+two wooden construction barriers at angles to each other
+at the edge of a park.
+neither are supported on both sides.
+one is coming towards the camera,
+the other is going across.
+it says ABF on it.
diff --git a/www/photo.causal.agency/2024-07-30/000025490009.txt b/www/photo.causal.agency/2024-07-30/000025490009.txt
new file mode 100644
index 00000000..6e38b667
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490009.txt
@@ -0,0 +1,4 @@
+a series of 4 power line poles
+in close proximity
+against a grey sky
+in front of a completely shadowed building.
diff --git a/www/photo.causal.agency/2024-07-30/000025490010.txt b/www/photo.causal.agency/2024-07-30/000025490010.txt
new file mode 100644
index 00000000..75853ca8
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490010.txt
@@ -0,0 +1,3 @@
+an empty field with some sort of small tripod structure
+in the middle.
+beyond it are condo buildings.
diff --git a/www/photo.causal.agency/2024-07-30/000025490012.txt b/www/photo.causal.agency/2024-07-30/000025490012.txt
new file mode 100644
index 00000000..6d3bc3c4
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490012.txt
@@ -0,0 +1,5 @@
+a public pool in a park
+at night illuminated by flood light above.
+in the centre of the frame
+are two diving boards side by side
+with metal railings.
diff --git a/www/photo.causal.agency/2024-07-30/000025490014.txt b/www/photo.causal.agency/2024-07-30/000025490014.txt
new file mode 100644
index 00000000..a85000f9
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/000025490014.txt
@@ -0,0 +1,5 @@
+a blinking red traffic light suspended above an intersection.
+it's completely dark
+except for the traffic light
+and some other source in the bottom left.
+the shape of a building and tree can be made out.
diff --git a/www/photo.causal.agency/2024-07-30/film b/www/photo.causal.agency/2024-07-30/film
new file mode 100644
index 00000000..919ded67
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/film
@@ -0,0 +1 @@
+Ilford HP5 Plus 400
diff --git a/www/photo.causal.agency/2024-07-30/lens b/www/photo.causal.agency/2024-07-30/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-07-30/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-08-02/000025490019.txt b/www/photo.causal.agency/2024-08-02/000025490019.txt
new file mode 100644
index 00000000..b8e3a89f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490019.txt
@@ -0,0 +1,5 @@
+close up of a bundle of small pipes
+that come up out of the ground
+around person height
+and curve downwards at the top,
+with the ends covered by a rough metal mesh.
diff --git a/www/photo.causal.agency/2024-08-02/000025490026.txt b/www/photo.causal.agency/2024-08-02/000025490026.txt
new file mode 100644
index 00000000..dd5049e7
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490026.txt
@@ -0,0 +1,5 @@
+the side of a concrete building
+with an intricate pattern
+of concrete and narrow windows.
+the windows are reflecting a light sky.
+good contrast and shadows here.
diff --git a/www/photo.causal.agency/2024-08-02/000025490027.txt b/www/photo.causal.agency/2024-08-02/000025490027.txt
new file mode 100644
index 00000000..15d6847a
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490027.txt
@@ -0,0 +1,6 @@
+a wider view of
+the side of a concrete building
+with an intricate pattern
+of concrete and narrow windows.
+the windows are reflecting a light sky.
+good contrast and shadows here.
diff --git a/www/photo.causal.agency/2024-08-02/000025490029.txt b/www/photo.causal.agency/2024-08-02/000025490029.txt
new file mode 100644
index 00000000..f9f86887
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490029.txt
@@ -0,0 +1,6 @@
+the back of a haphazard
+building extension
+with walls of corrugated metal,
+vines growing lazily all over it.
+the right side appears to
+be covered only by a canvas roof.
diff --git a/www/photo.causal.agency/2024-08-02/000025490030.txt b/www/photo.causal.agency/2024-08-02/000025490030.txt
new file mode 100644
index 00000000..eb7a4b13
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490030.txt
@@ -0,0 +1,5 @@
+a metal cylinder
+with a thick cable going through it
+suspended against a brick wall
+by a smaller steel cable
+bolted into the wall.
diff --git a/www/photo.causal.agency/2024-08-02/000025490031.txt b/www/photo.causal.agency/2024-08-02/000025490031.txt
new file mode 100644
index 00000000..3a6e576e
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490031.txt
@@ -0,0 +1,4 @@
+the shallow sloped roof
+of a house with a single window
+protruding from it on the right.
+trees beyond the roof.
diff --git a/www/photo.causal.agency/2024-08-02/000025490035.txt b/www/photo.causal.agency/2024-08-02/000025490035.txt
new file mode 100644
index 00000000..60ac4e32
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490035.txt
@@ -0,0 +1,7 @@
+the side of a brick building
+that is featureless until a couple storeys up
+where there are squares of glass cube grids
+with small actuall windows
+embedded in them off-centre.
+the windows are separated by columns of bricks
+that go down the outside of the building.
diff --git a/www/photo.causal.agency/2024-08-02/000025490036.txt b/www/photo.causal.agency/2024-08-02/000025490036.txt
new file mode 100644
index 00000000..4de137fb
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/000025490036.txt
@@ -0,0 +1,11 @@
+the cube.
+the rectangle.
+it's a modern part of a building
+that's been added onto over time.
+and it's just a big rectangle
+with like a dev texture on it
+and some weirdly placed windows.
+we're looking up at it
+from an angle
+and the sun is hitting the top corner of it.
+it looks imposing.
diff --git a/www/photo.causal.agency/2024-08-02/film b/www/photo.causal.agency/2024-08-02/film
new file mode 100644
index 00000000..919ded67
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/film
@@ -0,0 +1 @@
+Ilford HP5 Plus 400
diff --git a/www/photo.causal.agency/2024-08-02/lens b/www/photo.causal.agency/2024-08-02/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-02/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-08-10/000031420002.txt b/www/photo.causal.agency/2024-08-10/000031420002.txt
new file mode 100644
index 00000000..e9eac877
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420002.txt
@@ -0,0 +1,5 @@
+close up of a bundle of small pipes
+that come up out of the ground around person height
+and curve downwards at the top,
+with the ends covered by a rough metal mesh.
+they're sort of pale greenish coloured.
diff --git a/www/photo.causal.agency/2024-08-10/000031420005.txt b/www/photo.causal.agency/2024-08-10/000031420005.txt
new file mode 100644
index 00000000..dbc7c12a
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420005.txt
@@ -0,0 +1,4 @@
+a big bush of yellow flowers
+with flat petals that don't touch
+and big brown balls in the centre.
+they're glowing in the sunlight.
diff --git a/www/photo.causal.agency/2024-08-10/000031420007.txt b/www/photo.causal.agency/2024-08-10/000031420007.txt
new file mode 100644
index 00000000..6138ee21
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420007.txt
@@ -0,0 +1,3 @@
+one big flower with white petals
+that are deep red only right near the centre
+and a long plant reproductive bit.
diff --git a/www/photo.causal.agency/2024-08-10/000031420011.txt b/www/photo.causal.agency/2024-08-10/000031420011.txt
new file mode 100644
index 00000000..4dcc7c39
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420011.txt
@@ -0,0 +1,2 @@
+a cat lying down in an alley next to a little ball,
+looking at the camera.
diff --git a/www/photo.causal.agency/2024-08-10/000031420012.txt b/www/photo.causal.agency/2024-08-10/000031420012.txt
new file mode 100644
index 00000000..3d0b928c
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420012.txt
@@ -0,0 +1,4 @@
+close up of a cat in an alley
+with its eyes closed.
+it's lying next to a small ball.
+it has thumbs!
diff --git a/www/photo.causal.agency/2024-08-10/000031420015.txt b/www/photo.causal.agency/2024-08-10/000031420015.txt
new file mode 100644
index 00000000..7c116097
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420015.txt
@@ -0,0 +1,4 @@
+the top of a discarded hot water tank
+with two severed pipes coming out.
+the top appears green,
+though it may have been blue.
diff --git a/www/photo.causal.agency/2024-08-10/000031420016.txt b/www/photo.causal.agency/2024-08-10/000031420016.txt
new file mode 100644
index 00000000..ea0af1e7
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420016.txt
@@ -0,0 +1,8 @@
+what is perhaps a planter
+among overgrowing plants,
+with two little wagon wheels
+seemingly broken off.
+one is leaning against the near side
+of the planter
+and the other is flat on the ground
+half under it.
diff --git a/www/photo.causal.agency/2024-08-10/000031420020.txt b/www/photo.causal.agency/2024-08-10/000031420020.txt
new file mode 100644
index 00000000..8ce4c5c1
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420020.txt
@@ -0,0 +1,2 @@
+power lines atop a wooden pole with 3 drums
+against a blue sky with white clouds.
diff --git a/www/photo.causal.agency/2024-08-10/000031420024.txt b/www/photo.causal.agency/2024-08-10/000031420024.txt
new file mode 100644
index 00000000..6d4ec555
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420024.txt
@@ -0,0 +1,3 @@
+a street lamp in an alley
+under the shade of a tree
+with two large spherical lamps.
diff --git a/www/photo.causal.agency/2024-08-10/000031420026.txt b/www/photo.causal.agency/2024-08-10/000031420026.txt
new file mode 100644
index 00000000..77297a74
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420026.txt
@@ -0,0 +1,3 @@
+a big ball of clustered tiny white flowers
+glowing in the sun
+on a bright blue sky.
diff --git a/www/photo.causal.agency/2024-08-10/000031420027.txt b/www/photo.causal.agency/2024-08-10/000031420027.txt
new file mode 100644
index 00000000..d31920e8
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420027.txt
@@ -0,0 +1,8 @@
+the side of a weird old presumably european tiny car
+that's been rotting in an alley for who knows how long.
+the car is painted black
+and there's a bunch of graffiti in white
+on the door and back side as well as the window.
+on the door next to the handle there's a stenciled "GREMA".
+the car is in worse shape
+than the last time I photographed it.
diff --git a/www/photo.causal.agency/2024-08-10/000031420028.txt b/www/photo.causal.agency/2024-08-10/000031420028.txt
new file mode 100644
index 00000000..e4cbd11f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420028.txt
@@ -0,0 +1,2 @@
+the steering wheel of an old presumably european car
+that has been left to rot in an alley.
diff --git a/www/photo.causal.agency/2024-08-10/000031420029.txt b/www/photo.causal.agency/2024-08-10/000031420029.txt
new file mode 100644
index 00000000..ea3361fb
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420029.txt
@@ -0,0 +1,3 @@
+a discarded bicycle tire
+in front of a mound of dirt and dead leaves
+in an alley.
diff --git a/www/photo.causal.agency/2024-08-10/000031420034.txt b/www/photo.causal.agency/2024-08-10/000031420034.txt
new file mode 100644
index 00000000..542924f3
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/000031420034.txt
@@ -0,0 +1,4 @@
+the top halves of some classic plateau rowhouses
+against a light blue sky with some clouds.
+the top windows are painted in a sequence of
+dark purple, orange, dark green, some kind of red.
diff --git a/www/photo.causal.agency/2024-08-10/body b/www/photo.causal.agency/2024-08-10/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2024-08-10/film b/www/photo.causal.agency/2024-08-10/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-08-10/lens b/www/photo.causal.agency/2024-08-10/lens
new file mode 100644
index 00000000..dcd0812c
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-10/lens
@@ -0,0 +1 @@
+Helios-44M-5 58mm ƒ/2
diff --git a/www/photo.causal.agency/2024-08-22/000044750004.txt b/www/photo.causal.agency/2024-08-22/000044750004.txt
new file mode 100644
index 00000000..a6d758bd
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750004.txt
@@ -0,0 +1,2 @@
+a broken and fallen limb of a tree
+laying in a puddle in an alley.
diff --git a/www/photo.causal.agency/2024-08-22/000044750007.txt b/www/photo.causal.agency/2024-08-22/000044750007.txt
new file mode 100644
index 00000000..faf48f72
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750007.txt
@@ -0,0 +1,7 @@
+some kind of motor
+attached to some kind of machinery.
+it looks like a cable runs
+from a box on its sidee
+to another box not far
+with what looks like
+an ordinary light switch on it.
diff --git a/www/photo.causal.agency/2024-08-22/000044750008.txt b/www/photo.causal.agency/2024-08-22/000044750008.txt
new file mode 100644
index 00000000..1475b9e1
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750008.txt
@@ -0,0 +1,3 @@
+wrought iron fence detail.
+it's got swirly bits
+and squiggly pointy bits.
diff --git a/www/photo.causal.agency/2024-08-22/000044750009.txt b/www/photo.causal.agency/2024-08-22/000044750009.txt
new file mode 100644
index 00000000..a8c887cc
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750009.txt
@@ -0,0 +1,2 @@
+wider view of wrought iron fence
+showing two instances of its repeated pattern.
diff --git a/www/photo.causal.agency/2024-08-22/000044750010.txt b/www/photo.causal.agency/2024-08-22/000044750010.txt
new file mode 100644
index 00000000..8e275e06
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750010.txt
@@ -0,0 +1,3 @@
+a bike locked to a fence
+being overgrown by bushes
+and weeds and other plants.
diff --git a/www/photo.causal.agency/2024-08-22/000044750013.txt b/www/photo.causal.agency/2024-08-22/000044750013.txt
new file mode 100644
index 00000000..d89c3ac1
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750013.txt
@@ -0,0 +1,5 @@
+a bee sitting on a flower
+that has thin sort of curled up petals
+spaced far apart.
+sort of looks like the bee
+is humping the middle of the flower.
diff --git a/www/photo.causal.agency/2024-08-22/000044750014.txt b/www/photo.causal.agency/2024-08-22/000044750014.txt
new file mode 100644
index 00000000..0e591c1f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750014.txt
@@ -0,0 +1,8 @@
+a metal frame structure
+in the shape of half a cyllinder
+suspended,
+presumably over a walkway,
+on square concrete pillars.
+the pillars have three notches
+in them near the top.
+this is just outside a large stone building.
diff --git a/www/photo.causal.agency/2024-08-22/000044750016.txt b/www/photo.causal.agency/2024-08-22/000044750016.txt
new file mode 100644
index 00000000..ef9a68a3
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750016.txt
@@ -0,0 +1,7 @@
+the top of a large building
+with a pointed roof.
+some of the windows are intact
+while some have beams of wood
+across them on the outside
+seemingly holding boards of wood
+against the insides?
diff --git a/www/photo.causal.agency/2024-08-22/000044750024.txt b/www/photo.causal.agency/2024-08-22/000044750024.txt
new file mode 100644
index 00000000..b3c14768
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750024.txt
@@ -0,0 +1,6 @@
+a single cable,
+probably telephone,
+suspended by a pole
+in an upside-down L shape
+with a truss between
+the two pieces.
diff --git a/www/photo.causal.agency/2024-08-22/000044750027.txt b/www/photo.causal.agency/2024-08-22/000044750027.txt
new file mode 100644
index 00000000..3c614db2
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750027.txt
@@ -0,0 +1,5 @@
+a weird cube of building
+covered in a metal diamond tiling pattern
+with one wide window in the side
+and some cables under tension
+going down it.
diff --git a/www/photo.causal.agency/2024-08-22/000044750028.txt b/www/photo.causal.agency/2024-08-22/000044750028.txt
new file mode 100644
index 00000000..f6998321
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/000044750028.txt
@@ -0,0 +1,3 @@
+a row of back to back park benches
+among trees continuing
+into the distance away to the right.
diff --git a/www/photo.causal.agency/2024-08-22/body b/www/photo.causal.agency/2024-08-22/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2024-08-22/film b/www/photo.causal.agency/2024-08-22/film
new file mode 100644
index 00000000..919ded67
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/film
@@ -0,0 +1 @@
+Ilford HP5 Plus 400
diff --git a/www/photo.causal.agency/2024-08-22/lens b/www/photo.causal.agency/2024-08-22/lens
new file mode 100644
index 00000000..dcd0812c
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-22/lens
@@ -0,0 +1 @@
+Helios-44M-5 58mm ƒ/2
diff --git a/www/photo.causal.agency/2024-08-23/000044740001.txt b/www/photo.causal.agency/2024-08-23/000044740001.txt
new file mode 100644
index 00000000..dcc7e42f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740001.txt
@@ -0,0 +1,8 @@
+an old-style metal lamp post
+on a solid wooden fence
+with vines growing over it.
+the left side of the frame
+and the bottom and top edges
+have red light bleeding into them
+from the film being exposed
+during loading.
diff --git a/www/photo.causal.agency/2024-08-23/000044740002.txt b/www/photo.causal.agency/2024-08-23/000044740002.txt
new file mode 100644
index 00000000..821c0b5b
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740002.txt
@@ -0,0 +1,5 @@
+a view down an alley
+past a tree with hanging leaves.
+bright sunlight is
+coming through a branch
+off the alley to the left.
diff --git a/www/photo.causal.agency/2024-08-23/000044740010.txt b/www/photo.causal.agency/2024-08-23/000044740010.txt
new file mode 100644
index 00000000..428ffe8f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740010.txt
@@ -0,0 +1,5 @@
+close up of a cluster
+of some kind of berries
+on a plant with nice green leaves.
+the stems appear red
+and the berries a dark blue.
diff --git a/www/photo.causal.agency/2024-08-23/000044740014.txt b/www/photo.causal.agency/2024-08-23/000044740014.txt
new file mode 100644
index 00000000..f04e5615
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740014.txt
@@ -0,0 +1,4 @@
+a big tall tree
+with branches that
+all point very upwards
+rather than outwards.
diff --git a/www/photo.causal.agency/2024-08-23/000044740017.txt b/www/photo.causal.agency/2024-08-23/000044740017.txt
new file mode 100644
index 00000000..ac8e4ba9
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740017.txt
@@ -0,0 +1,2 @@
+the top half of a big tree
+with many branching thick limbs.
diff --git a/www/photo.causal.agency/2024-08-23/000044740021.txt b/www/photo.causal.agency/2024-08-23/000044740021.txt
new file mode 100644
index 00000000..6ee78b65
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740021.txt
@@ -0,0 +1,5 @@
+view up at a huge old stone building
+with lots of 3D shape going on
+and lots of windows.
+past it is a blue sky
+with a big white fluffy cloud.
diff --git a/www/photo.causal.agency/2024-08-23/000044740024.txt b/www/photo.causal.agency/2024-08-23/000044740024.txt
new file mode 100644
index 00000000..f344f290
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740024.txt
@@ -0,0 +1,8 @@
+a completely empty bit of
+road or parking lot
+surrounded by trees,
+curving away and downward in the distance.
+on one side,
+behind construction fences,
+there's a tall street light
+with a blue P-5 sign attached.
diff --git a/www/photo.causal.agency/2024-08-23/000044740030.txt b/www/photo.causal.agency/2024-08-23/000044740030.txt
new file mode 100644
index 00000000..42d3ef1a
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740030.txt
@@ -0,0 +1,8 @@
+a wide set of concrete stairs
+divided by 4 sets of white metal railings
+ascending out into the sun
+from under a low concrete ceiling
+with a large square grid pattern.
+the ceiling is being lit
+by a sort of bluish-green light
+from behind.
diff --git a/www/photo.causal.agency/2024-08-23/000044740031.txt b/www/photo.causal.agency/2024-08-23/000044740031.txt
new file mode 100644
index 00000000..e566e86f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740031.txt
@@ -0,0 +1,4 @@
+a tall brutalist-ish apartment building
+on a mostly clear blue sky,
+with one white cloud in the bottom left.
+the building appears orange.
diff --git a/www/photo.causal.agency/2024-08-23/000044740033.txt b/www/photo.causal.agency/2024-08-23/000044740033.txt
new file mode 100644
index 00000000..44d1d1f5
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740033.txt
@@ -0,0 +1,6 @@
+the back of an old brick building
+that is probably being renovated.
+the ground is descending
+behind the building as if to underground parking,
+and there is a space for a door
+that is blocked with plywood.
diff --git a/www/photo.causal.agency/2024-08-23/000044740034.txt b/www/photo.causal.agency/2024-08-23/000044740034.txt
new file mode 100644
index 00000000..5492db03
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740034.txt
@@ -0,0 +1,6 @@
+looking up at an old red brick building
+from the ground.
+there are three rows of windows.
+there are also two doors
+with no handles and little square windows
+that would open onto nothing.
diff --git a/www/photo.causal.agency/2024-08-23/000044740035.txt b/www/photo.causal.agency/2024-08-23/000044740035.txt
new file mode 100644
index 00000000..3cf7a14f
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740035.txt
@@ -0,0 +1,4 @@
+a pile of palettes stacked with slabs of stone
+sitting at the side of a brick building.
+based on how plants are growing around them,
+they haven't been touched in a while.
diff --git a/www/photo.causal.agency/2024-08-23/000044740036.txt b/www/photo.causal.agency/2024-08-23/000044740036.txt
new file mode 100644
index 00000000..c87ba240
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/000044740036.txt
@@ -0,0 +1,14 @@
+the back of a very strange
+residential building
+that's clearly been built onto.
+on the right is a regular red wooden door.
+on the left is a painted brown metal door
+with a circular window in it
+like a porthole.
+this is at the bottom of a metal column,
+presumably containing stairs,
+with one more porthole
+not far above the door.
+slid right between this weird extension
+and the side of the adjacent building
+is a very tall ladder.
diff --git a/www/photo.causal.agency/2024-08-23/body b/www/photo.causal.agency/2024-08-23/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-08-23/film b/www/photo.causal.agency/2024-08-23/film
new file mode 100644
index 00000000..2340483a
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/film
@@ -0,0 +1 @@
+Film Washi “X” 100
diff --git a/www/photo.causal.agency/2024-08-23/lens b/www/photo.causal.agency/2024-08-23/lens
new file mode 100644
index 00000000..465336d3
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-23/lens
@@ -0,0 +1 @@
+Makinon 28mm ƒ/2.8
diff --git a/www/photo.causal.agency/2024-08-24/000044730001.txt b/www/photo.causal.agency/2024-08-24/000044730001.txt
new file mode 100644
index 00000000..9481f22a
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730001.txt
@@ -0,0 +1,6 @@
+overhead lines for electric trains
+silhouetted against a blue sky.
+there's a train partially visible
+behind a concrete barrier.
+there's a pentagonal lens flare
+in the sky.
diff --git a/www/photo.causal.agency/2024-08-24/000044730002.txt b/www/photo.causal.agency/2024-08-24/000044730002.txt
new file mode 100644
index 00000000..c2290e3c
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730002.txt
@@ -0,0 +1,4 @@
+overhead lines for electric trains
+silhouetted against a blue sky
+with sparse clouds
+as a train goes past.
diff --git a/www/photo.causal.agency/2024-08-24/000044730004.txt b/www/photo.causal.agency/2024-08-24/000044730004.txt
new file mode 100644
index 00000000..5874fc87
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730004.txt
@@ -0,0 +1,5 @@
+a vast and empty parking lot
+under a blue sky with clouds in the distance.
+the parking lot extends at an angle
+away from a crosswalk in the foreground.
+behind the lot is a large shed.
diff --git a/www/photo.causal.agency/2024-08-24/000044730008.txt b/www/photo.causal.agency/2024-08-24/000044730008.txt
new file mode 100644
index 00000000..86ac6f65
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730008.txt
@@ -0,0 +1,6 @@
+a vast and empty parking lot
+under a blue sky fading into clouds.
+we are looking down a line of crosswalks
+that cross the lot.
+there are rows of young trees
+and lots of signs on metal poles.
diff --git a/www/photo.causal.agency/2024-08-24/000044730012.txt b/www/photo.causal.agency/2024-08-24/000044730012.txt
new file mode 100644
index 00000000..6311d731
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730012.txt
@@ -0,0 +1,3 @@
+some sort of device atop
+overhead lines for electric trains
+against a grey-blue sky.
diff --git a/www/photo.causal.agency/2024-08-24/000044730014.txt b/www/photo.causal.agency/2024-08-24/000044730014.txt
new file mode 100644
index 00000000..96e5e4dd
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730014.txt
@@ -0,0 +1,3 @@
+train tracks with overhead lines
+inside a fenced area.
+there are three parallel tracks.
diff --git a/www/photo.causal.agency/2024-08-24/000044730018.txt b/www/photo.causal.agency/2024-08-24/000044730018.txt
new file mode 100644
index 00000000..ae0ea59d
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730018.txt
@@ -0,0 +1,4 @@
+the wall of the base under a track,
+close at the left side of the frame
+and quickly stretching into the distance
+to the right.
diff --git a/www/photo.causal.agency/2024-08-24/000044730026.txt b/www/photo.causal.agency/2024-08-24/000044730026.txt
new file mode 100644
index 00000000..d646f8e5
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730026.txt
@@ -0,0 +1,8 @@
+the inside of a train station,
+with walls of orange-brown tile.
+there is a stairway leading up to the left,
+and one in shadow at the end of a short tunnel
+to the right.
+in the centre is a green sign
+pointing up the left stairs towards
+quai 1 and quai 3.
diff --git a/www/photo.causal.agency/2024-08-24/000044730028.txt b/www/photo.causal.agency/2024-08-24/000044730028.txt
new file mode 100644
index 00000000..3978d978
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730028.txt
@@ -0,0 +1,2 @@
+the tops of grass that has grown untended
+and has produced seeds and gone yellow/brown.
diff --git a/www/photo.causal.agency/2024-08-24/000044730029.txt b/www/photo.causal.agency/2024-08-24/000044730029.txt
new file mode 100644
index 00000000..52d3c975
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730029.txt
@@ -0,0 +1,2 @@
+a short set of curved wooden steps
+surrounded by leaves.
diff --git a/www/photo.causal.agency/2024-08-24/000044730030.txt b/www/photo.causal.agency/2024-08-24/000044730030.txt
new file mode 100644
index 00000000..de6ef2ff
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730030.txt
@@ -0,0 +1 @@
+close up of a cluster of little pink flowers.
diff --git a/www/photo.causal.agency/2024-08-24/000044730035.txt b/www/photo.causal.agency/2024-08-24/000044730035.txt
new file mode 100644
index 00000000..70b7e7ef
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/000044730035.txt
@@ -0,0 +1,4 @@
+an orange and white cat sitting in an alley
+looking off to the left.
+it's got a collar on
+with a little heard shaped tag on it.
diff --git a/www/photo.causal.agency/2024-08-24/body b/www/photo.causal.agency/2024-08-24/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2024-08-24/film b/www/photo.causal.agency/2024-08-24/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-08-24/lens b/www/photo.causal.agency/2024-08-24/lens
new file mode 100644
index 00000000..19fafffb
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-24/lens
@@ -0,0 +1 @@
+Takumar 35mm ƒ/3.5, Helios-44M-5 58mm ƒ/2
diff --git a/www/photo.causal.agency/2024-08-29/000054970002.txt b/www/photo.causal.agency/2024-08-29/000054970002.txt
new file mode 100644
index 00000000..e58bb3c3
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-29/000054970002.txt
@@ -0,0 +1,3 @@
+reflection of trees and sky
+in water with ripples
+at early evening.
diff --git a/www/photo.causal.agency/2024-08-29/000054970004.txt b/www/photo.causal.agency/2024-08-29/000054970004.txt
new file mode 100644
index 00000000..b8ca6fc6
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-29/000054970004.txt
@@ -0,0 +1,5 @@
+rough concrete blocks
+stacked 3 by 3 except
+the top right one is missing.
+they're heavily weathered
+and have trees overhanging them.
diff --git a/www/photo.causal.agency/2024-08-29/body b/www/photo.causal.agency/2024-08-29/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-29/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-08-29/film b/www/photo.causal.agency/2024-08-29/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-29/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-08-29/lens b/www/photo.causal.agency/2024-08-29/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-08-29/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-09-02/000054970017.txt b/www/photo.causal.agency/2024-09-02/000054970017.txt
new file mode 100644
index 00000000..a90825a9
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970017.txt
@@ -0,0 +1,11 @@
+a block of windows in a school building,
+viewed from a slight angle.
+the wall of the building is beige brick
+and the block of windows
+is bordered by grey stone.
+there are two rows of windows,
+and below each row are panels that appear brown,
+though they're orange in person.
+the top row of windows
+is reflecting some blue sky and clouds,
+while the bottom row is reflecting only cloud.
diff --git a/www/photo.causal.agency/2024-09-02/000054970018.txt b/www/photo.causal.agency/2024-09-02/000054970018.txt
new file mode 100644
index 00000000..db65ac6c
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970018.txt
@@ -0,0 +1,7 @@
+a row of three benches on the front lawn of a school building.
+each bench is separated by bushes and trees.
+they're made up of planks of wood painted blue
+bolted to concrete supports.
+the school building behind them is beige brick
+and there are window AC units installed
+in each window of the second floor.
diff --git a/www/photo.causal.agency/2024-09-02/000054970019.txt b/www/photo.causal.agency/2024-09-02/000054970019.txt
new file mode 100644
index 00000000..18b9c733
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970019.txt
@@ -0,0 +1,6 @@
+numerous stacks of wooden picnic tables
+on a lawn of grass in front of some trees.
+most of the stacks are piled three high,
+some four.
+the light coming through the branches and leaves
+of the trees in the background is glowing gold.
diff --git a/www/photo.causal.agency/2024-09-02/000054970021.txt b/www/photo.causal.agency/2024-09-02/000054970021.txt
new file mode 100644
index 00000000..2aac2c6f
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970021.txt
@@ -0,0 +1,11 @@
+fancy windows on the side of a school building.
+it's a repeating pattern of three windows
+in the middle of a house-shaped design
+of yellow panels on the second floor.
+the middle windows are higher than the other two.
+the triangle at the top of the window design
+is followed by the profile of the roof.
+below that, separated by a row of even short windows,
+are red panels.
+the upper windows are reflecting blue sky and clouds,
+while the lower red panels are reflecting trees and clouds.
diff --git a/www/photo.causal.agency/2024-09-02/000054970022.txt b/www/photo.causal.agency/2024-09-02/000054970022.txt
new file mode 100644
index 00000000..df959a2c
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970022.txt
@@ -0,0 +1,3 @@
+a light brown or beige brick school building
+with its rows of windows.
+the trim around the windows is sort of red-brown.
diff --git a/www/photo.causal.agency/2024-09-02/000054970023.txt b/www/photo.causal.agency/2024-09-02/000054970023.txt
new file mode 100644
index 00000000..976a4054
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970023.txt
@@ -0,0 +1,3 @@
+a haphazard pile of broken and discarded park benches.
+they're nice ones made of wooden slats and black metal supports.
+some are nice warm brown and others are more grey.
diff --git a/www/photo.causal.agency/2024-09-02/000054970029.txt b/www/photo.causal.agency/2024-09-02/000054970029.txt
new file mode 100644
index 00000000..53907b76
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/000054970029.txt
@@ -0,0 +1,6 @@
+the wall of some kind of concrete structure
+surrounding a big white metal tank.
+I think the wall is actually metal,
+but the outline of the structure is concrete.
+it's got a lot of interesting marks and texture on it.
+it's very hard to describe.
diff --git a/www/photo.causal.agency/2024-09-02/body b/www/photo.causal.agency/2024-09-02/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-09-02/film b/www/photo.causal.agency/2024-09-02/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-09-02/lens b/www/photo.causal.agency/2024-09-02/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-02/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-09-05/06124000003.txt b/www/photo.causal.agency/2024-09-05/06124000003.txt
new file mode 100644
index 00000000..7b3b59e9
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000003.txt
@@ -0,0 +1,6 @@
+looking up at the corner of a grey office building
+of at least 18 floors that we can see,
+on a clear blue sky.
+the sun is on the left,
+illuminating that side of the building brightly
+and leaving the other side in relative shadow.
diff --git a/www/photo.causal.agency/2024-09-05/06124000009.txt b/www/photo.causal.agency/2024-09-05/06124000009.txt
new file mode 100644
index 00000000..acee212d
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000009.txt
@@ -0,0 +1,5 @@
+a huge dark brown brick building
+that is part of a hospital complex.
+it is in the sun,
+but the smaller building behind the camera
+is casting a big shadow in the middle.
diff --git a/www/photo.causal.agency/2024-09-05/06124000010.txt b/www/photo.causal.agency/2024-09-05/06124000010.txt
new file mode 100644
index 00000000..d280e6b5
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000010.txt
@@ -0,0 +1,3 @@
+some really tall, thin trees
+with branches only really high up.
+their dark green leaves are against a bright sky.
diff --git a/www/photo.causal.agency/2024-09-05/06124000014.txt b/www/photo.causal.agency/2024-09-05/06124000014.txt
new file mode 100644
index 00000000..b45b6c58
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000014.txt
@@ -0,0 +1,4 @@
+nine small square windows in a grid
+on a brown brick wall.
+a conduit runs under them
+with a light on either side.
diff --git a/www/photo.causal.agency/2024-09-05/06124000017.txt b/www/photo.causal.agency/2024-09-05/06124000017.txt
new file mode 100644
index 00000000..8b4d2ae5
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000017.txt
@@ -0,0 +1,4 @@
+a closeup of some old walkup stairs.
+the metal frame of the staircase is rusted
+and the wooden steps are decaying.
+they were once painted but almost all of it has come off.
diff --git a/www/photo.causal.agency/2024-09-05/06124000018.txt b/www/photo.causal.agency/2024-09-05/06124000018.txt
new file mode 100644
index 00000000..0a184588
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000018.txt
@@ -0,0 +1,5 @@
+a covered driveway under a building.
+the near wall is in shadow
+but the sun is playing nicely on the far part,
+out from the covered portion.
+beyond is a tree and a wooden fence.
diff --git a/www/photo.causal.agency/2024-09-05/06124000023.txt b/www/photo.causal.agency/2024-09-05/06124000023.txt
new file mode 100644
index 00000000..655ad84e
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000023.txt
@@ -0,0 +1,5 @@
+a brick wall that has a hole in it,
+which is covered by wooden planks,
+except bricks are missing from below it,
+and generally don't seem to be holding together.
+all of that behind a chain link fence right in front of it.
diff --git a/www/photo.causal.agency/2024-09-05/06124000024.txt b/www/photo.causal.agency/2024-09-05/06124000024.txt
new file mode 100644
index 00000000..65ff67be
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000024.txt
@@ -0,0 +1,5 @@
+a grey utility door on the back of a building
+below ground level,
+surrounded by vegetation on all sides,
+and a little white wooden fence
+to the left.
diff --git a/www/photo.causal.agency/2024-09-05/06124000025.txt b/www/photo.causal.agency/2024-09-05/06124000025.txt
new file mode 100644
index 00000000..66cb1aaa
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000025.txt
@@ -0,0 +1,5 @@
+a metal box affixed to a light brick wall
+with the number 1786 in black raised lettering on it.
+the surface of the metal is rusting a light orange.
+just to the right of the box,
+a bundle of black wires climbs straight up the wall.
diff --git a/www/photo.causal.agency/2024-09-05/06124000026.txt b/www/photo.causal.agency/2024-09-05/06124000026.txt
new file mode 100644
index 00000000..765411fe
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000026.txt
@@ -0,0 +1,4 @@
+what may have been a storefront
+with the address 1107.
+it's a door set into the building
+behind a locked metal grate.
diff --git a/www/photo.causal.agency/2024-09-05/06124000027.txt b/www/photo.causal.agency/2024-09-05/06124000027.txt
new file mode 100644
index 00000000..1695ade9
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000027.txt
@@ -0,0 +1,3 @@
+a metal wire sphere
+suspended by two crossing metal bars
+below some trees.
diff --git a/www/photo.causal.agency/2024-09-05/06124000032.txt b/www/photo.causal.agency/2024-09-05/06124000032.txt
new file mode 100644
index 00000000..fb83f216
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000032.txt
@@ -0,0 +1,4 @@
+looking up at a concrete building in the sun.
+it's got a detailed pattern of depth
+around the windows.
+the sky is blue.
diff --git a/www/photo.causal.agency/2024-09-05/06124000033.txt b/www/photo.causal.agency/2024-09-05/06124000033.txt
new file mode 100644
index 00000000..fb83f216
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000033.txt
@@ -0,0 +1,4 @@
+looking up at a concrete building in the sun.
+it's got a detailed pattern of depth
+around the windows.
+the sky is blue.
diff --git a/www/photo.causal.agency/2024-09-05/06124000038.txt b/www/photo.causal.agency/2024-09-05/06124000038.txt
new file mode 100644
index 00000000..30c9eb53
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000038.txt
@@ -0,0 +1,4 @@
+a selfie in some dirty reflective surface I found on the street.
+I’m holding up an analog camera to my face
+and wearing a light coloured tshirt and green little shorts.
+there’s a blue car behind me.
diff --git a/www/photo.causal.agency/2024-09-05/06124000042.txt b/www/photo.causal.agency/2024-09-05/06124000042.txt
new file mode 100644
index 00000000..535d76b0
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000042.txt
@@ -0,0 +1,3 @@
+the side of an old brick factory building
+with a fire escape going up to one window.
+the building is in shadow and the sky is white.
diff --git a/www/photo.causal.agency/2024-09-05/06124000044.txt b/www/photo.causal.agency/2024-09-05/06124000044.txt
new file mode 100644
index 00000000..67ac2df5
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/06124000044.txt
@@ -0,0 +1,8 @@
+the back of something like a building over a garage,
+with a high short window
+and a door with some steps leading down.
+the building is mostly in shadow
+except an area on the left side of the window,
+where the sun must be reflecting off something,
+given the orientation of this particular building
+and the time of day.
diff --git a/www/photo.causal.agency/2024-09-05/body b/www/photo.causal.agency/2024-09-05/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-09-05/film b/www/photo.causal.agency/2024-09-05/film
new file mode 100644
index 00000000..7c8bf080
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/film
@@ -0,0 +1 @@
+Shanghai Color 400
diff --git a/www/photo.causal.agency/2024-09-05/lens b/www/photo.causal.agency/2024-09-05/lens
new file mode 100644
index 00000000..61e7cfd8
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-05/lens
@@ -0,0 +1 @@
+Yashica ML 28–85mm ƒ/3.5-4.5
diff --git a/www/photo.causal.agency/2024-09-07/body b/www/photo.causal.agency/2024-09-07/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-07/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2024-09-07/film b/www/photo.causal.agency/2024-09-07/film
new file mode 100644
index 00000000..bf3453cb
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-07/film
@@ -0,0 +1 @@
+Ilford HP5+ 400
diff --git a/www/photo.causal.agency/2024-09-07/lens b/www/photo.causal.agency/2024-09-07/lens
new file mode 100644
index 00000000..dcd0812c
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-07/lens
@@ -0,0 +1 @@
+Helios-44M-5 58mm ƒ/2
diff --git a/www/photo.causal.agency/2024-09-12/body b/www/photo.causal.agency/2024-09-12/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-12/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-09-12/film b/www/photo.causal.agency/2024-09-12/film
new file mode 100644
index 00000000..7c8bf080
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-12/film
@@ -0,0 +1 @@
+Shanghai Color 400
diff --git a/www/photo.causal.agency/2024-09-12/lens b/www/photo.causal.agency/2024-09-12/lens
new file mode 100644
index 00000000..b7c8829c
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-12/lens
@@ -0,0 +1 @@
+Yashica ML 42–75mm ƒ/3.5–4.5
diff --git a/www/photo.causal.agency/2024-09-14/body b/www/photo.causal.agency/2024-09-14/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-14/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-09-14/film b/www/photo.causal.agency/2024-09-14/film
new file mode 100644
index 00000000..0fb06431
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-14/film
@@ -0,0 +1 @@
+Fomapan Creative 200, Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-09-14/lens b/www/photo.causal.agency/2024-09-14/lens
new file mode 100644
index 00000000..b7c8829c
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-14/lens
@@ -0,0 +1 @@
+Yashica ML 42–75mm ƒ/3.5–4.5
diff --git a/www/photo.causal.agency/2024-09-15/body b/www/photo.causal.agency/2024-09-15/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-15/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-09-15/film b/www/photo.causal.agency/2024-09-15/film
new file mode 100644
index 00000000..c3e0e2b4
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-15/film
@@ -0,0 +1 @@
+Harman Phoenix 200, Ilford FP4 Plus 125
diff --git a/www/photo.causal.agency/2024-09-15/lens b/www/photo.causal.agency/2024-09-15/lens
new file mode 100644
index 00000000..b7c8829c
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-15/lens
@@ -0,0 +1 @@
+Yashica ML 42–75mm ƒ/3.5–4.5
diff --git a/www/photo.causal.agency/2024-09-22/body b/www/photo.causal.agency/2024-09-22/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-22/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-09-22/film b/www/photo.causal.agency/2024-09-22/film
new file mode 100644
index 00000000..44fd8200
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-22/film
@@ -0,0 +1 @@
+Shanghai Color 400, Ilford Delta 100
diff --git a/www/photo.causal.agency/2024-09-22/lens b/www/photo.causal.agency/2024-09-22/lens
new file mode 100644
index 00000000..d1617296
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-22/lens
@@ -0,0 +1 @@
+Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-09-28/body b/www/photo.causal.agency/2024-09-28/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-28/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-09-28/film b/www/photo.causal.agency/2024-09-28/film
new file mode 100644
index 00000000..186deeaa
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-28/film
@@ -0,0 +1 @@
+Wolfen NC500
diff --git a/www/photo.causal.agency/2024-09-28/lens b/www/photo.causal.agency/2024-09-28/lens
new file mode 100644
index 00000000..d1617296
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-28/lens
@@ -0,0 +1 @@
+Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-09-29/body b/www/photo.causal.agency/2024-09-29/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-29/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-09-29/film b/www/photo.causal.agency/2024-09-29/film
new file mode 100644
index 00000000..75a90c86
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-29/film
@@ -0,0 +1 @@
+Ilford FP4 Plus 125
diff --git a/www/photo.causal.agency/2024-09-29/lens b/www/photo.causal.agency/2024-09-29/lens
new file mode 100644
index 00000000..038971f7
--- /dev/null
+++ b/www/photo.causal.agency/2024-09-29/lens
@@ -0,0 +1 @@
+Takumar 35mm ƒ/3.5, Takumar 135mm ƒ/3.5
diff --git a/www/photo.causal.agency/2024-10-01/body b/www/photo.causal.agency/2024-10-01/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-01/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-10-01/film b/www/photo.causal.agency/2024-10-01/film
new file mode 100644
index 00000000..dd589471
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-01/film
@@ -0,0 +1 @@
+Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-10-01/lens b/www/photo.causal.agency/2024-10-01/lens
new file mode 100644
index 00000000..a88822d3
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-01/lens
@@ -0,0 +1 @@
+Takumar 135mm ƒ/3.5, Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-10-05/body b/www/photo.causal.agency/2024-10-05/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-05/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-10-05/film b/www/photo.causal.agency/2024-10-05/film
new file mode 100644
index 00000000..6bb4ba69
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-05/film
@@ -0,0 +1 @@
+Ferrania P30, Harman Phoenix
diff --git a/www/photo.causal.agency/2024-10-05/lens b/www/photo.causal.agency/2024-10-05/lens
new file mode 100644
index 00000000..d1617296
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-05/lens
@@ -0,0 +1 @@
+Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-10-06/body b/www/photo.causal.agency/2024-10-06/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-06/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-10-06/film b/www/photo.causal.agency/2024-10-06/film
new file mode 100644
index 00000000..968fca45
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-06/film
@@ -0,0 +1 @@
+CineStill 800T
diff --git a/www/photo.causal.agency/2024-10-06/lens b/www/photo.causal.agency/2024-10-06/lens
new file mode 100644
index 00000000..d1617296
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-06/lens
@@ -0,0 +1 @@
+Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-10-12/body b/www/photo.causal.agency/2024-10-12/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-12/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-10-12/film b/www/photo.causal.agency/2024-10-12/film
new file mode 100644
index 00000000..7c8bf080
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-12/film
@@ -0,0 +1 @@
+Shanghai Color 400
diff --git a/www/photo.causal.agency/2024-10-12/lens b/www/photo.causal.agency/2024-10-12/lens
new file mode 100644
index 00000000..87eda797
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-12/lens
@@ -0,0 +1 @@
+Yashica MC 35–70mm ƒ/3.5–4.5
diff --git a/www/photo.causal.agency/2024-10-17/body b/www/photo.causal.agency/2024-10-17/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-17/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-10-17/film b/www/photo.causal.agency/2024-10-17/film
new file mode 100644
index 00000000..fb690ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-17/film
@@ -0,0 +1 @@
+Fomapan Creative 200
diff --git a/www/photo.causal.agency/2024-10-17/lens b/www/photo.causal.agency/2024-10-17/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-17/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-10-20/body b/www/photo.causal.agency/2024-10-20/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-20/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2024-10-20/film b/www/photo.causal.agency/2024-10-20/film
new file mode 100644
index 00000000..7c8bf080
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-20/film
@@ -0,0 +1 @@
+Shanghai Color 400
diff --git a/www/photo.causal.agency/2024-10-20/lens b/www/photo.causal.agency/2024-10-20/lens
new file mode 100644
index 00000000..cf233451
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-20/lens
@@ -0,0 +1 @@
+Helios 44M-5 58mm ƒ/2, SMC Takumar 35mm ƒ/3.5
diff --git a/www/photo.causal.agency/2024-10-23/body b/www/photo.causal.agency/2024-10-23/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-23/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-10-23/film b/www/photo.causal.agency/2024-10-23/film
new file mode 100644
index 00000000..7c8bf080
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-23/film
@@ -0,0 +1 @@
+Shanghai Color 400
diff --git a/www/photo.causal.agency/2024-10-23/lens b/www/photo.causal.agency/2024-10-23/lens
new file mode 100644
index 00000000..abcaed38
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-23/lens
@@ -0,0 +1 @@
+Super-Takumar 135mm ƒ/3.5, Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-10-27/body b/www/photo.causal.agency/2024-10-27/body
new file mode 100644
index 00000000..eafb759d
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-27/body
@@ -0,0 +1 @@
+Praktica MTL3
diff --git a/www/photo.causal.agency/2024-10-27/film b/www/photo.causal.agency/2024-10-27/film
new file mode 100644
index 00000000..ad59eb5e
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-27/film
@@ -0,0 +1 @@
+Reflx Lab 800T
diff --git a/www/photo.causal.agency/2024-10-27/lens b/www/photo.causal.agency/2024-10-27/lens
new file mode 100644
index 00000000..d1617296
--- /dev/null
+++ b/www/photo.causal.agency/2024-10-27/lens
@@ -0,0 +1 @@
+Pentacon 50mm ƒ/1.8
diff --git a/www/photo.causal.agency/2024-11-02/body b/www/photo.causal.agency/2024-11-02/body
new file mode 100644
index 00000000..6a2a5ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-02/body
@@ -0,0 +1 @@
+Yashica FX-2
diff --git a/www/photo.causal.agency/2024-11-02/film b/www/photo.causal.agency/2024-11-02/film
new file mode 100644
index 00000000..cea1eb40
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-02/film
@@ -0,0 +1 @@
+Kodak Portra 800 (shot at 1600)
diff --git a/www/photo.causal.agency/2024-11-02/lens b/www/photo.causal.agency/2024-11-02/lens
new file mode 100644
index 00000000..13f1fc49
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-02/lens
@@ -0,0 +1 @@
+Yashica DSB 50mm ƒ/1.9
diff --git a/www/photo.causal.agency/2024-11-06/body b/www/photo.causal.agency/2024-11-06/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-06/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-11-06/film b/www/photo.causal.agency/2024-11-06/film
new file mode 100644
index 00000000..7c8bf080
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-06/film
@@ -0,0 +1 @@
+Shanghai Color 400
diff --git a/www/photo.causal.agency/2024-11-06/lens b/www/photo.causal.agency/2024-11-06/lens
new file mode 100644
index 00000000..f4270bba
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-06/lens
@@ -0,0 +1 @@
+Yashica ML 50mm ƒ/2
diff --git a/www/photo.causal.agency/2024-11-09/body b/www/photo.causal.agency/2024-11-09/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-09/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-11-09/film b/www/photo.causal.agency/2024-11-09/film
new file mode 100644
index 00000000..fb690ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-09/film
@@ -0,0 +1 @@
+Fomapan Creative 200
diff --git a/www/photo.causal.agency/2024-11-09/lens b/www/photo.causal.agency/2024-11-09/lens
new file mode 100644
index 00000000..f4270bba
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-09/lens
@@ -0,0 +1 @@
+Yashica ML 50mm ƒ/2
diff --git a/www/photo.causal.agency/2024-11-12/body b/www/photo.causal.agency/2024-11-12/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-12/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-11-12/film b/www/photo.causal.agency/2024-11-12/film
new file mode 100644
index 00000000..cf9df85c
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-12/film
@@ -0,0 +1 @@
+Flic Film Elektra 100 (Kodak Aerocolor IV)
diff --git a/www/photo.causal.agency/2024-11-12/lens b/www/photo.causal.agency/2024-11-12/lens
new file mode 100644
index 00000000..31116f95
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-12/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm ƒ/1.7
diff --git a/www/photo.causal.agency/2024-11-16/body b/www/photo.causal.agency/2024-11-16/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-16/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-11-16/film b/www/photo.causal.agency/2024-11-16/film
new file mode 100644
index 00000000..c0f6ee30
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-16/film
@@ -0,0 +1 @@
+Flic Film Elektra 100 (Kodak Aerocolor IV), Harman Phoenix 200
diff --git a/www/photo.causal.agency/2024-11-16/lens b/www/photo.causal.agency/2024-11-16/lens
new file mode 100644
index 00000000..31116f95
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-16/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm ƒ/1.7
diff --git a/www/photo.causal.agency/2024-11-18/body b/www/photo.causal.agency/2024-11-18/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-18/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-11-18/film b/www/photo.causal.agency/2024-11-18/film
new file mode 100644
index 00000000..ada88ac3
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-18/film
@@ -0,0 +1 @@
+Ferrania P30
diff --git a/www/photo.causal.agency/2024-11-18/lens b/www/photo.causal.agency/2024-11-18/lens
new file mode 100644
index 00000000..31116f95
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-18/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm ƒ/1.7
diff --git a/www/photo.causal.agency/2024-11-23/body b/www/photo.causal.agency/2024-11-23/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-23/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-11-23/film b/www/photo.causal.agency/2024-11-23/film
new file mode 100644
index 00000000..d198f26d
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-23/film
@@ -0,0 +1 @@
+Ferrania P33
diff --git a/www/photo.causal.agency/2024-11-23/lens b/www/photo.causal.agency/2024-11-23/lens
new file mode 100644
index 00000000..f4270bba
--- /dev/null
+++ b/www/photo.causal.agency/2024-11-23/lens
@@ -0,0 +1 @@
+Yashica ML 50mm ƒ/2
diff --git a/www/photo.causal.agency/2024-12-21/body b/www/photo.causal.agency/2024-12-21/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-12-21/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-12-21/film b/www/photo.causal.agency/2024-12-21/film
new file mode 100644
index 00000000..fb690ad8
--- /dev/null
+++ b/www/photo.causal.agency/2024-12-21/film
@@ -0,0 +1 @@
+Fomapan Creative 200
diff --git a/www/photo.causal.agency/2024-12-21/lens b/www/photo.causal.agency/2024-12-21/lens
new file mode 100644
index 00000000..3bee8822
--- /dev/null
+++ b/www/photo.causal.agency/2024-12-21/lens
@@ -0,0 +1 @@
+Yashica ML 50mm ƒ/2, Yashica DSB 28mm ƒ/2.8
diff --git a/www/photo.causal.agency/2024-12-28/body b/www/photo.causal.agency/2024-12-28/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2024-12-28/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2024-12-28/film b/www/photo.causal.agency/2024-12-28/film
new file mode 100644
index 00000000..ad59eb5e
--- /dev/null
+++ b/www/photo.causal.agency/2024-12-28/film
@@ -0,0 +1 @@
+Reflx Lab 800T
diff --git a/www/photo.causal.agency/2024-12-28/lens b/www/photo.causal.agency/2024-12-28/lens
new file mode 100644
index 00000000..a64ba4b7
--- /dev/null
+++ b/www/photo.causal.agency/2024-12-28/lens
@@ -0,0 +1 @@
+Yashica DSB 28mm f/2.8
diff --git a/www/photo.causal.agency/2025-01-18/body b/www/photo.causal.agency/2025-01-18/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-01-18/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-01-18/film b/www/photo.causal.agency/2025-01-18/film
new file mode 100644
index 00000000..c20afa1a
--- /dev/null
+++ b/www/photo.causal.agency/2025-01-18/film
@@ -0,0 +1 @@
+Reflx Lab 400D
diff --git a/www/photo.causal.agency/2025-01-18/lens b/www/photo.causal.agency/2025-01-18/lens
new file mode 100644
index 00000000..10ce84b5
--- /dev/null
+++ b/www/photo.causal.agency/2025-01-18/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7, Yashica DSB 135mm f/2.8
diff --git a/www/photo.causal.agency/2025-01-26/body b/www/photo.causal.agency/2025-01-26/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-01-26/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-01-26/film b/www/photo.causal.agency/2025-01-26/film
new file mode 100644
index 00000000..0d5a24a4
--- /dev/null
+++ b/www/photo.causal.agency/2025-01-26/film
@@ -0,0 +1 @@
+Street Candy ATM400
diff --git a/www/photo.causal.agency/2025-01-26/lens b/www/photo.causal.agency/2025-01-26/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-01-26/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-02-08/body b/www/photo.causal.agency/2025-02-08/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-08/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-02-08/film b/www/photo.causal.agency/2025-02-08/film
new file mode 100644
index 00000000..6b8ba9dc
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-08/film
@@ -0,0 +1 @@
+Kodak Portra 800
diff --git a/www/photo.causal.agency/2025-02-08/lens b/www/photo.causal.agency/2025-02-08/lens
new file mode 100644
index 00000000..08cc1075
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-08/lens
@@ -0,0 +1 @@
+Yashica ML 42-75mm f/3.5-4.5
diff --git a/www/photo.causal.agency/2025-02-11/body b/www/photo.causal.agency/2025-02-11/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-11/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2025-02-11/film b/www/photo.causal.agency/2025-02-11/film
new file mode 100644
index 00000000..fb690ad8
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-11/film
@@ -0,0 +1 @@
+Fomapan Creative 200
diff --git a/www/photo.causal.agency/2025-02-11/lens b/www/photo.causal.agency/2025-02-11/lens
new file mode 100644
index 00000000..25cae06f
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-11/lens
@@ -0,0 +1 @@
+Helios-44M-5 58mm f/2
diff --git a/www/photo.causal.agency/2025-02-17/body b/www/photo.causal.agency/2025-02-17/body
new file mode 100644
index 00000000..1828b2a2
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-17/body
@@ -0,0 +1 @@
+Zenit-122
diff --git a/www/photo.causal.agency/2025-02-17/film b/www/photo.causal.agency/2025-02-17/film
new file mode 100644
index 00000000..8cf5c5b8
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-17/film
@@ -0,0 +1 @@
+Fomapan Classic 100
diff --git a/www/photo.causal.agency/2025-02-17/lens b/www/photo.causal.agency/2025-02-17/lens
new file mode 100644
index 00000000..25cae06f
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-17/lens
@@ -0,0 +1 @@
+Helios-44M-5 58mm f/2
diff --git a/www/photo.causal.agency/2025-02-23/body b/www/photo.causal.agency/2025-02-23/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-23/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-02-23/film b/www/photo.causal.agency/2025-02-23/film
new file mode 100644
index 00000000..75a90c86
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-23/film
@@ -0,0 +1 @@
+Ilford FP4 Plus 125
diff --git a/www/photo.causal.agency/2025-02-23/lens b/www/photo.causal.agency/2025-02-23/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-23/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-02-25/body b/www/photo.causal.agency/2025-02-25/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-25/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-02-25/film b/www/photo.causal.agency/2025-02-25/film
new file mode 100644
index 00000000..ea743873
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-25/film
@@ -0,0 +1 @@
+Flic Film Elektra (Kodak Aerocolor)
diff --git a/www/photo.causal.agency/2025-02-25/lens b/www/photo.causal.agency/2025-02-25/lens
new file mode 100644
index 00000000..033bc748
--- /dev/null
+++ b/www/photo.causal.agency/2025-02-25/lens
@@ -0,0 +1 @@
+Yashica ML 50mm f/2
diff --git a/www/photo.causal.agency/2025-03-15/body b/www/photo.causal.agency/2025-03-15/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-15/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-03-15/film b/www/photo.causal.agency/2025-03-15/film
new file mode 100644
index 00000000..58e2f25c
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-15/film
@@ -0,0 +1 @@
+Kodak Ektar 100, Shanghai Color 400
diff --git a/www/photo.causal.agency/2025-03-15/lens b/www/photo.causal.agency/2025-03-15/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-15/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-03-16/body b/www/photo.causal.agency/2025-03-16/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-16/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-03-16/film b/www/photo.causal.agency/2025-03-16/film
new file mode 100644
index 00000000..c2518f1e
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-16/film
@@ -0,0 +1 @@
+Shanghai Color 400, Fomapan Creative 200
diff --git a/www/photo.causal.agency/2025-03-16/lens b/www/photo.causal.agency/2025-03-16/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-16/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-03-18/body b/www/photo.causal.agency/2025-03-18/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-18/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-03-18/film b/www/photo.causal.agency/2025-03-18/film
new file mode 100644
index 00000000..fb690ad8
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-18/film
@@ -0,0 +1 @@
+Fomapan Creative 200
diff --git a/www/photo.causal.agency/2025-03-18/lens b/www/photo.causal.agency/2025-03-18/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-18/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-03-19/body b/www/photo.causal.agency/2025-03-19/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-19/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-03-19/film b/www/photo.causal.agency/2025-03-19/film
new file mode 100644
index 00000000..ada88ac3
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-19/film
@@ -0,0 +1 @@
+Ferrania P30
diff --git a/www/photo.causal.agency/2025-03-19/lens b/www/photo.causal.agency/2025-03-19/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-19/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-03-22/body b/www/photo.causal.agency/2025-03-22/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-22/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-03-22/film b/www/photo.causal.agency/2025-03-22/film
new file mode 100644
index 00000000..618ed9ba
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-22/film
@@ -0,0 +1 @@
+Ferrania P30, Shanghai GP3 100, AristaEDU Ultra 400
diff --git a/www/photo.causal.agency/2025-03-22/lens b/www/photo.causal.agency/2025-03-22/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-22/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/2025-03-23/body b/www/photo.causal.agency/2025-03-23/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-23/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/2025-03-23/film b/www/photo.causal.agency/2025-03-23/film
new file mode 100644
index 00000000..0352ae38
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-23/film
@@ -0,0 +1 @@
+Fujifilm Acros 100 II, Rollei Superpan 200
diff --git a/www/photo.causal.agency/2025-03-23/lens b/www/photo.causal.agency/2025-03-23/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/2025-03-23/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/c35/body b/www/photo.causal.agency/c35/body
new file mode 100644
index 00000000..3676b877
--- /dev/null
+++ b/www/photo.causal.agency/c35/body
@@ -0,0 +1 @@
+Konica C35 Automatic
diff --git a/www/photo.causal.agency/c35/lens b/www/photo.causal.agency/c35/lens
new file mode 100644
index 00000000..3fef9a43
--- /dev/null
+++ b/www/photo.causal.agency/c35/lens
@@ -0,0 +1 @@
+Konica Hexanon 38mm f/2.8
diff --git a/www/photo.causal.agency/fx-3/body b/www/photo.causal.agency/fx-3/body
new file mode 100644
index 00000000..0962ee7d
--- /dev/null
+++ b/www/photo.causal.agency/fx-3/body
@@ -0,0 +1 @@
+Yashica FX-3
diff --git a/www/photo.causal.agency/fx-3/lens b/www/photo.causal.agency/fx-3/lens
new file mode 100644
index 00000000..eaab4375
--- /dev/null
+++ b/www/photo.causal.agency/fx-3/lens
@@ -0,0 +1 @@
+Carl Zeiss Planar T* 50mm f/1.7
diff --git a/www/photo.causal.agency/gear.html b/www/photo.causal.agency/gear.html
new file mode 100644
index 00000000..e058d341
--- /dev/null
+++ b/www/photo.causal.agency/gear.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Photography Equipment</title>
+<style>
+html { color: #bbb; background-color: black; font-family: monospace; }
+body { max-width: 76ch; margin: auto; }
+</style>
+
+<h1>Photography Equipment</h1>
+<p>
+this is a (probably incomplete) list of equipment I use to Do Photography.
+
+<h2>Cameras</h2>
+<ul>
+<li>Yashica FX-3 (every day)
+<li>Konica C35 Automatic (Hexanon 38mm f/2.8) (every day)
+<li>Praktica MTL3 (probably on loan to a friend)
+<li>Zenit-122
+<li>Yashica FX-2
+</ul>
+
+<h2>Lenses</h2>
+<ul>
+<li>Carl Zeis Planar T* 50mm f/1.7 (FX-3 default)
+<li>Yashica DSB 50mm f/1.9 (FX-2 kit lens)
+<li>Helios-44M-5 58mm f/2 (Zenit-122 kit lens)
+<li>Pentacon 50mm f/1.8 (MTL3 kit lens)
+<li>Osawa MC 70-210mm f/4-5 (C/Y)
+<li>Takumar SMC 35mm f/3.5
+<li>Super-Takumar 135mm f/3.5
+<li>Yashica ML 28-85mm f/3.5-4.5 (wonky focus at 28mm)
+<li>Yashica ML 42-75mm f/3.5-4.5
+<li>Yashica MC 35-70mm f/3.5-4.5 (bad aperture)
+<li>Yashica ML 50mm f/2 (sticky aperture)
+<li>Yashica DSB 28mm f/2.8
+<li>Yashica DSB 135mm f/2.8
+<li>Yashica ML Macro 55mm f/2.8
+<li>Yashica ML 28mm f/2.8
+<li>Yashica ML 75-150mm f/4
+</ul>
+
+<h2>Flash</h2>
+<ul>
+<li>Reflx Lab Simple Flash
+<li>Starblitz 318M
+</ul>
+
+<h2>Tripod</h2>
+<ul>
+<li>Sirui Traveler 5C
+</ul>
+
+<h2>Scanning</h2>
+<ul>
+<li>Filmomat SmartConvert
+<li>Canon EOS Rebel SL3
+<li>Yashica ML Macro 55mm f/2.8 (at f/11)
+<li>Yashica 13mm extension tube (also have 20mm and 27mm)
+<li>Urth C/Y-EF adapter
+<li>Skier CS-700 copy stand
+<li>Valoi 135 film holder
+<li>CineStill CS-Lite
+<li>the box the CS-Lite came in
+</ul>
diff --git a/www/photo.causal.agency/generate.sh b/www/photo.causal.agency/generate.sh
new file mode 100644
index 00000000..83a3128b
--- /dev/null
+++ b/www/photo.causal.agency/generate.sh
@@ -0,0 +1,284 @@
+#!/bin/sh
+set -eu
+
+mkdir -p static/preview static/thumbnail
+
+resize() {
+	local photo=$1 size=$2 output=$3
+	if ! test -f $output; then
+		# FIXME: convert complains about not understanding XML
+		echo $output >&2
+		convert $photo -auto-orient -thumbnail $size $output 2>/dev/null ||:
+	fi
+}
+
+preview() {
+	local photo=$1
+	local preview=preview/${photo##*/}
+	resize $photo 1500000@ static/$preview
+	echo $preview
+}
+
+thumbnail() {
+	local photo=$1
+	local thumbnail=thumbnail/${photo##*/}
+	resize $photo 60000@ static/$thumbnail
+	echo $thumbnail
+}
+
+encode() {
+	sed '
+		s/&/\&amp;/g
+		s/</\&lt;/g
+		s/"/\&quot;/g
+	' "$@"
+}
+
+page_title() {
+	case $1 in
+		(leader) echo 'Film Leader';;
+		(20*) date -j -f '%F' $1 '+%B %e, %Y';;
+		(0*) echo Roll $(dc -e "${1}p");;
+	esac
+}
+
+page_head() {
+	local page=$1
+	local title=$(page_title $page)
+	local date body lens film note
+
+	if test -f $page/date; then
+		date=$(sed 's/\([0-9]\)-\([0-9]\)/\1–\2/g' $page/date | encode)
+	fi
+	if test -f $page/body; then
+		body=$(encode $page/body)
+	fi
+	if test -f $page/lens; then
+		lens=$(
+			sed '
+				s,f/,ƒ/,g
+				s/\([0-9]\)-\([0-9]\)/\1–\2/g
+			' $page/lens |
+			encode
+		)
+	else
+		lens=$(
+			identify -format '%[EXIF:LensModel]' \
+				$page/$(ls -1 $page | head -n 1) 2>/dev/null |
+			sed '
+				s/\([A-Z]\)\([0-9]\)/\1 \2/
+				s,f/,ƒ/,
+				s/\([0-9]\)-\([0-9]\)/\1–\2/g
+			' |
+			encode
+		)
+	fi
+	if test -f $page/film; then
+		film=$(encode $page/film)
+	fi
+	if test -f $page/note; then
+		note=$(encode $page/note)
+	fi
+
+	cat <<-EOF
+	<!DOCTYPE html>
+	<meta charset="utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<link rel="alternate" type="application/atom+xml" href="../feed.atom">
+	<title>${title}</title>
+	<style>
+	html { color: #bbb; background-color: black; font-family: monospace; }
+	p { text-align: center; }
+	figure { margin: 1em; padding-top: 0.5em; text-align: center; }
+	img { max-width: calc(100vw - 2.5em); max-height: calc(100vh - 2.5em); }
+	details { max-width: 78ch; margin: 0.5em auto; }
+	</style>
+	<h1>${title}</h1>
+	<p>${date:+📆 }${date:-} 📷 ${body:-}${body:+ 🔘 }${lens:-}${film:+ 🎞️ }${film:-}</p>
+	${note:+<p>}${note:-}${note:+</p>}
+	EOF
+}
+
+photo_info() {
+	local photo=$1
+	ExposureTime=
+	FNumber=
+	FocalLength=
+	PhotographicSensitivity=
+	eval $(
+		identify -format '%[EXIF:*]' $photo 2>/dev/null |
+		grep -E 'ExposureTime|FNumber|FocalLength|PhotographicSensitivity' |
+		sed 's/^exif://'
+	)
+}
+
+photo_id() {
+	local photo=$1
+	photo=${photo##*/}
+	photo=${photo%%.*}
+	echo $photo
+}
+
+page_photo() {
+	local photo=$1 preview=$2 description=$3
+	photo_info $photo
+	cat <<-EOF
+	<figure id="$(photo_id $photo)">
+		<a href="${photo##*/}">
+	EOF
+	if test -f $description; then
+		cat <<-EOF
+			<img src="../${preview}" alt="$(encode $description)">
+		EOF
+	else
+		cat <<-EOF
+			<img src="../${preview}">
+		EOF
+	fi
+	cat <<-EOF
+		</a>
+		<figcaption>
+	EOF
+	if test -n "${ExposureTime}"; then
+		cat <<-EOF
+			${ExposureTime} ·
+			ƒ/$(bc -S 1 -e ${FNumber}) ·
+			$(bc -e ${FocalLength}) mm ·
+			${PhotographicSensitivity} ISO
+		EOF
+	fi
+	if test -f $description; then
+		cat <<-EOF
+			<details>
+				<summary>description</summary>
+				$(encode $description)
+			</details>
+		EOF
+	fi
+	cat <<-EOF
+		</figcaption>
+	</figure>
+	EOF
+}
+
+index_head() {
+	cat <<-EOF
+	<!DOCTYPE html>
+	<meta charset="utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<link rel="alternate" type="application/atom+xml" href="feed.atom">
+	<title>Photos</title>
+	<style>
+	html { color: #bbb; background-color: black; font-family: sans-serif; }
+	a { text-decoration: none; color: inherit; }
+	</style>
+	EOF
+}
+
+index_page() {
+	local date=$1 root=${2:-}
+	cat <<-EOF
+	<h1><a href="${root}${root:+/}${date}/">$(page_title $date)</a></h1>
+	EOF
+}
+
+index_photo() {
+	local date=$1 photo=$2 thumbnail=$3 root=${4:-}
+	cat <<-EOF
+	<a href="${root}${root:+/}${date}/#$(photo_id $photo)">
+		<img src="${root}${root:+/}${thumbnail}">
+	</a>
+	EOF
+}
+
+Root=https://photo.causal.agency
+
+atom_head() {
+	local updated=$(date -u '+%FT%TZ')
+	cat <<-EOF
+	<?xml version="1.0" encoding="utf-8"?>
+	<feed xmlns="http://www.w3.org/2005/Atom">
+	<title>Photos</title>
+	<author><name>june</name><email>june@causal.agency</email></author>
+	<link href="${Root}"/>
+	<link rel="self" href="${Root}/feed.atom"/>
+	<id>${Root}/</id>
+	<updated>${updated}</updated>
+	EOF
+}
+
+atom_entry_head() {
+	local date=$1
+	local updated=$(
+		date -ju -f '%s' $(stat -f '%m' static/${date}/index.html) '+%FT%TZ'
+	)
+	cat <<-EOF
+	<entry>
+	<title>$(page_title $date)</title>
+	<link href="${Root}/${date}/"/>
+	<id>${Root}/${date}/</id>
+	<updated>${updated}</updated>
+	<content type="html">
+	EOF
+}
+
+atom_entry_tail() {
+	cat <<-EOF
+	</content>
+	</entry>
+	EOF
+}
+
+atom_tail() {
+	cat <<-EOF
+	</feed>
+	EOF
+}
+
+set --
+for entry in 20* 0*; do
+	mkdir -p static/${entry}
+	page=static/${entry}/index.html
+	if ! test -f $page; then
+		echo $page >&2
+		page_head $entry >$page
+		for photo in ${entry}/*.[Jj][Pp][Gg]; do
+			preview=$(preview $photo)
+			if ! test -f static/${photo}; then
+				ln $photo static/${photo}
+			fi
+			page_photo $photo $preview ${photo%.[Jj][Pp][Gg]}.txt >>$page
+		done
+	fi
+	set -- $entry "$@"
+done
+
+mkdir -p static/leader
+page=static/leader/index.html
+if [ leader -nt $page ]; then
+	echo $page >&2
+	page_head leader >$page
+	for photo in leader/*.[Jj][Pp][Gg]; do
+		preview=$(preview $photo)
+		if ! test -f static/${photo}; then
+			ln $photo static/${photo}
+		fi
+		page_photo $photo $preview xxx >>$page
+	done
+fi
+
+echo static/index.html >&2
+index_head >static/index.html
+echo static/feed.atom >&2
+atom_head >static/feed.atom
+for date; do
+	index_page $date >>static/index.html
+	atom_entry_head $date >>static/feed.atom
+	for photo in ${date}/*.[Jj][Pp][Gg]; do
+		thumbnail=$(thumbnail $photo)
+		index_photo $date $photo $thumbnail >>static/index.html
+		index_photo $date $photo $thumbnail $Root | encode >>static/feed.atom
+	done
+	atom_entry_tail >>static/feed.atom
+done
+atom_tail >>static/feed.atom
diff --git a/www/photo.causal.agency/mastodon.sh b/www/photo.causal.agency/mastodon.sh
new file mode 100644
index 00000000..1eaa1114
--- /dev/null
+++ b/www/photo.causal.agency/mastodon.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+set -eu
+
+Instance=https://tilde.zone
+Root=${1:-static}
+
+if ! test -f app.json; then
+	echo 'No app.json!' >&2
+	exit 1
+fi
+chmod 600 app.json
+
+if ! test -f token.json; then
+	client_id=$(jq -r .client_id app.json)
+	client_secret=$(jq -r .client_secret app.json)
+	echo "Please open ${Instance}/oauth/authorize?client_id=${client_id}&scope=write&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code"
+	printf 'Enter code: '
+	read -r code
+	curl -Ss -X POST \
+		-F 'grant_type=authorization_code' \
+		-F "client_id=${client_id}" \
+		-F "client_secret=${client_secret}" \
+		-F 'redirect_uri=urn:ietf:wg:oauth:2.0:oob' \
+		-F "code=${code}" \
+		${Instance}/oauth/token >token.json
+fi
+chmod 600 token.json
+
+access_token=$(jq -r .access_token token.json)
+
+if ! test -f posted.txt; then
+	touch posted.txt
+fi
+
+photo=$(
+	find ${Root} -type f -path '*/0*/*.jpg' |
+	sort | comm -13 posted.txt - | head -n 1
+)
+preview=${Root}/preview/${photo##*/}
+
+media_id=$(
+	curl -Ss -X POST \
+		-H "Authorization: Bearer ${access_token}" \
+		-F "file=@${preview}" \
+		${Instance}/api/v2/media |
+	jq -r .id
+)
+
+curl -Ss -X POST \
+	-H "Authorization: Bearer ${access_token}" \
+	-F "media_ids[]=${media_id}" \
+	${Instance}/api/v1/statuses >/dev/null
+
+echo ${photo} >>posted.txt
diff --git a/www/photo.causal.agency/rsync.sh b/www/photo.causal.agency/rsync.sh
new file mode 100644
index 00000000..957911d2
--- /dev/null
+++ b/www/photo.causal.agency/rsync.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+set -eu
+
+sh generate.sh
+rsync -av static/ scout:/var/www/photo.causal.agency
diff --git a/www/photo.causal.agency/trips.html b/www/photo.causal.agency/trips.html
new file mode 100644
index 00000000..d65aeaef
--- /dev/null
+++ b/www/photo.causal.agency/trips.html
@@ -0,0 +1,365 @@
+<!DOCTYPE html>
+<title>Photo Trips</title>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<style>
+body {
+	font-family: sans-serif;
+	line-height: 1.5em;
+	max-width: 52ch;
+}
+input, button, select { font-size: 100%; }
+form {
+	display: grid;
+	grid-template-columns: auto 1fr;
+	gap: 0.5em 1ch;
+}
+input[type="number"] { width: 5ch; }
+#trip-lens { width: 100%; }
+#lens-length { width: 7ch; }
+#lens-aperture { width: 8ch; }
+</style>
+
+<section id="rolls">
+<h1>Rolls</h1>
+<ul>
+</ul>
+
+<form>
+<label for="roll-body">Camera:</label>
+<select id="roll-body" class="body" required>
+</select>
+<label for="roll-film">Film:</label>
+<input id="roll-film" list="films" required>
+<span>Exposures:</span>
+<span>
+<input id="roll-36" type="radio" name="roll-exposures" value="36" checked>
+<label for="roll-36">36</label>
+<input id="roll-27" type="radio" name="roll-exposures" value="27">
+<label for="roll-27">27</label>
+<input id="roll-24" type="radio" name="roll-exposures" value="24">
+<label for="roll-24">24</label>
+<input id="roll-12" type="radio" name="roll-exposures" value="12">
+<label for="roll-12">12</label>
+</span>
+<button type="button" onclick="loadRoll()">Load</button>
+</form>
+
+<datalist id="films">
+	<option>Ferrania P30 80</option>
+	<option>Flic Film Elektra 100</option>
+	<option>Ilford FP4 Plus 125</option>
+	<option>Fomapan Creative 200</option>
+	<option>Harman Phoenix 200</option>
+	<option>Shanghai Color 400</option>
+	<option>Reflx Lab 800T</option>
+</datalist>
+</section>
+
+<section id="trips">
+<h1>Trips</h1>
+
+<form>
+<label for="trip-date">Date:</label>
+<input id="trip-date" type="date" required>
+<label for="trip-body">Camera:</label>
+<select id="trip-body" class="body" onchange="setTripBody()" required>
+</select>
+<label for="trip-lens">Lens:</label>
+<select id="trip-lens" required>
+</select>
+<label for="trip-film">Film:</label>
+<input id="trip-film" readonly required>
+<label for="trip-first">Exposures:</label>
+<span>
+<input id="trip-first" type="number" required min="0" max="36">
+–
+<input id="trip-last" type="number" required min="0" max="36">
+</span>
+<label for="trip-note">Note:</label>
+<input id="trip-note">
+<button type="button" onclick="addTrip()">Record</button>
+</form>
+
+<ul>
+</ul>
+</section>
+
+<section id="bodies">
+<h1>Cameras</h1>
+<ul>
+</ul>
+
+<form>
+	<label for="body-name">Name:</label>
+	<input id="body-name" required>
+	<label for="body-mount">Mount:</label>
+	<input id="body-mount" list="mounts" required>
+	<button type="button" onclick="addBody()">Add</button>
+</form>
+
+<datalist id="mounts">
+	<option>Contax/Yashica</option>
+	<option>M42</option>
+</datalist>
+</section>
+
+<section id="lenses">
+<h1>Lenses</h1>
+<ul>
+</ul>
+
+<form>
+	<label for="lens-name">Name:</label>
+	<input id="lens-name" required>
+	<label for="lens-length">Focal length:</label>
+	<span><input id="lens-length" required pattern="[0-9-]+">mm</span>
+	<label for="lens-aperture">Aperture:</label>
+	<span>ƒ/<input id="lens-aperture" required pattern="[0-9.-]+"></span>
+	<label for="lens-mount">Mount:</label>
+	<input id="lens-mount" list="mounts" required>
+	<button type="button" onclick="addLens()">Add</button>
+</form>
+</section>
+
+<script>
+let bodies = JSON.parse(localStorage.getItem("bodies")) || [];
+let lenses = JSON.parse(localStorage.getItem("lenses")) || [];
+let rolls = JSON.parse(localStorage.getItem("rolls")) || {};
+let trips = JSON.parse(localStorage.getItem("trips")) || [];
+let nextId = +localStorage.getItem("nextId") || 1;
+
+document.getElementById("trip-date").valueAsDate = new Date();
+
+function removeButton(onclick) {
+	let remove = document.createElement("a");
+	remove.appendChild(document.createTextNode("⛔"));
+	remove.onclick = onclick;
+	return remove;
+}
+
+function setBodies() {
+	localStorage.setItem("bodies", JSON.stringify(bodies));
+	let ul = document.querySelector("#bodies > ul");
+	let selects = document.querySelectorAll("select.body");
+	ul.innerHTML = "";
+	selects.forEach(select => select.innerHTML = "");
+	for (let [index, body] of bodies.entries()) {
+		let li = document.createElement("li");
+		li.appendChild(document.createTextNode(`
+			${body.name} (${body.mount})
+		`));
+		li.appendChild(removeButton(removeBody.bind(null, index)));
+		ul.appendChild(li);
+		for (let select of selects) {
+			let option = document.createElement("option");
+			option.appendChild(document.createTextNode(body.name));
+			select.appendChild(option);
+		}
+	}
+}
+setBodies();
+
+function endashify(str) {
+	return str.replaceAll("-", "–");
+}
+function lensString(lens) {
+	return `
+		${lens.name}
+		${endashify(lens.focalLength)}mm
+		ƒ/${endashify(lens.aperture)}
+	`.replace(/\s+/g, " ").trim();
+}
+
+function setLenses() {
+	localStorage.setItem("lenses", JSON.stringify(lenses));
+	let ul = document.querySelector("#lenses > ul");
+	ul.innerHTML = "";
+	for (let [index, lens] of lenses.entries()) {
+		let li = document.createElement("li");
+		li.appendChild(document.createTextNode(`
+			${lensString(lens)} (${lens.mount})
+		`));
+		li.appendChild(removeButton(removeLens.bind(null, index)));
+		ul.appendChild(li);
+	}
+}
+setLenses();
+
+function setRolls() {
+	localStorage.setItem("rolls", JSON.stringify(rolls));
+	let ul = document.querySelector("#rolls > ul");
+	ul.innerHTML = "";
+	for (body in rolls) {
+		let roll = rolls[body];
+		let li = document.createElement("li");
+		li.appendChild(document.createTextNode(`
+			${body}: ${roll.film} (${roll.used}/${roll.exposures})
+		`));
+		if (roll.used == roll.exposures) {
+			li.style.textDecoration = "line-through";
+		}
+		ul.appendChild(li);
+	}
+}
+setRolls();
+
+function setTrips() {
+	localStorage.setItem("trips", JSON.stringify(trips));
+	let ul = document.querySelector("#trips > ul");
+	ul.innerHTML = "";
+	let tripsByRoll = Object.groupBy(trips, trip => trip.rollId);
+	for (let rollId = nextId - 1; rollId > 0; --rollId) {
+		let rollTrips = tripsByRoll[rollId];
+		if (!rollTrips) continue;
+		let rollLi = document.createElement("li");
+		let rollB = document.createElement("b");
+		rollB.appendChild(document.createTextNode(rollTrips[0].film));
+		rollLi.appendChild(rollB);
+		rollLi.appendChild(document.createTextNode(` (${rollTrips[0].body})`));
+		let body = bodies.find(body => body.name == rollTrips[0].body);
+		let rollUl = document.createElement("ul");
+		for (let [index, trip] of rollTrips.entries()) {
+			let li = document.createElement("li");
+			let b = document.createElement("b");
+			b.appendChild(document.createTextNode(trip.date));
+			li.appendChild(b);
+			li.appendChild(document.createTextNode(
+				`: ${trip.firstExposure}–${trip.lastExposure}`
+			));
+			if (
+				body.mount != body.name &&
+				(!index || trip.lens != rollTrips[index-1].lens)
+			) {
+				li.appendChild(document.createElement("br"));
+				li.appendChild(document.createTextNode(trip.lens));
+			}
+			if (trip.note) {
+				li.appendChild(document.createElement("br"));
+				li.appendChild(document.createTextNode(`“${trip.note}”`));
+			}
+			rollUl.appendChild(li);
+		}
+		rollLi.appendChild(rollUl);
+		ul.appendChild(rollLi);
+	}
+}
+setTrips();
+
+function setTripBody() {
+	let bodyName = document.getElementById("trip-body").value;
+	let body = bodies.find(body => body.name == bodyName);
+	let select = document.getElementById("trip-lens");
+	select.innerHTML = "";
+	for (lens of lenses.filter(lens => lens.mount == body.mount)) {
+		let option = document.createElement("option");
+		option.appendChild(document.createTextNode(lensString(lens)));
+		select.appendChild(option);
+	}
+	let lastTrip = trips.findLast(trip => trip.body == bodyName);
+	if (lastTrip) {
+		select.value = lastTrip.lens;
+	}
+	let roll = rolls[body.name];
+	if (roll) {
+		document.getElementById("trip-film").value = roll.film;
+		let next = (roll.used > 0 ? roll.used + 1 : roll.used);
+		document.getElementById("trip-first").value = next;
+		document.getElementById("trip-last").value = next;
+	} else {
+		document.getElementById("trip-film").value = "";
+		document.getElementById("trip-first").value = "";
+		document.getElementById("trip-last").value = "";
+	}
+}
+setTripBody();
+
+function clearForm(form) {
+	let inputs = form.querySelectorAll("input");
+	for (input of inputs) {
+		if (input.type == "radio") continue;
+		input.value = null;
+	}
+}
+
+function addBody() {
+	let form = document.querySelector("#bodies > form");
+	if (!form.checkValidity()) return;
+	let name = document.getElementById("body-name").value;
+	let mount = document.getElementById("body-mount").value;
+	bodies.push({ name, mount });
+	setBodies();
+	clearForm(form);
+}
+
+function removeBody(index) {
+	let body = bodies[index];
+	if (!confirm(`Are you sure you want to remove ${body.name}?`)) {
+		return;
+	}
+	bodies.splice(index, 1);
+	delete rolls[body.name];
+	setBodies();
+	setRolls();
+}
+
+function addLens() {
+	let form = document.querySelector("#lenses > form");
+	if (!form.checkValidity()) return;
+	let name = document.getElementById("lens-name").value;
+	let focalLength = document.getElementById("lens-length").value;
+	let aperture = document.getElementById("lens-aperture").value;
+	let mount = document.getElementById("lens-mount").value;
+	lenses.push({ name, focalLength, aperture, mount });
+	setLenses();
+	clearForm(form);
+}
+
+function removeLens(index) {
+	let lens = lenses[index];
+	if (!confirm(`Are you sure you want to remove ${lensString(lens)}?`)) {
+		return;
+	}
+	lenses.splice(index, 1);
+	setLenses();
+	setTripBody();
+}
+
+function loadRoll() {
+	let form = document.querySelector("#rolls > form");
+	if (!form.checkValidity()) return;
+	let body = document.getElementById("roll-body").value;
+	let film = document.getElementById("roll-film").value;
+	let exposures = +new FormData(form).get("roll-exposures");
+	rolls[body] = { id: nextId++, film, exposures, used: 0 };
+	localStorage.setItem("nextId", nextId);
+	setRolls();
+	clearForm(form);
+	setTripBody();
+}
+
+function addTrip() {
+	let form = document.querySelector("#trips > form");
+	if (!form.checkValidity()) return;
+	let date = document.getElementById("trip-date").value;
+	let body = document.getElementById("trip-body").value;
+	let lens = document.getElementById("trip-lens").value;
+	let film = document.getElementById("trip-film").value;
+	let firstExposure = +document.getElementById("trip-first").value;
+	let lastExposure = +document.getElementById("trip-last").value;
+	let note = document.getElementById("trip-note").value;
+	let trip = {
+		date, body, lens, film, rollId: rolls[body].id,
+		firstExposure, lastExposure, note
+	};
+	trips.push(trip);
+	rolls[body].used = lastExposure;
+	setTrips();
+	setRolls();
+	document.getElementById("trip-date").valueAsDate = new Date();
+	document.getElementById("trip-note").value = "";
+	setTripBody();
+}
+
+</script>
diff --git a/www/temp.causal.agency/.gitignore b/www/temp.causal.agency/.gitignore
new file mode 100644
index 00000000..e31ee94e
--- /dev/null
+++ b/www/temp.causal.agency/.gitignore
@@ -0,0 +1 @@
+up
diff --git a/www/temp.causal.agency/Makefile b/www/temp.causal.agency/Makefile
new file mode 100644
index 00000000..a69a2b48
--- /dev/null
+++ b/www/temp.causal.agency/Makefile
@@ -0,0 +1,15 @@
+CGI_BIN = /var/www/cgi-bin
+
+CFLAGS += -std=c11 -Wall -Wextra -Wpedantic $$(pkg-config --cflags kcgi)
+LDLIBS = -static $$(pkg-config --static --libs kcgi-html)
+
+up:
+
+clean:
+	rm -f up
+
+install: up
+	install up ${CGI_BIN}/up
+
+uninstall:
+	rm -f ${CGI_BIN}/up
diff --git a/www/temp.causal.agency/up.c b/www/temp.causal.agency/up.c
new file mode 100644
index 00000000..561a8901
--- /dev/null
+++ b/www/temp.causal.agency/up.c
@@ -0,0 +1,193 @@
+/* Copyright (C) 2020  June McEnroe <june@causal.agency>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sysexits.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <kcgi.h>
+#include <kcgihtml.h>
+
+static const char *Page = "up";
+static const struct kvalid Key = { NULL, "file" };
+
+static enum kcgi_err head(struct kreq *req, enum khttp http, enum kmime mime) {
+	return khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[http])
+		|| khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[mime]);
+}
+
+static enum kcgi_err fail(struct kreq *req, enum khttp http) {
+	return head(req, http, KMIME_TEXT_PLAIN)
+		|| khttp_body(req)
+		|| khttp_printf(req, "%s\n", khttps[http]);
+}
+
+static int dir = -1;
+static const char *upload(const char *ext, void *ptr, size_t len) {
+	static char name[256];
+	snprintf(
+		name, sizeof(name), "%jx%08x%s%s",
+		(intmax_t)time(NULL), arc4random(),
+		(ext && ext[0] != '.' ? "." : ""), (ext ? ext : "")
+	);
+	int fd = openat(dir, name, O_CREAT | O_EXCL | O_WRONLY, 0644);
+	if (fd < 0) {
+		warn("%s", name);
+		return NULL;
+	}
+	ssize_t n = write(fd, ptr, len);
+	int error = close(fd);
+	if (n < 0 || error) {
+		warn("%s", name);
+		return NULL;
+	}
+	return name;
+}
+
+static enum kcgi_err handle(struct kreq *req) {
+	if (req->page) return fail(req, KHTTP_404);
+
+	if (req->method == KMETHOD_GET) {
+		struct khtmlreq html;
+		struct khtmlreq *h = &html;
+		return head(req, KHTTP_200, KMIME_TEXT_HTML)
+			|| khttp_body(req)
+			|| khtml_open(h, req, 0)
+			|| khtml_elem(h, KELEM_DOCTYPE)
+			|| khtml_elem(h, KELEM_TITLE)
+			|| khtml_puts(h, "Upload")
+			|| khtml_closeelem(h, 1)
+			|| khtml_attr(
+				h, KELEM_FORM,
+				KATTR_METHOD, "post",
+				KATTR_ACTION, "",
+				KATTR_ENCTYPE, "multipart/form-data",
+				KATTR__MAX
+			)
+			|| khtml_attr(
+				h, KELEM_INPUT,
+				KATTR_TYPE, "file",
+				KATTR_NAME, Key.name,
+				KATTR__MAX
+			)
+			|| khtml_attr(
+				h, KELEM_INPUT,
+				KATTR_TYPE, "submit",
+				KATTR_VALUE, "Upload",
+				KATTR__MAX
+			)
+			|| khtml_close(h);
+
+	} else if (req->method == KMETHOD_POST) {
+		struct kpair *field = req->fieldmap[0];
+		if (!field || !field->valsz) return fail(req, KHTTP_400);
+
+		const char *ext = strrchr(field->file, '.');
+		const char *name = upload(ext, field->val, field->valsz);
+		if (!name) return fail(req, KHTTP_507);
+
+		return head(req, KHTTP_303, KMIME_TEXT_PLAIN)
+			|| khttp_head(req, kresps[KRESP_LOCATION], "/%s", name)
+			|| khttp_body(req)
+			|| khttp_puts(req, name);
+
+	} else if (req->method == KMETHOD_PUT) {
+		struct kpair *field = req->fields;
+		if (!field || !field->valsz) return fail(req, KHTTP_400);
+
+		const char *ext = req->suffix;
+		if (!ext[0]) ext = strrchr(field->file, '.');
+		const char *name = upload(ext, field->val, field->valsz);
+		if (!name) return fail(req, KHTTP_507);
+
+		return head(req, KHTTP_200, KMIME_TEXT_PLAIN)
+			|| khttp_body(req)
+			|| khttp_printf(
+				req, "%s://%s/%s\n", kschemes[req->scheme], req->host, name
+			);
+
+	} else {
+		return fail(req, KHTTP_405);
+	}
+}
+
+int main(int argc, char *argv[]) {
+	int error;
+	const char *path = (argc > 1 ? argv[1] : ".");
+	dir = open(path, O_DIRECTORY);
+	if (dir < 0) err(EX_NOINPUT, "%s", path);
+
+#ifdef __OpenBSD__
+	error = unveil(path, "wc");
+	if (error) err(EX_OSERR, "unveil");
+#endif
+
+	if (!khttp_fcgi_test()) {
+#ifdef __OpenBSD__
+		error = pledge("stdio wpath cpath proc", NULL);
+		if (error) err(EX_OSERR, "pledge");
+#endif
+
+		struct kreq req;
+		error = khttp_parse(&req, &Key, 1, &Page, 1, 0);
+		if (error) errx(EX_PROTOCOL, "khttp_parse: %s", kcgi_strerror(error));
+
+#ifdef __OpenBSD__
+		error = pledge("stdio wpath cpath", NULL);
+		if (error) err(EX_OSERR, "pledge");
+#endif
+
+		error = handle(&req);
+		if (error) errx(EX_PROTOCOL, "%s", kcgi_strerror(error));
+		khttp_free(&req);
+		return EX_OK;
+	}
+
+#ifdef __OpenBSD__
+	error = pledge("stdio wpath cpath unix sendfd recvfd proc", NULL);
+	if (error) err(EX_OSERR, "pledge");
+#endif
+
+	struct kfcgi *fcgi;
+	error = khttp_fcgi_init(&fcgi, &Key, 1, &Page, 1, 0);
+	if (error) errx(EX_CONFIG, "khttp_fcgi_init: %s", kcgi_strerror(error));
+
+#ifdef __OpenBSD__
+	error = pledge("stdio wpath cpath recvfd", NULL);
+	if (error) err(EX_OSERR, "pledge");
+#endif
+
+	for (
+		struct kreq req;
+		!(error = khttp_fcgi_parse(fcgi, &req));
+		khttp_free(&req)
+	) {
+		error = handle(&req);
+		if (error && error != KCGI_HUP) break;
+	}
+	if (error != KCGI_EXIT) {
+		errx(EX_PROTOCOL, "khttp_fcgi_parse: %s", kcgi_strerror(error));
+	}
+	khttp_fcgi_free(fcgi);
+}
diff --git a/www/text.causal.agency/.gitignore b/www/text.causal.agency/.gitignore
index 37dd51ef..66b3e637 100644
--- a/www/text.causal.agency/.gitignore
+++ b/www/text.causal.agency/.gitignore
@@ -1,2 +1,4 @@
 *.txt
+colb
 feed.atom
+igp
diff --git a/www/text.causal.agency/010-irc-suite.7 b/www/text.causal.agency/010-irc-suite.7
index 5f799785..515a30ab 100644
--- a/www/text.causal.agency/010-irc-suite.7
+++ b/www/text.causal.agency/010-irc-suite.7
@@ -358,11 +358,37 @@ If you try any of this software
 and have feedback,
 let me know in
 .Li #ascii.town
-on freenode
+on tilde.chat
 or by email.
 And of course,
 patches are always welcome.
 .
+.Ss Update: scooper
+Somehow I had the motivation
+to create a web interface for litterbox:
+.Xr scooper 1 .
+It can be used either as CGI
+or as a FastCGI worker,
+and I used the excellent
+.Xr kcgi 3
+library for it.
+.
+.Pp
+The main advantage of this interface
+is that you can click on a search result
+to be brought to its context in the log viewer.
+I also added an option to
+.Xr litterbox 1
+to provide a corresponding scooper link
+in response to its query interface.
+.
+.Pp
+A small demo of scooper is hosted at
+.Aq Lk "https://causal.agency/scooper/" .
+It publicly logs the
+.Li #litterbox
+channel on tilde.chat.
+.
 .Sh SEE ALSO
 .Bl -item -compact
 .It
@@ -373,6 +399,10 @@ patches are always welcome.
 .Lk "https://git.causal.agency/catgirl" catgirl
 .It
 .Lk "https://www.sqlite.org/fts5.html" "SQLite FTS5 Extension"
+.It
+.Lk "https://git.causal.agency/scooper" scooper
+.It
+.Lk "https://kristaps.bsd.lv/kcgi/" kcgi
 .El
 .
 .Sh AUTHORS
diff --git a/www/text.causal.agency/011-libretls.7 b/www/text.causal.agency/011-libretls.7
new file mode 100644
index 00000000..c29c325e
--- /dev/null
+++ b/www/text.causal.agency/011-libretls.7
@@ -0,0 +1,220 @@
+.Dd August  9, 2020
+.Dt LIBRETLS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm LibreTLS
+.Nd libtls for OpenSSL
+.
+.Sh DESCRIPTION
+This is a sort of announcement post about LibreTLS,
+my port of libtls from LibreSSL to OpenSSL.
+If you've wanted to try any of my software
+but have been unable to because of LibreSSL,
+LibreTLS is an option that will likely work for you.
+I'm including instructions
+for building it and my IRC software
+on Debian as an example,
+since manually installing libraries
+is less straightforward than it could be.
+.
+.Pp
+libtls is
+.Do
+a new TLS library,
+designed to make it easier to write foolproof applications
+.Dc .
+It was developed as part of LibreSSL,
+.Ox Ap s
+fork of OpenSSL,
+and is implemented against their version of libssl.
+It provides a nice high-level API
+for TLS sockets,
+with functions like
+.Xr tls_connect 3 ,
+.Xr tls_read 3
+and
+.Xr tls_write 3 .
+This is a vast improvement over libssl's
+confusing mess of an API!
+Its relative obscurity is a real shame
+for C programmers.
+.
+.Pp
+An obvious cause of its obscurity
+is that it is tied to LibreSSL.
+Although LibreSSL is available
+for platforms other than
+.Ox ,
+it conflicts with OpenSSL
+so is difficult to install alongside it
+and is often not packaged at all.
+Additionally,
+even if a user manually installs LibreSSL,
+libtls is likely not to work on some distros
+due to its hardcoded CA bundle file path.
+.
+.Pp
+Since libtls is implemented against libssl,
+which originates in OpenSSL,
+it should be possible to use libtls with it.
+This is what I set out to do in LibreTLS.
+I started by importing the sources
+from a LibreSSL-portable release,
+then worked on porting the portions
+that were incompatible with OpenSSL.
+.
+.Pp
+The simpler changes just involved
+replacing internal struct field accesses
+with public APIs.
+libtls accesses libssl internals
+using a hack to get the header files
+to declare private struct fields,
+and for basically no reason.
+The bigger changes involved
+reimplementing some functions
+which only exist in LibreSSL,
+but these were still quite small.
+I also imported the necessary compatibility functions
+from LibreSSL's libcrypto
+and adapated the autotools build files
+to produce only a libtls
+which depends on OpenSSL.
+.
+.Pp
+Along the way
+I decided to make one small behavioural change
+in order for LibreTLS to be more likely
+to work for everyone.
+I removed the hardcoded CA file path
+and changed the default configuration
+to use OpenSSL's default CA paths,
+which include a CA directory.
+This seems to be the preferred CA source
+on systems such as Debian,
+where the default CA file path doesn't exist.
+.
+.Pp
+I think the reason LibreSSL
+wants to avoid using a CA directory
+is so that it can fully load the CA file
+once before being sandboxed.
+However,
+using OpenSSL's default configuration,
+the CA file will still be loaded immediately
+if it exists.
+If it doesn't exist,
+sandboxed applications
+will fail when trying to
+load certificates from the directory,
+but unsandboxed applications
+will work just fine.
+Since LibreSSL's libtls
+would fail either way,
+I think the new behaviour
+is an improvement.
+.
+.Pp
+Another advantage of separating libtls from LibreSSL
+is that it is unencumbered by OpenSSL's
+awkward double-license,
+both of which are incompatible with the GPL.
+libtls is all new ISC-licensed code,
+and future versions of OpenSSL (3.0)
+will be released under the Apache 2.0 license,
+which is compatible with GPLv3.
+In the future,
+GPL software will be able to link with
+libtls and OpenSSL without additional permissions.
+.
+.Pp
+It's also worth noting that LibreSSL
+likely will not be able to import any code
+from future versions of OpenSSL,
+since Apache 2.0 is on
+.Ox Ap s
+license shitlist.
+LLVM is also slowly changing their license
+to Apache 2.0,
+so it'll be interesting to see what
+.Ox
+does.
+.
+.Ss Installing Manually
+To install LibreTLS on Debian,
+for example,
+fetch a release tarball from
+.Lk https://causal.agency/libretls/
+and install the build dependencies:
+.Bd -literal -offset indent
+sudo apt-get install build-essential libssl-dev pkgconf
+.Ed
+.
+.Pp
+.Xr pkgconf 1
+isn't a dependency of LibreTLS itself,
+but it's how my software
+configures its build
+for a dependency on libtls.
+The usual build steps
+will install the library:
+.Bd -literal -offset indent
+\&./configure
+make all
+sudo make install
+.Ed
+.
+.Pp
+The library will be installed in
+.Pa /usr/local/lib
+by default,
+and you need to make sure
+the dynamic linker
+will be able to find it there.
+On Debian,
+.Pa /usr/local/lib
+already appears in
+.Pa /etc/ld.so.conf.d/libc.conf ,
+but on other systems
+you'll probably need to add it to either
+.Pa /etc/ld.so.conf
+or a new file such as
+.Pa /etc/ld.so.conf.d/local.conf .
+Once the library is installed
+and the path is configured,
+the linker cache needs to be refreshed:
+.Bd -literal -offset indent
+sudo ldconfig
+.Ed
+.
+.Pp
+You'll probably also need to set
+.Ev PKG_CONFIG_PATH
+for the configure scripts
+of my software:
+.Bd -literal -offset indent
+PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure
+.Ed
+.
+.Pp
+On
+.Fx ,
+LibreTLS and some of my IRC software
+can be installed from my own
+.Lk https://git.causal.agency/ports/ "ports tree"
+.
+.Sh SEE ALSO
+.Bl -item -compact
+.It
+.Lk https://git.causal.agency/libretls/about LibreTLS
+.It
+.Lk https://man.openbsd.org/tls_init.3 "libtls API documentation"
+.El
+.
+.Pp
+Another alternative libtls implementation,
+.Lk https://sr.ht/~mcf/libtls-bearssl/ "libtls-bearssl"
+.
+.Sh AUTHORS
+.An June Bug Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/012-inability.7 b/www/text.causal.agency/012-inability.7
new file mode 100644
index 00000000..d352143b
--- /dev/null
+++ b/www/text.causal.agency/012-inability.7
@@ -0,0 +1,39 @@
+.Dd November 26, 2020
+.Dt INABILITY 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Inability
+.Nd losing the ability to create
+.
+.Sh DESCRIPTION
+For often weeks, sometimes months at a time,
+I lose the ability to write new code.
+I can still make fixes
+and little cleanups
+in my existing projects,
+but if I try to work on something new,
+nothing happens.
+I can't get anything done.
+.
+.Pp
+I think it's now been
+over 3 months
+since I've created anything.
+I don't know what to do about it.
+In the past I've eventually
+regained the ability to code,
+but it's unclear to me how or why.
+I also don't know what
+I should be doing instead.
+Writing code is the only hobby
+I've ever really developed,
+so without it I basically
+don't do anything.
+.
+.Pp
+Does this happen to anyone else?
+How do you cope?
+.
+.Sh AUTHORS
+.Mt june@causal.agency
diff --git a/www/text.causal.agency/013-hot-tips.7 b/www/text.causal.agency/013-hot-tips.7
new file mode 100644
index 00000000..63b6e353
--- /dev/null
+++ b/www/text.causal.agency/013-hot-tips.7
@@ -0,0 +1,156 @@
+.Dd December  2, 2020
+.Dt HOT-TIPS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm hot tips
+.Nd from my files
+.
+.Sh DESCRIPTION
+This is a short list of tips
+from my configuration files and code
+that might be useful.
+.
+.Ss Shell
+.Bl -tag -width Ds
+.It CDPATH=:~
+This is useful if you sometimes type,
+for example,
+.Ql cd src/bin
+wanting to go to
+.Pa ~/src/bin
+but you aren't in
+.Pa ~ .
+If the path doesn't exist
+in the current directory,
+.Ic cd
+will try it in
+.Pa ~
+as well.
+.
+.It alias ls='LC_COLLATE=C ls'
+This makes it so that
+.Xr ls 1
+lists files in ASCIIbetical order,
+which puts capitalized names like
+.Pa README
+and
+.Pa Makefile
+first.
+.
+.It git config --global commit.verbose true
+Not shell but close enough.
+This makes it so the entire diff is shown
+below the usual summary
+in the editor for a
+.Xr git-commit(1)
+message.
+Useful for doing a quick review
+of what you're committing.
+.El
+.
+.Ss (neo)vim
+.Bl -tag -width Ds
+.It set inccommand=nosplit
+This is the only
+.Xr nvim 1
+feature I really care about
+aside from the improved defaults.
+This provides a live preview of what a
+.Ic :s
+substitution command will do.
+It makes it much easier to
+write complex substitutions.
+.
+.It nmap <leader>s vip:sort<CR>
+This mapping sorts the lines of a paragraph,
+or block of text separated by blank lines.
+I use this a lot to sort
+#include directives.
+.
+.It nmap <leader>S $vi{:sort<CR>
+Similar to the last mapping,
+this one sorts lines inside braces.
+I use this to sort
+switch statement cases
+or array initializers.
+.
+.It nmap <leader>a m':0/^#include <<CR>:nohlsearch<CR>O#include <
+I use this mapping to add new
+#include directives,
+usually followed by
+.Ic <leader>s
+and
+.Ic ''
+to sort them
+and return to where I was.
+.
+.It nmap <leader>d :0delete<CR>:0read !date +'.Dd \e%B \e%e, \e%Y'<CR>
+I use this to replace the first line of
+.Xr mdoc 7
+files with the current date.
+.El
+.
+.Ss C
+.Bl -tag -width Ds
+.It #define Q(...) #__VA_ARGS__
+This is what I've started using
+to quote things like SQL statements
+or HTML fragments in C.
+Anything that happens to be valid C tokens,
+which is most code,
+can be quoted this way.
+Macros are not expanded
+inside the quoted part.
+You can embed (matched) quotes
+without having to escape them.
+Whitespace gets collapsed,
+so you can write nicely formatted multi-line SQL
+that doesn't mess up your debug logging,
+for example.
+.Bd -literal -offset indent
+const char *sql = Q(
+	INSERT OR IGNORE INTO names (nick, user, host)
+	VALUES (:nick, :user, :host);
+);
+.Ed
+.
+.It #define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit
+I use this macro to declare bitflag enums.
+It takes advantage of
+auto-incrementing enum items
+so you don't need to set the values manually.
+You also get constants
+for both the bit index
+and the flag value
+for each item.
+.Bd -literal -offset indent
+enum Attr {
+	BIT(Bold),
+	BIT(Reverse),
+	BIT(Italic),
+	BIT(Underline),
+};
+.Ed
+.Pp
+For example,
+defines
+.Sy ItalicBit = 2
+and
+.Sy Italic = 1 << 2 .
+Ignore the extraneous constants.
+.
+.It typedef int FnType(const char *str, size_t len);
+You can just typedef function types!
+It annoys me more than it probably should
+that everyone writes ugly
+function pointer typedefs.
+Just stick
+.Sy typedef
+on the front of a function declaration
+and use
+.Vt FnType * .
+.El
+.
+.Sh AUTHORS
+.Mt june@causal.agency
diff --git a/www/text.causal.agency/014-using-vi.7 b/www/text.causal.agency/014-using-vi.7
new file mode 100644
index 00000000..e6a6a7a0
--- /dev/null
+++ b/www/text.causal.agency/014-using-vi.7
@@ -0,0 +1,135 @@
+.Dd January 11, 2021
+.Dt USING-VI 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Using vi
+.Nd simpler tools
+.
+.Sh DESCRIPTION
+Happy new year
+and hello from
+.Xr vi 1 !
+I'm in the mood to post something
+but not in the mood for
+.Dq social
+media.
+This one will probably be short.
+.
+.Pp
+Yesterday I was trying to work on sandboxing
+.Xr catgirl 1
+(that's the IRC client I work on)
+with
+.Xr pledge 2
+and
+.Xr unveil 2
+on
+.Ox ,
+as suggested by the maintainer of its port.
+I've done similar things before,
+but only on server software
+rather than user software.
+.
+.Pp
+Anyway I was in
+.Xr ssh 1
+to my
+.Ox
+VM
+.Po
+sadly I don't currently have any hardware to run
+.Ox
+on
+.Pc
+using my usual editor,
+which is
+.Xr nvim 1 .
+I'm honestly not very thrilled
+with what neovim is doing lately,
+but the cleaned up defaults
+make my configuration files happier.
+.
+.Pp
+The real problem with
+.Xr nvim 1 ,
+though,
+is that it's laggy as hell on
+.Ox .
+There is significant delay
+on every single keystroke,
+as if I'm typing remotely to a server
+on the other side of the world,
+but this is on a local VM!
+.
+.Pp
+So I did the only reasonable thing:
+I typed
+.Sy :qa
+followed by
+.Sy vi .
+The difference was astonishing.
+Typing and editing suddenly felt
+.Em physical
+again.
+(I put that in italics even though I know it won't render.)
+Not only was it a vast improvement over
+.Xr nvim 1
+in
+.Xr ssh 1
+in a VM,
+it was a marked improvement over
+.Xr nvim 1
+running locally and natively.
+.
+.Pp
+Now obviously
+.Xr vi 1
+doesn't have all the bells and whistles
+of newer editors,
+but of course the core editing model
+that makes
+.Xr vim 1
+and
+.Xr nvim 1
+so good is there,
+and in purer form,
+I think.
+The
+.Xr vi 1
+manual page
+is feasible to just sit down and read,
+and learn everything there is to know about the editor.
+I set up a basic configuration
+and got coding.
+.Bd -literal -offset indent
+export EXINIT='set ai ic sm sw=4 ts=4'
+.Ed
+.
+.Pp
+After I finished my
+.Xr pledge 2
+and
+.Xr unveil 2
+patch,
+I was so pleased with
+.Xr vi 1
+that I kept on using it
+yesterday and today
+for other work,
+and obviously to write this post.
+Despite the lack of editor amenities,
+its responsiveness and simplicity
+are enough to make using it
+.Em comfortable
+and perhaps
+.Em cosy .
+I'm not sure I'll ever use
+.Xr vi 1
+full-time,
+but for now I am much less likely
+to launch
+.Xr nvim 1 .
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/015-reusing-tags.7 b/www/text.causal.agency/015-reusing-tags.7
new file mode 100644
index 00000000..19546496
--- /dev/null
+++ b/www/text.causal.agency/015-reusing-tags.7
@@ -0,0 +1,155 @@
+.Dd January 17, 2021
+.Dt REUSING-TAGS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm reusing tags
+.Nd beyond ctags
+.
+.Sh DESCRIPTION
+I've tried to start writing this post a couple times now
+and I keep getting bogged down in explanations,
+so I'm just going to tell you
+about some cool things I did
+and hope they make sense.
+.
+.Pp
+When I wrote my first syntax highlighter,
+I decided that function definitions
+should have anchor links,
+because line number anchor links
+are entirely useless
+if you expect the file to change at all.
+Since the syntax highlighter
+was somewhat deliberately just a big pile of regex,
+I hacked in more regex to try
+to identify function and type definitions.
+It wasn't elegant and it didn't always work well.
+It did work though,
+and I found the links very useful.
+.
+.Pp
+Recently I was thinking about
+the lexer generator
+.Xr lex 1
+and decided to
+rewrite the syntax highlighter
+using it.
+Really syntax highlighting
+is no different than lexical analysis.
+I ran into a problem though,
+trying to preserve my anchor link function,
+because really that should involve
+some amount of parsing.
+Trying to port my regex hacks to
+.Xr lex 1
+made the lexers way more complicated
+and less reliable,
+so I gave up on it for a while.
+.
+.Pp
+And then,
+probably in the shower,
+I realized I was approaching it
+completely from the wrong direction.
+There's already a tool that does what I want,
+and I already use it:
+.Xr ctags 1 .
+All I need to do is use its output
+to insert anchor links
+into my syntax highlighter output.
+In an afternoon I wrote
+.Xr htagml 1 ,
+which loads tag definitions for its input file,
+then scans through the input for where they match.
+It can either HTML-escape
+the input as it goes,
+or use already formatted HTML
+being piped into it from a syntax highlighter.
+.
+.Pp
+The result is three simple tools
+working together to accomplish
+what a more complex tool
+couldn't reliably achieve.
+I'm very pleased with it,
+and I've updated my site and cgit
+to use the new
+.Xr lex 1 Ns -based
+highlighter,
+.Xr ctags 1
+and
+.Xr htagml 1 .
+I'm currently missing a lexer for
+.Xr sh 1 ,
+but I plan to write it eventually.
+I also want to write a tool
+to generate tags for
+.Xr make 1 ,
+.Xr mdoc 7
+and perhaps
+.Xr sh 1 .
+The cool thing about generating more kinds of tags
+is that they'll not only improve
+the HTML output,
+they'll also be usable in my editor.
+.
+.Pp
+Speaking of generating different kinds of tags,
+I also wrote some scripts not too long ago
+for reading IETF RFCs offline.
+The plain text files are available to
+.Xr rsync 1 ,
+but they're hard to navigate on their own.
+By scanning the files for headings
+and generating tags,
+it allows jumping to sections using
+.Ic :ta
+or
+.Ic ^]
+in
+.Xr vi 1 .
+For
+.Xr nvim 1
+I also added an
+.Ic :RFC
+command to open an RFC by number
+and set up
+.Ic ^]
+to work optimally for them.
+.
+.Pp
+I'm still using
+.Xr vi 1
+for most of my editing,
+by the way.
+And of course
+.Xr ctags 1
+was made to work with it!
+Simple old tools
+are really doing it for me lately.
+.
+.Sh SEE ALSO
+.Bl -item -compact
+.It
+.Lk https://causal.agency/bin/htagml.html htagml
+.It
+.Lk https://causal.agency/bin/hilex.html hilex
+.It
+.Lk https://git.causal.agency/src/tree/doc/rfc rfctags
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Sh ADDENDUM
+.Xr catgirl 1 ,
+.Xr pounce 1 ,
+.Xr litterbox 1
+and
+.Xr scooper 1
+all have new releases,
+if you're using any of them.
+Also, this space is now
+available over gopher,
+if that's your sort of thing.
diff --git a/www/text.causal.agency/016-using-openbsd.7 b/www/text.causal.agency/016-using-openbsd.7
new file mode 100644
index 00000000..b843e3c3
--- /dev/null
+++ b/www/text.causal.agency/016-using-openbsd.7
@@ -0,0 +1,505 @@
+.Dd February 14, 2021
+.Dt USING-OPENBSD 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Using OpenBSD
+.Nd for real
+.
+.Sh DESCRIPTION
+Hello from
+.Ox !
+After wishing one too many times
+that I had a real BSD
+on a physical machine,
+I finally got around to
+just installing one on my
+mid-2014 MacBook Pro.
+I hadn't done it sooner
+because I didn't realize
+how easy it would be.
+It helped that I already had a
+.Dq Boot Camp
+partition with a disused Windows 8 install
+that I could replace.
+.
+.Pp
+I roughly followed an old jcs gist
+along with the
+.Ox
+Disk Setup guide.
+I'm once again happy
+that I bought a printer\(em
+they're very useful for instructions
+to install an operating system
+on your only usable computer.
+I set up encrypted softraid
+and the operating system
+installed smoothly.
+.
+.Pp
+Next I had to install rEFInd,
+since the default Mac boot manager
+is really not keen on booting much.
+Installing it requires using the
+macOS recovery partition these days.
+But there was a problem
+with my new boot menu:
+I was promised a picture of Puffy,
+and instead I just got some abstract coloured circles!
+Turns out a bunch of OS icons
+got removed from rEFInd at some point,
+and I had to rescue Puffy
+from the git history.
+.
+.Pp
+So I could happily boot
+.Ox
+by selecting Puffy,
+but I had no networking.
+I thought the wifi chip might be supported by
+.Xr bwfm 4 ,
+but I got unlucky and it's a BCM4360,
+which everything hates.
+Based on the jcs gist,
+I checked the list of hardware
+supported by the
+.Xr urtwn 4
+driver for a wifi dongle to order.
+Just having a clear list
+in the driver manual is wonderful.
+I went with the Edimax EW-7811Un v2,
+which I could get for around $20.
+It's nice and tiny,
+though it has a piercing blue LED
+(destroy all blue LEDs)
+which I had to cover with electrical tape.
+.
+.Pp
+I had to do one other thing
+before I could get it all working, though.
+When I had checked the
+.Xr urtwn 4
+hardware list,
+I had been looking at
+.Ox Ns -current ,
+but I had installed
+.Ox 6.8 ,
+and support for the v2 hardware
+I had bought was added after that release.
+So I downloaded a snapshot
+.Pa bsd.rd
+along with the
+.Xr urtwn 4
+firmware file
+to a USB drive
+and upgraded the system.
+.
+.Pp
+Connecting to wifi with
+.Xr ifconfig 8
+is a breeze, by the way,
+and then you just write the same thing to a
+.Xr hostname.if 5
+file to make it automatic.
+I wanted to use
+.Ox
+for exactly this reason:
+simple, consistent, cohesive, well-documented tools.
+.
+.Pp
+Finally, I got to configuring.
+The console is configured with
+.Xr wsconsctl 8 ,
+and similarly you can put the commands in
+.Xr wsconsctl.conf 5
+to have them run at boot.
+I added
+.Li display.brightness=50%
+to tone down the brightness,
+which is initially 100%,
+and
+.Li keyboard.backlight=0%
+to turn off those annoying lights.
+.Xr wsconsctl.conf 5
+is also where you can set
+trackpad settings if you're not using
+.Xr synaptics 4 .
+I ended up using:
+.Bd -literal -offset indent
+mouse1.tp.tapping=1
+mouse1.tp.scaling=0.2
+mouse1.reverse_scrolling=1
+.Ed
+.Pp
+This enables tapping with several fingers
+to simulate different mouse buttons,
+makes the cursor move at a reasonable speed
+and scrolling move in the right direction.
+I also set up my usual modified QWERTY layout.
+.
+.Pp
+For
+.Xr X 7
+I had enabled
+.Xr xenodm 1 ,
+which seems quite nice.
+It automatically prompts you to add your
+.Xr ssh 1
+keys to
+.Xr ssh-agent 1
+when you log in.
+One of the reasons I had not wanted
+to set up another graphical system
+is that I thought
+I would have to make too many choices,
+and that I would have to choose least bad options
+rather than actually good options,
+but
+.Ox
+already includes reasonable choices.
+I wanted to use
+.Xr cwm 1 ,
+so I started a basic
+.Pa .xsession
+file:
+.Bd -literal -offset indent
+\&. ~/.profile
+export LC_CTYPE=en_US.UTF-8
+xset r rate 175 m 5/4 0
+xmodmap ~/.config/X/modmap
+xrdb -load ~/.config/X/resources
+exec cwm -c ~/.config/cwm/cwmrc
+.Ed
+.
+.Pp
+The
+.Xr xset 1
+command sets keyboard repeat rate
+and mouse acceleration.
+I spent some time going through
+.Xr cwm 1 Ap s
+functions and writing up bindings
+that would get me something close enough
+to what I'm used to in macOS.
+Most importantly,
+putting everything on the 4 modifier (command key).
+.
+.Pp
+I also added key bindings on F1 and F2
+to adjust the brightness with
+.Xr xbacklight 1 ,
+and on F10, F11 and F12
+to adjust volume with
+.Xr sndioctl 1 .
+I'm not sure why the F keys
+just send regular F1, F2, etc.\&
+regardless of the Fn key.
+I don't use F keys for anything else though,
+so I'm not too concerned.
+Once again,
+.Xr sndioctl 1
+is such an easy straightforward tool:
+.Bd -literal -offset indent
+bind-key F10 "sndioctl output.mute=!"
+bind-key F11 "sndioctl output.level=-0.05"
+bind-key F12 "sndioctl output.level=+0.05"
+.Ed
+.
+.Pp
+For aesthetic configuration,
+I added a new output to my
+.Xr scheme 1
+colour scheme tool for
+.Xr X 7 Ns -style
+RGB and
+.Xr xterm 1
+resources.
+Normally I use the
+.Em Go Mono
+font,
+but since
+.Ox
+already includes
+.Em Luxi Mono ,
+which
+.Em Go Mono
+is based on,
+I used that.
+The most important configuration
+to make anything readable on a high-DPI display is:
+.Bd -literal -offset indent
+Xft.dpi: 144
+Xft.antialias: true
+Xft.hinting: false
+.Ed
+.
+.Pp
+I'm annoyed that I haven't found
+where these resources are actually documented.
+I would hope they'd be in
+.Xr Xft 3
+or something,
+but they're not.
+Anyway,
+turning off hinting
+seems absolutely necessary
+to prevent text from looking like garbage.
+.
+.Pp
+It seems that to get a reasonably sized cursor
+I need to install
+.Sy xcursor-dmz .
+I'd prefer if there wasn't this one
+extra package that I needed
+for a reasonable setup.
+Tangentially,
+I've never understood why
+the black versions of dmz cursors
+are called
+.Dq aa
+when it seems like that
+would stand for antialiasing
+or something.
+.Bd -literal -offset indent
+Xcursor.size: 64
+Xcursor.theme: dmz-aa
+.Ed
+.
+.Pp
+For a desktop background,
+I found a cute bitmap (little picture)
+of snowflakes already in the system
+and used colours from my usual scheme:
+.Bd -literal -offset indent
+xsetroot -bitmap /usr/X11R6/include/X11/bitmaps/xsnow \e
+	-bg rgb:14/13/0E -fg rgb:7A/49/55
+.Ed
+.
+.Pp
+Since I'd rather not install anything
+I don't have to,
+I went with the default
+.Xr xterm 1 .
+It seems more than adequate, honestly.
+I read through its RESOURCES
+section to configure it how I like.
+The important settings are
+.Sy XTerm*utf8
+and
+.Sy XTerm*metaSendsEscape .
+Since I'm used to copying and pasting on macOS,
+I added equivalent
+.Dq translations :
+.Bd -literal -offset indent
+XTerm*VT100*translations: #override \en\e
+	Super <Key>C: copy-selection(CLIPBOARD) \en\e
+	Super <Key>V: insert-selection(CLIPBOARD)
+.Ed
+.
+.Pp
+The next thing I needed
+was a clock and battery indicator.
+I actually had my battery die on me
+while I was doing all this,
+which reminded me.
+.Xr xclock 1
+would be perfect,
+but then I'd need something else
+for battery.
+There are a couple basic battery indicators
+for X in ports,
+but they're terribly ugly.
+I wanted something as simple as
+.Xr xclock 1 ,
+but that I could add some other text to.
+Then I realized I could just use
+.Xr xterm 1
+for that.
+To my
+.Pa xsession
+I added:
+.Bd -literal -offset indent
+xterm -name clock -geometry 14x1-0+0 -sl 0 -e clock &
+.Ed
+.Pp
+This places a little terminal
+in the top-right corner of the screen
+with no scrollback lines,
+running a script called
+.Pa clock .
+To have
+.Xr cwm 1
+treat it like a
+.Dq panel
+and show it on every desktop,
+I added this to my
+.Pa cwmrc :
+.Bd -literal -offset indent
+ignore clock
+autogroup 0 clock,XTerm
+.Ed
+.Pp
+The
+.Pa clock
+script simply uses
+.Xr date 1
+and
+.Xr apm 8
+to print the time and battery charge
+every minute:
+.Bd -literal -offset indent
+tput civis
+sleep=$(( 60 - $(date +'%S' | sed 's/^0//') ))
+while :; do
+	if [ $(apm -a) -eq 1 ]; then
+		printf '%3s%%' "$(apm -l)"
+	else
+		test $(apm -b) -eq 2 && tput setaf 1 bold
+		printf '%3.3sm' "$(apm -m)"
+		tput sgr0
+	fi
+	printf ' %s\r' "$(date +'%a %H:%M')"
+	sleep $sleep
+	sleep=60
+done
+.Ed
+.Pp
+The initial setting of
+.Va sleep
+is to align the updates
+with the minute ticking over.
+I made the battery output
+a bit fancier by showing
+percentage while charging,
+minutes left while discharging,
+and highlighting in red
+when the battery is
+.Dq critical .
+.
+.Pp
+Now is a good time to mention adding
+.Ql apmd_flags=-A
+to
+.Pa /etc/rc.conf.local
+to enable
+.Dq automatic performance adjustment ,
+or not running your battery flat
+as fast as possible mode.
+It seems like I can get up to 3 hours
+of battery life depending on the screen brightness,
+but this is quite an old battery by now.
+.
+.Pp
+The other thing I needed
+was something to tone down
+that awful, evil blue light from the screen.
+I asked around and someone told me about
+.Xr sct 1 ,
+originally written by tedu.
+The package also includes a little
+.Xr sctd 1
+script that you can add to your
+.Pa .xsession
+to have it automatically adjust
+the colour temperature throughout the day.
+My eyes are no longer being assaulted.
+.
+.Pp
+While I was doing all this,
+I of course needed to talk about it on IRC,
+and it was very nice to be able to
+install my own IRC client with:
+.Bd -literal -offset indent
+doas pkg_add catgirl
+.Ed
+.Pp
+I don't plan to do
+general Web Browsing on
+.Ox ,
+and there is definitely
+no good choice for browser,
+so I just installed
+.Xr imv 1 ,
+.Xr mpv 1 ,
+.Xr youtube-dl 1
+and
+.Xr w3m 1 .
+I wrote a script
+to open images by piping
+.Xr curl 1
+into
+.Xr imv 1 ,
+videos with
+.Xr mpv 1 ,
+and everything else with
+.Xr w3m 1
+in a new
+.Xr xterm 1 .
+Annoyingly,
+.Xr mpv 1
+seems incapable of exiting
+without segfaulting.
+That's quality.
+.
+.Pp
+One thing I am still missing
+is automatic brightness adjustment
+based on ambient light
+like macOS can do.
+I can read the sensor with
+.Xr sysctl 8
+.Cm hw.sensors.asmc0.illuminance0 ,
+which is measured in lux.
+I tried doing something with it in a script,
+but it seems tricky to map its value
+to brightness adjustments
+and to play nice with manual brightness changes,
+so I'll just keep doing it manually for now.
+.
+.Pp
+Update:
+prx sent mail to let me know about
+.Aq Lk https://github.com/jcs/xdimmer .
+I should've guessed jcs had written something.
+.
+.Pp
+And that's my current
+.Ox
+setup after a week of using it.
+I'm quite enjoying it,
+and still being pleasantly surprised
+by the quality-of-life from
+.Ox
+tools and documentation.
+For a small example,
+I can jump to sections
+or flag definitions in
+.Xr man 1
+using
+.Ic :t .
+Systems without basic usability like that
+should be ashamed.
+.
+.Pp
+I would post a screenshot,
+but this is
+.Li text.causal.agency
+;)
+.
+.Sh SEE ALSO
+.Lk https://gist.github.com/jcs/5573685
+.Pp
+My full configurations are in
+.Aq Lk https://git.causal.agency/src .
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Sh BUGS
+There's a red LED
+inside the headphone jack
+that is always on
+and I have no idea how to turn off.
+If anyone knows
+please send me an email.
diff --git a/www/text.causal.agency/017-unpasswords.7 b/www/text.causal.agency/017-unpasswords.7
new file mode 100644
index 00000000..f9643f2f
--- /dev/null
+++ b/www/text.causal.agency/017-unpasswords.7
@@ -0,0 +1,153 @@
+.Dd February 20, 2021
+.Dt UNPASSWORDS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Unpasswords
+.Nd password anti-management
+.
+.Sh DESCRIPTION
+Right away I want to say
+that I'm not trying to tell anyone
+how to manage their online authentication.
+This is just how I do it,
+and I haven't seen anyone else write about it.
+.
+.Pp
+I don't use a password manager.
+It's not a type of software
+I want to deal with.
+For the small handful of sites
+that I use regularly
+and that actually matter,
+I use strong passwords
+(stored in my noggin)
+and TOTP.
+For everything else,
+I simply do not know the password,
+and neither does any software.
+.
+.Pp
+I think I started doing this one time
+when I had legitimately forgotten
+the password to some old account.
+I clicked on
+.Dq forgot my password
+and opened the email,
+but I didn't want to
+come up with a new password
+I would just forget again.
+Instead I set a random one
+.Po
+I usually use
+.Ql openssl rand -base64 33
+for this
+.Pc
+and immediately used that to log in
+while it was still in my clipboard.
+Next time I wanted to log in,
+I could use
+.Dq forgot my password
+again.
+.
+.Pp
+Thinking about it,
+I realized that any web authentication
+with an email password reset flow
+is only ever as strong as
+the authentication for your email account.
+So what is the point of having
+all these passwords set on different sites?
+They all answer to your email account,
+and storing them in a password manager
+seems to add another potential point of failure.
+May as well have no other passwords at all,
+or as close as possible.
+.Po
+Shout out to sites like Liberapay
+and asciienema
+which let me not set a password at all.
+.Pc
+.
+.Pp
+So I started doing that for any site
+that I don't regularly log in to.
+Going through the password reset flow
+can be a bit slow,
+but it doesn't need to be done often.
+And I can do it from anywhere
+I have access to my email,
+which I feel is more easily reliable
+than syncing password management databases.
+It's quite stress-free.
+.
+.Pp
+After doing this manually for years,
+this week I finally got around to
+writing some automation for it.
+A while ago I had written
+.Xr imbox 1 ,
+a tool to directly export mail
+in mboxrd format from IMAP,
+along with
+.Xr git-fetch-email 1 ,
+a wrapper which offloads configuration to
+.Xr git-config 1 .
+It can match emails by
+Subject, From, To and Cc.
+This week I added a flag
+to use IMAP IDLE
+to wait for a matching message
+if there isn't one already,
+and a flag to move matching messages
+(for example to Trash)
+after exporting them.
+.
+.Pp
+With those two new flags,
+I started writing some shell scripts
+to automate the password reset flow
+using
+.Xr curl 1
+to submit forms and
+.Xr git-fetch-email 1
+with
+.Xr sed 1
+to pull the reset tokens
+from my inbox.
+At the end of the script,
+the random password it set
+is copied to the clipboard
+and the login page for the site is opened.
+So now logging in is as simple
+as running a command,
+waiting for the login page to open,
+and pasting.
+.
+.Pp
+The script isn't sophisticated,
+but I don't think it needs to be.
+I've written functions
+for a couple different sites already,
+and they all work in mostly the same way.
+Writing a new one is just a matter
+of identifying the form URLs and fields
+along with where the token is in the email.
+I'm not going to turn this automation
+into any kind of generally usable project,
+because I don't want to have to
+maintain functions for tonnes of different services.
+If you're interested in this idea,
+I encourage you to use my script as a template
+and implement the functions for services you use.
+.
+.Sh SEE ALSO
+.Bl -item -compact
+.It
+.Lk https://git.causal.agency/imbox
+.It
+.Lk https://causal.agency/bin/sup.html
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/018-operating-systems.7 b/www/text.causal.agency/018-operating-systems.7
new file mode 100644
index 00000000..691102e2
--- /dev/null
+++ b/www/text.causal.agency/018-operating-systems.7
@@ -0,0 +1,86 @@
+.Dd February 22, 2021
+.Dt OPERATING-SYSTEMS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Operating systems
+.Nd criteria
+.
+.Sh DESCRIPTION
+Sometimes in conversation
+I use the term
+.Dq real operating system
+which people,
+perhaps rightfully,
+take as inflammatory.
+But I have actually thought about
+what I mean when I say
+.Dq real operating system
+and come up with
+this list of criteria.
+.
+.Pp
+An operating system should be...
+.Bl -bullet
+.It
+Consistent and cohesive:
+all parts of the system should have similar
+usage, configuration, documentation and so on.
+Parts of the system should naturally work together,
+because they were designed to do so.
+.
+.It
+Documented:
+the system should include its own documentation.
+A user should not have to
+search some external wiki
+to learn how the system works.
+It should be obvious
+where to find documentation
+on a particular topic.
+.
+.It
+Programmable:
+the system should provide
+a way to program the computer.
+A computer which cannot be programmed
+is not a computer at all.
+Usually this takes the form
+of a C compiler
+and the tools that go with it.
+In earlier times,
+it might have been
+a BASIC interpreter.
+.
+.It
+Examinable and modifiable:
+the full source tree
+for the system should be included,
+or easily obtainable
+through official means.
+A user should have no trouble
+finding the corresponding source
+for a part of the system.
+Together with the previous point,
+the source tree should be
+compiled by the included toolchain,
+allowing local modification.
+.El
+.
+.Pp
+Some things that may be parts
+of real operating systems,
+but are not themselves operating systems:
+a kernel,
+a package manager,
+a collection of packages.
+.
+.Pp
+I will leave it as an
+.Dq exercise for the reader
+to guess which operating systems
+meet these criteria
+and which don't.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/019-mailing-list.7 b/www/text.causal.agency/019-mailing-list.7
new file mode 100644
index 00000000..b3490a94
--- /dev/null
+++ b/www/text.causal.agency/019-mailing-list.7
@@ -0,0 +1,286 @@
+.Dd March  4, 2021
+.Dt MAILING-LIST 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Mailing List
+.Nd a small-scale approach
+.
+.Sh DESCRIPTION
+When I initially published
+some software I expected
+other people to use,
+I just asked that patches
+be mailed directly to me,
+but I figured that
+if more people were interested,
+it would be better
+to have a mailing list.
+Unfortunately
+email software,
+mailing list options in particular,
+are quite daunting.
+I wanted a light-weight option
+that would require me to host
+as little software as possible.
+.
+.Pp
+My regular email is hosted by Fastmail,
+and I poked around its settings
+to see what I could do.
+It turns out Fastmail lets you
+configure address aliases to
+.Dq also send to all contacts in
+a contacts group.
+That's a mailing list!
+I created a group called
+.Dq List
+and an alias called
+.Mt list@causal.agency
+configured to deliver to that group.
+So it's really just an alias
+for my regular address
+that happens to also
+deliver to another group of people.
+.
+.Pp
+It's easier to just configure
+and manage one mailing list,
+so what I do is ask patches and feedback
+to be sent to
+.Mt list+catgirl@causal.agency ,
+for example.
+Fastmail treats any
+.Ar +suffix
+the same as the base address,
+but the full address can be used
+by subscribers to filter mail by topic
+if they wish.
+.
+.Pp
+To subscribe someone to the list,
+I add their contact to the group.
+For a long time I was planning
+to write some software
+to manage these subscriptions.
+It should be possible
+to process subscription requests from IMAP
+and manipulate the contact group with CardDAV.
+When I went to start implementing this,
+however,
+I found CardDAV (and WebDAV in general)
+completely inscrutable.
+It's the kind of protocol
+that is split across like 20
+different RFCs
+and you can't understand anything
+by just reading
+the one you actually care about.
+So I've given up on that
+and will keep manually subscribing people
+on request.
+.
+.Pp
+The only thing missing, then,
+is a way for people to read
+mail sent to the list
+while they aren't subscribed.
+All the existing
+mailing list archive software
+I know of
+expects to have the mail locally,
+but I'd rather keep all my mail in IMAP.
+First,
+in order to make sure
+I keep a complete archive
+of the mailing list in IMAP,
+I added a small amount
+of Sieve code
+to my Fastmail filters configuration:
+.Bd -literal -offset indent
+if address :matches ["To", "Cc"] "list*@causal.agency" {
+	fileinto :copy :flags "\e\eSeen" "INBOX.List";
+}
+.Ed
+.
+.Pp
+Sieve is a small standard language
+specifically for filtering mail.
+This bit of code matches
+anything sent to the list
+and adds a copy of it
+(the original is going into my inbox)
+to the
+.Dq List
+folder
+and marks the copy as read.
+.
+.Pp
+With a pristine IMAP mailbox
+to export from,
+I wrote a new archive generator.
+It's called
+.Xr bubger 1
+kirg (have it in a way).
+My goal was to render directly from IMAP
+and produce only static files as output,
+making it not only easy to serve,
+but also to run in one place
+and copy the files elsewhere.
+That's important to me
+because it has access to my email,
+so I'd rather run it
+on my local network and
+.Xr rsync 1
+its output into The Cloud.
+The static files are in
+HTML, Atom and mboxrd formats.
+.
+.Pp
+The architecture of
+.Xr bubger 1
+is that for each piece of mail,
+identified by its UID in the mailbox,
+HTML and Atom fragments
+are exported along with the mboxrd.
+Those fragments are then stitched together
+using the IMAP SORT and THREAD extensions
+to make full pages and feeds
+for each thread.
+The fragments act as a cache
+for subsequent runs.
+.
+.Pp
+I admit I did some
+pretty questionable things
+to achieve this.
+Namely,
+I wrote a small string templating engine in C.
+I use it to produce the HTML
+and XML for Atom,
+as well as to generate URLs
+and paths.
+I'm really happy with how it works, actually.
+This is also where
+I really started using
+one of my favourite C hacks:
+.Bd -literal -offset indent
+#define Q(...) #__VA_ARGS__
+.Ed
+.
+.Pp
+I quote all my HTML/XML templates
+with this and it's lovely.
+.
+.Pp
+I've been working on
+.Xr bubger 1
+on and off for almost a year now,
+and it's been interesting.
+I learned a lot about how email
+works from having to deal with
+all the ways a message can be.
+Thankfully a lot of that dealing
+is done by the IMAP server.
+.
+.Pp
+As for running it,
+I initially just ran it with
+.Xr cron 8 ,
+and that's still a good way to go.
+To hook it up to
+.Xr rsync 1 ,
+pipe it like so:
+.Bd -literal -offset indent
+bubger -C list [...] | rsync -a --files-from=- list remote:list
+.Ed
+.
+.Pp
+Later,
+I got a little annoyed
+with having to wait
+for the next run
+if I wanted to link
+to some mail I just received.
+I added an option
+to use IMAP IDLE
+to wait for new mail continuously
+and I started running it
+under my process supervisor,
+.Xr catsitd 8 .
+.
+.Pp
+The setup is a little more complex
+to feed the list of updated files to
+.Xr rsync 1 .
+I added the
+.Xr catsit-watch 1
+utility to run a command
+when a file changes,
+and in my
+.Xr catsit.conf 5
+I have the following:
+.Bd -literal -offset indent
+bubger	~/.local/libexec/bubger
+rsync	catsit-watch -i -f ~/list/UIDNEXT ~/.local/libexec/rsync
+.Ed
+.
+.Pp
+The
+.Pa ~/.local/libexec/bubger
+script runs
+.Xr bubger 1 ,
+writing the list of updated paths to
+.Pa ~/list/FILES :
+.Bd -literal -offset indent
+exec bubger -i -C ~/list [...] >~/list/FILES
+.Ed
+.
+.Pp
+And the
+.Pa ~/.local/libexec/rsync
+script gets run each time a
+.Xr bubger 1
+update completes
+.Po
+.Pa UIDNEXT
+is always the last file written
+.Pc
+and copies the listed files
+to the remote host:
+.Bd -literal -offset indent
+exec rsync -a --files-from=$HOME/list/FILES ~/list remote:list
+.Ed
+.
+.Pp
+I haven't tagged any
+.Xr bubger 1
+releases yet
+because it hasn't gotten
+a huge amount of testing,
+and I'm not sure anyone but me
+would even want to use it.
+But I'm happy
+with how it's working right now,
+so I might tag 1.0 soon
+just for fun.
+.
+.Sh SEE ALSO
+.Bl -item -compact
+.It
+.Lk https://causal.agency/list/
+.It
+.Lk https://git.causal.agency/bubger/about
+.It
+.Lk https://git.causal.agency/catsit/about
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Sh BUGS
+Almost every time
+I try to type
+.Dq mailing list
+I instead type
+.Dq mailist list .
diff --git a/www/text.causal.agency/020-c-style.7 b/www/text.causal.agency/020-c-style.7
new file mode 100644
index 00000000..9816dbc3
--- /dev/null
+++ b/www/text.causal.agency/020-c-style.7
@@ -0,0 +1,172 @@
+.Dd March 16, 2021
+.Dt C-STYLE 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm C Style
+.Nd a rough description
+.
+.Sh DESCRIPTION
+This is a rough description
+of the style in which I write C,
+since it's uncommon
+but some people seem to like it.
+I don't have any hard rules,
+it just needs to look right.
+.
+.Ss Superficialities
+I use tabs
+and they're set to 4 characters wide
+in my editor.
+I keep my lines shorter than 80 columns,
+which I enforce by
+not resizing my terminal's width.
+I use block indentation only,
+meaning I write long function calls
+like this:
+.Bd -literal -offset indent
+fprintf(
+    imap.w, "%s UID THREAD %s UTF-8 %s\er\en",
+    Atoms[thread], algo, search
+);
+.Ed
+.Pp
+Anything that can be sorted
+should be sorted,
+with trailing commas where possible.
+This and block indentation
+make for simpler diffs.
+.Pp
+I either write single-line ifs
+or always use braces.
+I put parentheses
+around ternary expressions.
+I use camelCase
+for functions and variables,
+and PascalCase for types and constants.
+When an acronym appears
+in an identifier,
+it's in either all lower case
+or all upper case.
+The despicable SCREAMING_SNAKE_CASE
+is reserved for macros.
+I don't set globals or statics to zero
+since that is already the default.
+I don't compare against zero or NULL
+unnecessarily.
+.
+.Ss \&No side-effects in control flow
+I never write a function call
+with side-effects
+inside the condition of an if statement.
+I find this makes following the
+.Dq happy path
+through functions
+much easier.
+I write things like this:
+.Bd -literal -offset indent
+pidFile = open(pidPath, O_WRONLY | O_CREAT | O_CLOEXEC, 0600);
+if (pidFile < 0) err(EX_CANTCREAT, "%s", pidPath);
+
+error = flock(pidFile, LOCK_EX | LOCK_NB);
+if (error && errno != EWOULDBLOCK) err(EX_IOERR, "%s", pidPath);
+if (error) errx(EX_CANTCREAT, "%s: file is locked", pidPath);
+.Ed
+.Pp
+I do write side-effects
+inside for and while statement heads,
+since that's generally expected.
+For some reason
+I like to write the constant first
+if I'm comparing the result of an assignment
+with a side-effect.
+.Bd -literal -offset indent
+for (ssize_t len; 0 <= (len = getline(&buf, &cap, file)); ++line)
+.Ed
+.
+.Ss Paragraphs
+I leave blank lines
+between logical chunks of
+.Dq things happening .
+This is usually between side-effects
+with their related error handling,
+or between groups of closely related side-effects.
+I try to keep variable declarations
+glued to the top of the bit of code
+they're used in.
+.
+.Ss Leading break
+I've mentioned this previously.
+I write my switch statement breaks
+before each case label.
+Doing this aligns nicely,
+and being in the habit
+means I always avoid
+accidental fallthrough.
+.Bd -literal -offset indent
+switch (opt) {
+    break; case 'a': append = 1;
+    break; case 'd': delay = strtol(optarg, NULL, 10);
+    break; case 'f': watch(kq, optarg);
+    break; case 'i': init = 1;
+    break; default: return EX_USAGE;
+}
+.Ed
+.
+.Ss Function type definitions
+Function types are always typedef'd,
+and it's the function type itself
+that is defined,
+not a function pointer type!
+I put the typedef above any functions
+that are supposed to be of that type
+so it's clear what the pattern is.
+.Bd -literal -offset indent
+typedef void Action(struct Service *service);
+Action *fn = NULL;
+.Ed
+.
+.Ss Constants
+I prefer enums over #defines
+for integer constants,
+and static const strings over #defines
+unless I want to do concatenation.
+.Bd -literal -offset indent
+enum { Cap = 1024 };
+.Ed
+.Pp
+I avoid the preprocessor
+wherever possible,
+with the notable exception of X macros,
+which I've talked about previously.
+Doing things in the actual language
+makes for easier debugging.
+.
+.Ss Organization
+I usually use only one header file
+in each project.
+The dependency is easy to declare
+and the complete rebuild
+when the header changes
+isn't a problem for small projects.
+Unless it's a single-file program,
+I name the file which contains main
+something generic,
+since the name of the project
+isn't relevant to its function.
+I name functions like
+.Ar nounVerb ,
+and all the functions for a 
+.Ar noun
+are defined in
+.Pa noun.c .
+Not really to do with C,
+but I always put a FILES section
+in my README pages
+to briefly describe
+the layout of the code
+for anyone looking to
+read or make changes to it.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/021-time-machine.7 b/www/text.causal.agency/021-time-machine.7
new file mode 100644
index 00000000..93d35c1e
--- /dev/null
+++ b/www/text.causal.agency/021-time-machine.7
@@ -0,0 +1,144 @@
+.Dd April 25, 2021
+.Dt TIME-MACHINE 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Time Machine
+.Nd an awful one
+.
+.Sh DESCRIPTION
+If, like me,
+you have a Raspberry Pi 3 at home
+that you've just upgraded to
+.Fx 13.0
+which has a hard drive
+from an old laptop
+attached to it by USB adapter
+with ZFS on it
+and you want to
+use that as a Time Machine
+backup destination
+over SMB using
+.Xr samba 8 ,
+despite
+.Xr samba 8
+being awful software
+and using ZFS on a system
+with only 1 GB of RAM
+being a terrible idea,
+this is how to do it.
+.
+.Pp
+In
+.Pa /usr/local/etc/smb4.conf :
+.Bd -literal -offset indent
+[global]
+vfs objects = zfsacl catia fruit streams_xattr
+fruit:metadata = stream
+fruit:model = Macmini
+
+[TimeMachine]
+read only = no
+path = /media/zhdd/backup/TimeMachine
+fruit:time machine = yes
+fruit:time machine max size = 250G
+.Ed
+.
+.Pp
+The important thing here is
+.Sy zfsacl
+in the vfs objects list.
+Most pages will tell you about the others,
+but without
+.Sy zfsacl
+Time Machine will just fail to
+create the backup
+and not provide any useful error.
+I'm not actually sure if the
+.Sy fruit:metadata
+setting is required,
+but a bunch of pages recommend it.
+The
+.Sy fruit:model
+just makes it look nice in Finder.
+The rest creates an SMB share called
+.Dq TimeMachine
+that macOS will be willing to use.
+You can limit the size of the share that
+.Xr samba 8
+reports so that Time Machine
+doesn't fill up the whole drive.
+.
+.Pp
+The other important thing to do
+is to create some swap space.
+When I first tried backing up
+to this share,
+it stopped after a while
+because
+.Xr smbd 8
+got killed
+when there was nowhere to swap pages to.
+A wiki page told me to
+create swap on ZFS like this:
+.Bd -literal -offset indent
+zfs create -V 2G \e
+	-o org.freebsd:swap=on \e
+	-o checksum=off \e
+	-o compression=off \e
+	-o dedup=off \e
+	-o sync=disabled \e
+	-o primarycache=none \e
+	zhdd/swap
+swapon /dev/zvol/zhdd/swap
+.Ed
+.
+.Pp
+To be fair to
+.Xr samba 8 ,
+most of the memory
+is being used by the ZFS ARC
+.Po
+which you can see in
+.Xr top 1
+.Pc ,
+but
+.Xr smbd 8
+still seems to be using
+far more memory than is reasonable.
+It's interesting seeing processes
+with 0 RES in
+.Xr htop 1
+because they're all being swapped out
+while the ARC takes half the available RAM.
+And having to wait for my shell
+to be paged back in when I quit
+.Xr htop 1 .
+.
+.Pp
+Anyway,
+as expected this whole thing
+is terribly slow.
+On my initial backup,
+I'm currently at 26.49 GB
+of 104.22 GB
+with an estimate of 8 hours remaining.
+Normally transfer time estimates
+are wildly inaccurate,
+but I think in this case it's right.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Sh BUGS
+.Fx
+doesn't seem to want to mount
+the ZFS volumes on the hard-drive-over-USB
+automatically at boot.
+I have to
+.Xr zpool-import 8
+the drive manually each time.
+I don't know if there's a workaround for this,
+but I don't have anything essential
+to the system on the drive,
+and it doesn't need to reboot often.
diff --git a/www/text.causal.agency/022-swans-are-dead.7 b/www/text.causal.agency/022-swans-are-dead.7
new file mode 100644
index 00000000..8664e886
--- /dev/null
+++ b/www/text.causal.agency/022-swans-are-dead.7
@@ -0,0 +1,164 @@
+.Dd May  5, 2021
+.Dt SWANS-ARE-DEAD 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Swans Are Dead
+.Nd album by Swans
+.
+.Sh DESCRIPTION
+Swans Are Dead
+is the best Swans album.
+Among my favourites are
+Soundtracks for the Blind,
+To Be Kind
+and Love of Life,
+but Swans Are Dead
+is the one I come back to
+most consistently.
+I'm always in the mood
+to listen to these tunes.
+.
+.Pp
+It's interesting to me
+that I enjoy it so much,
+I think because I had the expectation
+that live albums
+are not of the same quality
+as studio albums,
+but that's just completely untrue
+in the case of Swans.
+The performances are excellent
+and the recording is
+for the most part perfect.
+The album feels live,
+without any distracting deficiencies
+of live recording
+that would take you out
+of just enjoying the music.
+.
+.Bl -ohang
+.It Dq Feel Happiness
+This track feels kind of special
+since it's the only song on the album
+that was never released
+as part of another project.
+I absolutely love this format of song.
+It's like 10 minutes of build
+before any lyrics happen,
+which you only get after
+the wave of the first part
+of the song collapses.
+It bookends the first disc nicely with
+.Dq Blood Promise,
+I think,
+which is sort of the reverse.
+.
+.It Dq Blood On Yr Hands
+This is such a great start
+to the Jarboe-focused
+section of the black disc.
+A cappella apart from the hum
+of the equipment on stage,
+I love this vocal performance.
+I sing this song,
+terribly,
+in the shower.
+The lack of instrumental
+seems to make it stick in my mind even more.
+.
+.It Dq I Crawled
+This is another great vocal performance
+by Jarboe.
+It's so much more dynamic and intense
+than the version of this song
+released much earlier on Young God
+with Gira's vocals.
+I remember seeing a bad comment
+somewhere online
+from someone who couldn't stand
+any Swans song Jarboe sang on.
+They must have never heard
+this version of
+.Dq I Crawled.
+Incredible.
+.
+.It Dq Blood Promise
+My favourite track on
+Swans Are Dead,
+by far.
+I had actually never heard of
+.Dq The Whiffenpoof Song
+until I looked up
+the recording they use
+to introduce this song
+and indicate it's the last of the show.
+Anyway,
+this track highlights
+what makes Swans live albums
+so interesting.
+This performance of the song
+has evolved so much
+from the studio recording on
+The Great Annihilator.
+They share the same lyrics,
+but the earlier version is only 4:15,
+to the live version's fifteen and a half minutes!
+And it sucks me in the whole time.
+As the song winds down
+you can hear an audience member yell,
+.Dq Don't stop!
+and I agree.
+.
+.It Dq The Sound
+One of my all-time favourite songs.
+It's the one that got me to listen to
+Soundtracks for the Blind,
+and might've gotten me into Swans altogether.
+I don't quite remember
+what order I started listening to things in.
+This version of it is great.
+I don't think I could choose
+between this and the studio recording.
+There are just
+two ways to enjoy it.
+I love how frantic the guitars get
+at the height of this track.
+.
+.It Dq I See Them All Lined Up
+This version of the song
+is way more harsh
+than the version on Soundtracks.
+It loses some contrast
+between the verses
+and the explosions of sound
+punctuating them,
+it just hits hard
+the whole time.
+.
+.It Dq Yum Yab
+An absolute banger.
+The drums sound so good on this
+and they really get me moving.
+The whole thing is delightfully nasty and fun.
+.El
+.
+.Pp
+Everything else on the album
+is good too,
+of course,
+I just don't have as much to say.
+There's almost two and a half hours of music
+on this thing!
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+I want to try writing
+about different kinds of things here,
+and this is my first attempt
+at doing so.
+There's more music
+I want to write about,
+and maybe some other
+non-computer topics.
diff --git a/www/text.causal.agency/023-sparse-checkout.7 b/www/text.causal.agency/023-sparse-checkout.7
new file mode 100644
index 00000000..925bc043
--- /dev/null
+++ b/www/text.causal.agency/023-sparse-checkout.7
@@ -0,0 +1,144 @@
+.Dd June  9, 2021
+.Dt SPARSE-CHECKOUT 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Sparse Checkout
+.Nd a cool git feature
+.
+.Sh DESCRIPTION
+I was going to write a post about
+.Xr git-subtree 1
+(and I still plan to!)
+but while talking about it
+with a friend
+I came across another command:
+.Xr git-sparse-checkout 1 .
+I got pretty excited because
+I already had a use case for it.
+.
+.Pp
+.Xr git-sparse-checkout 1
+does pretty much what it sounds like.
+It lets you only have
+a subset of files in the repository actually
+.Dq checked out .
+This is really useful
+for huge respositories
+where you are only interested in
+some part of it.
+Any operation touching the working tree
+is much faster because
+it can skip all the files you don't care about.
+.
+.Pp
+My use case is with the
+.Fx
+.Xr ports 7
+tree,
+which recently moved to git
+and contains almost 14 thousand files.
+Working with the whole repository
+was super painful.
+.Xr git-status 1 ,
+which I run as a habit
+when my shell is idle,
+would take dozens of seconds
+to check the whole working tree
+and report back.
+(I didn't get any real time measurements
+before enabling
+.Xr git-sparse-checkout 1 ,
+and I'm not about to disable it now,
+since it'd have to check out
+all those files again.)
+I'm only actually working on
+a small handful of ports,
+so all that work is wasted.
+Time to turn on sparse checkout:
+.Bd -literal -offset indent
+git sparse-checkout init --cone
+.Ed
+.
+.Pp
+The
+.Fl \-cone
+option here
+(which I keep reading as
+.Dq clone
+because it's git)
+restricts the kinds of patterns
+you can use to select files to check out,
+but makes the calculation more efficient.
+Basically it means you can only select
+paths along with everything below them,
+which I think is pretty much
+always what you want anyway.
+Enabling sparse checkout
+can take quite a while
+because it has to do a lot of un-checking-out.
+I should mention
+that you can pass
+.Fl \-sparse
+to
+.Xr git-clone 1
+to avoid ever checking out
+the whole tree.
+.
+.Pp
+The default selection when you run
+.Cm init
+is to check out all the files
+at the root of the repository,
+but none of the subdirectories.
+For
+.Xr ports 7 ,
+I also want to check out
+the shared scripts and Makefiles:
+.Bd -literal -offset indent
+git sparse-checkout add Keywords Mk Templates Tools
+.Ed
+.
+.Pp
+And then I can selectively check out
+just the ports I'm working on:
+.Bd -literal -offset indent
+git sparse-checkout add irc/catgirl irc/pounce
+.Ed
+.
+.Pp
+After enabling sparse checkout,
+.Xr git-status 1
+takes what I'd call
+a normal amount of time.
+I also did this on
+a couple-weeks-out-of-date copy of the
+.Xr ports 7
+tree,
+and when I ran
+.Xr git-pull 1
+it was also really quick,
+because it didn't have to bother
+updating all those files
+I'm not interested in.
+It still downloads all the git objects,
+of course,
+and you can just add any new paths you need
+to the sparse checkout list.
+My disk usage also went down
+by about a gigabyte.
+.
+.Pp
+I'm super pleased to discover this part of git,
+because it makes working with huge
+and/or monorepo-style repositories
+so much more feasible!
+You can see how I came across it,
+since
+.Xr git-subtree 1
+is also a useful tool for monorepos.
+Stay tuned for that post,
+I guess :)
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/024-seprintf.7 b/www/text.causal.agency/024-seprintf.7
new file mode 100644
index 00000000..d1af2e1a
--- /dev/null
+++ b/www/text.causal.agency/024-seprintf.7
@@ -0,0 +1,137 @@
+.Dd June 12, 2021
+.Dt SEPRINTF 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm seprintf
+.Nd an snprintf alternative
+.
+.Sh SYNOPSIS
+.Ft "char *"
+.Fn seprintf "char *ptr" "char *end" "const char *fmt" "..."
+.
+.Sh DESCRIPTION
+While discussing string building in C recently,
+mcf pointed out
+.Xr seprint 2
+from Plan 9,
+and it kind of blew my mind.
+I had implemented my own function in
+.Xr catgirl 1
+for building up strings using
+.Xr snprintf 3
+and a struct containing
+pointer, length and capacity,
+but it felt out of place.
+.Fn seprintf
+(I add the
+.Dq f ,
+Plan 9 doesn't)
+is a much simpler
+and more
+.Dq C-like
+interface with really nice usage patterns.
+.
+.Pp
+The obvious difference from
+.Xr snprintf 3
+is that
+.Fn seprintf
+takes an
+.Fa end
+pointer
+rather than a size.
+This means you need only calculate it
+once for each buffer,
+rather than subtracting
+the running length from the buffer size.
+.Fn seprintf Ap s
+return value is a pointer
+to the terminating null
+of the string it wrote,
+so you can pass that back in
+to continue appending
+to the same buffer.
+.
+.Pp
+I'm not sure of the exact behaviour on Plan 9,
+but my implementation indicates truncation occurred
+by returning the
+.Fa end
+pointer.
+That makes it both easy to check,
+and perfectly fine to keep calling
+.Fn seprintf
+anyway.
+It just won't write anything if
+.Fa ptr
+==
+.Fa end .
+.
+.Pp
+In the case of formatting failure
+(which should be prevented by
+compile-time format string checking,
+but should still be considered),
+.Fn seprintf
+returns
+.Dv NULL .
+I'm again not sure if this matches Plan 9.
+I like this a lot better than
+.Xr snprintf 3
+returning -1,
+because an unchecked
+.Dv NULL
+is likely to quickly cause a crash,
+while blindly adding
+.Xr snprintf 3 Ap s
+return value
+to your running length
+is a non-obvious logic error.
+.
+.Sh EXAMPLES
+Here's an example of what some code using
+.Fn seprintf
+might look like:
+.Bd -literal -offset indent
+char buf[4096];
+char *ptr = buf, *end = &buf[sizeof(buf)];
+ptr = seprintf(ptr, end, "argv: ");
+for (int i = 1; i < argc; ++i) {
+	ptr = seprintf(
+		ptr, end, "%s%s",
+		(i > 1 ? ", " : ""), argv[i]
+	);
+}
+if (ptr == end) errx(1, "truncation occurred :(");
+.Ed
+.
+.Pp
+And here is the very short implementation of it against
+.Xr vsnprintf 3
+which I copy into my project header files:
+.Bd -literal -offset indent
+#include <stdarg.h>
+#include <stdio.h>
+static inline char *
+seprintf(char *ptr, char *end, const char *fmt, ...)
+	__attribute__((format(printf, 3, 4)));
+static inline char *
+seprintf(char *ptr, char *end, const char *fmt, ...) {
+	va_list ap;
+	va_start(ap, fmt);
+	int n = vsnprintf(ptr, end - ptr, fmt, ap);
+	va_end(ap);
+	if (n < 0) return NULL;
+	if (n > end - ptr) return end;
+	return ptr + n;
+}
+.Ed
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+Another short one before
+.Xr git-subtree 1 .
+I just think this function
+is really neat.
diff --git a/www/text.causal.agency/025-v6-pwd.7 b/www/text.causal.agency/025-v6-pwd.7
new file mode 100644
index 00000000..90bfd6ac
--- /dev/null
+++ b/www/text.causal.agency/025-v6-pwd.7
@@ -0,0 +1,330 @@
+.Dd September  1, 2021
+.Dt V6-PWD 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm V6 pwd
+.Nd deciphering old code
+.
+.Sh DESCRIPTION
+We were talking about
+.Xr wall 1
+on IRC
+and how long it had been annoying users.
+My manual page says
+.Xr wall 1
+appeared in
+.At v6 ,
+which means that
+.Xr wall 1
+has been annoying users for 46 years!
+.
+.Pp
+The Wikipedia page links to the source for
+.At v6 ,
+so I was curious to see how the very first
+.Xr wall 1
+was implemented.
+It's not that surprising,
+except that it is hardcoded
+to handle only 50 logins,
+and it forks to write to each tty,
+waiting one second between each.
+I think the forking must be to avoid
+any of the terminals being opened
+from becoming the controlling terminal
+of the original
+.Xr wall 1
+process.
+.
+.Pp
+Then I started looking
+at some of the other source files
+and found the implementation of
+.Xr pwd 1 ,
+which was surprising.
+There's no
+.Xr getcwd 3
+function
+(the earlier form of which,
+.Xr getwd 3 ,
+appeared in
+.Bx 4.0 ) ,
+so
+.Xr pwd 1
+has to figure out
+the path to the working directory itself.
+It took me a while to figure out how it works.
+.
+.Pp
+To make it easy to talk about,
+I'm just going to include the whole thing here:
+.Bd -literal
+char dot[] ".";
+char dotdot[] "..";
+char root[] "/";
+char name[512];
+int file, off -1;
+struct statb {int devn, inum, i[18];}x;
+struct entry { int jnum; char name[16];}y;
+
+main() {
+	int n;
+
+loop0:
+	stat(dot, &x);
+	if((file = open(dotdot,0)) < 0) prname();
+loop1:
+	if((n = read(file,&y,16)) < 16) prname();
+	if(y.jnum != x.inum)goto loop1;
+	close(file);
+	if(y.jnum == 1) ckroot();
+	cat();
+	chdir(dotdot);
+	goto loop0;
+}
+ckroot() {
+	int i, n;
+
+	if((n = stat(y.name,&x)) < 0) prname();
+	i = x.devn;
+	if((n = chdir(root)) < 0) prname();
+	if((file = open(root,0)) < 0) prname();
+loop:
+	if((n = read(file,&y,16)) < 16) prname();
+	if(y.jnum == 0) goto loop;
+	if((n = stat(y.name,&x)) < 0) prname();
+	if(x.devn != i) goto loop;
+	x.i[0] =& 060000;
+	if(x.i[0] != 040000) goto loop;
+	if(y.name[0]=='.')if(((y.name[1]=='.') && (y.name[2]==0)) ||
+				(y.name[1] == 0)) goto pr;
+	cat();
+pr:
+	write(1,root,1);
+	prname();
+}
+prname() {
+	if(off<0)off=0;
+	name[off] = '\en';
+	write(1,name,off+1);
+	exit();
+}
+cat() {
+	int i, j;
+
+	i = -1;
+	while(y.name[++i] != 0);
+	if((off+i+2) > 511) prname();
+	for(j=off+1; j>=0; --j) name[j+i+1] = name[j];
+	off=i+off+1;
+	name[i] = root[0];
+	for(--i; i>=0; --i) name[i] = y.name[i];
+}
+.Ed
+.
+.Pp
+First, some syntax trivia:
+it seems you don't need
+.Sy =
+to give globals values.
+I guess that makes sense.
+I also noticed that
+it avoids giving
+.Va inum
+and
+.Va jnum
+the same name.
+I think that's because in old C,
+struct field names all shared the same namespace.
+The last difference I noticed
+is the operator
+.Sy =&
+rather than
+.Sy &= .
+Honestly I think the former makes more sense,
+but I can see that the one we have now
+is less ambiguous.
+.
+.Pp
+To get
+.Fn prname
+and
+.Fn cat
+out of the way,
+it's building up a path from the bottom.
+At first I thought it must be
+starting at the end of its buffer
+and moving back as it adds components,
+but no,
+it moves the entire path-so-far over
+every time it adds a new component
+onto the front.
+.Fn cat
+is just a bunch of manual string copying.
+It also gives up
+if the new component
+would make the path longer than 511 characters.
+Fair enough.
+.
+.Pp
+So how does it build up the path?
+The loop in
+.Fn main
+first calls
+.Xr stat 2
+on the current directory
+.Pa \&.
+in order to get its inode number.
+I love that
+.Vt struct statb
+is just declared at the top of this file.
+Clearly this code predates the C preprocessor.
+.
+.Pp
+It then opens the parent directory
+.Pa ..
+and reads directory entries from it.
+The inner loop is looking for
+a directory entry with the same inode number
+as the current directory,
+to figure out what the current directory is called.
+Curiously,
+it reads 16-byte directory entries,
+despite declaring a larger struct.
+The preprocessor can't be invented soon enough.
+.
+.Pp
+Once it finds the matching directory entry,
+it adds the name of the entry
+onto the front of the path,
+changes directory to
+.Pa ..
+and starts over.
+It stops when the current directory
+has an inode number of 1,
+which must be the root of a file system,
+but then it does something else.
+It took me a while to decipher what
+.Fn ckroot
+is doing.
+.
+.Pp
+The loop in
+.Fn main
+stops when it gets to the root
+of a file system,
+but that's not necessarily
+.Pa / .
+I think what
+.Fn ckroot
+is doing is trying to figure out
+where that file system is mounted.
+It starts by checking the device number
+that the current directory is on.
+Or really it calls
+.Xr stat 2
+on the name of the directory entry that
+.Fn main
+just found,
+which I think must be
+.Pa \&.
+at this point anyway since it's at a root.
+.
+.Pp
+Anyway,
+it then changes directory to and opens
+.Pa /
+and starts reading directory entries from that,
+calling
+.Xr stat 2
+on each of them
+and checking for a matching device number.
+I think this implies that file systems
+can only be mounted in
+.Pa /
+and not at any lower level,
+at least not if you want
+.Xr pwd 1
+to understand it.
+I'm not sure what the check for
+an inode number of 0 is skipping over
+in this loop.
+Some kind of special entry in
+.Pa /
+perhaps.
+.
+.Pp
+Once it finds an entry
+with a matching device number,
+it checks the flags
+to make sure the entry is a directory.
+It does so with hardcoded constants,
+but it seems they haven't changed
+in all these years.
+According to
+.Xr stat 2 ,
+040000 is
+.Dv S_IFDIR .
+The number of file types
+clearly has grown since then though,
+since
+.Dv S_IFMT
+is now 0170000 rather than 060000.
+.
+.Pp
+I think the reason it checks
+that the entry is a directory
+is because if it actually is
+on the root file system already,
+then any regular file
+would have a matching device number.
+If the entry is indeed a directory,
+it then checks if the entry is
+.Pa \&.
+or
+.Pa \&.. ,
+which indicates that it really is already at
+.Pa / .
+If it's not,
+it adds the mount point that it found
+to the front of the path.
+.
+.Pp
+Finally,
+it prints
+.Pa /
+followed by the path it built up.
+If it failed at any point before that,
+it would print the path it had built so far
+with no leading
+.Pa / .
+Better than nothing!
+.
+.Pp
+So that's how I think
+.Xr pwd 1
+works in
+.At v6 .
+It was a fun puzzle to work through,
+and it was interesting to see
+the assumptions it makes.
+How simple things were back then...
+Actually I find it really cool
+that code from 1975
+can still be read and understood
+using knowledge of modern C and UNIX-likes.
+.
+.Sh SEE ALSO
+.Lk https://minnie.tuhs.org/cgi-bin/utree.pl?file=V6
+.Pp
+.Pa pwd.c
+appears in
+.Pa V6/usr/source/s2 .
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+I regret saying in two previous posts
+what I planned to write next,
+because this is still not that.
diff --git a/www/text.causal.agency/026-git-comment.7 b/www/text.causal.agency/026-git-comment.7
new file mode 100644
index 00000000..fefb497e
--- /dev/null
+++ b/www/text.causal.agency/026-git-comment.7
@@ -0,0 +1,190 @@
+.Dd September 10, 2021
+.Dt GIT-COMMENT 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm git-comment
+.Nd add comments from commit messages
+.
+.Sh SYNOPSIS
+.Nm git comment
+.Op Fl \-all
+.Op Fl \-comment-start Ar string
+.Op Fl \-comment-lead Ar string
+.Op Fl \-comment-end Ar string
+.Op Fl \-min-group Ar lines
+.Op Fl \-min-repeat Ar lines
+.Op Fl \-no-repeat
+.Op Fl \-pretty Ar format
+.Op Ar options ...
+.Op Fl \-
+.Ar file
+.
+.Sh DESCRIPTION
+The
+.Nm
+command
+adds comments to a file
+showing the commit messages
+which last modified
+each group of lines.
+By default only commit messages with bodies
+and which modified groups of at least 2 lines
+are added.
+Each comment contains
+the abbreviated commit hash
+and the commit summary,
+followed by the commit body.
+.
+.Pp
+.Nm
+accepts all the options of
+.Xr git-blame 1
+in addition to the following:
+.Bl -tag -width Ds
+.It Fl \-all
+Include all commit messages.
+The default is to include
+only commit messages with bodies
+(lines after the summary).
+.
+.It Fl \-comment-start Ar string
+Start comments with
+.Ar string .
+The default is the value of
+.Cm comment.start
+or
+.Ql /* .
+.
+.It Fl \-comment-lead Ar string
+Continue comments with the leading
+.Ar string .
+The default is the value of
+.Cm comment.lead
+or
+.Ql " *" .
+.
+.It Fl \-comment-end Ar string
+End comments with
+.Ar string .
+The default is the value of
+.Cm comment.end
+or
+.Ql " */" .
+.
+.It Fl \-min-group Ar lines
+Add comments only for groups of at least
+.Ar lines .
+The default is 2 lines.
+.
+.It Fl \-min-repeat Ar lines
+Avoid repeating a comment
+if it occurred in the last
+.Ar lines .
+The default is 30 lines.
+.
+.It Fl \-no-repeat
+Avoid repeating comments entirely.
+.
+.It Fl \-pretty Ar format
+Set the pretty-print format
+to use for commit messages.
+The default is the value of
+.Cm comment.pretty
+or
+.Ql format:%h\ %s%n%n%-b .
+See
+.Xr git-show 1 .
+.El
+.
+.Sh EXAMPLES
+For files with
+.Ql #
+comments:
+.Bd -literal -offset indent
+git config comment.start '#'
+git config comment.lead '#'
+git config comment.end ''
+.Ed
+.
+.Pp
+Add as many comments as possible:
+.Bd -literal -offset indent
+git comment --all --min-group 1 --min-repeat 1
+.Ed
+.
+.Pp
+Some examples of output from
+.Xr catgirl 1 :
+.Bd -literal
+/* 347e2b4 Don't apply uiThreshold to Network and Debug
+ *
+ * Messages don't really need to be hidden from <network> and I think
+ * it could be confusing. Debug messages are all Cold so everything
+ * would be hidden, and I want to keep them that way so that <debug>
+ * doesn't clutter the status line needlessly.
+ */
+if (id == Network || id == Debug) {
+	window->thresh = Cold;
+} else {
+	window->thresh = uiThreshold;
+}
+
+/* b4c26a2 Measure timestamp width using ncurses
+ *
+ * This allows for non-ASCII characters in timestamps, and simplifies
+ * things by including the trailing space in the width.
+ */
+int y;
+char buf[TimeCap];
+struct tm *time = localtime(&(time_t) { -22100400 });
+size_t len = strftime(buf, sizeof(buf), uiTime.format, time);
+if (!len) errx(EX_CONFIG, "invalid timestamp format: %s", uiTime.format);
+waddstr(main, buf);
+waddch(main, ' ');
+getyx(main, y, uiTime.width);
+(void)y;
+
+/* 43b1dba Restore toggling ignore with M--
+ *
+ * So that pressing M-- repeatedly maintains the previous behavior.
+ */
+if (n < 0 && window->thresh == Ice) {
+	window->thresh = Cold;
+} else {
+	window->thresh += n;
+}
+
+/* 1891c77 Preserve colon from previous tab-complete
+ *
+ * This fixes the case when pinging multiple nicks and one of them needs to
+ * be cycled through.
+ */
+bool colon = (tab.len >= 2 && buf[tab.pos + tab.len - 2] == L':');
+.Ed
+.
+.Sh SEE ALSO
+.Lk https://git.causal.agency/src/tree/bin/git-comment.pl
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Pp
+In case it's unclear,
+this is a
+.Xr git 1
+subcommand I wrote.
+Did you know you can add new
+.Xr git 1
+subcommands just by
+adding executables named
+.Pa git-*
+to somewhere in
+.Ev PATH ?
+.
+.Pp
+This is also,
+I think,
+my third Perl script ever.
+It's an interestingly shaped language.
+Quite neat.
diff --git a/www/text.causal.agency/027-openbsd-linode.7 b/www/text.causal.agency/027-openbsd-linode.7
new file mode 100644
index 00000000..9f40de42
--- /dev/null
+++ b/www/text.causal.agency/027-openbsd-linode.7
@@ -0,0 +1,202 @@
+.Dd September 26, 2021
+.Dt OPENBSD-LINODE 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Installing OpenBSD on Linode
+.Nd a guide
+.
+.Sh DESCRIPTION
+I've been thinking for a while
+about moving my servers to Linode,
+and also about moving them to
+.Ox .
+I actually originally got into
+.Fx
+(and from there,
+.Ox )
+only because DigitalOcean
+started offering it as a
+.Dq droplet
+image.
+I've been running those servers fine for years,
+but now I prefer to run
+.Ox ,
+and some recent DigitalOcean outages
+had me thinking about it more,
+so I'm giving it a shot.
+.
+.Pp
+As an aside,
+running
+.Ox
+on DigitalOcean
+is not really a good option.
+It seems more awkward to install your own OS there,
+and if you do,
+I've heard that IPv6 won't work
+because they don't know how to run SLAAC.
+Also,
+now that I've used
+the Linode control panel and LISH a bit,
+DigitalOcean kind of feels like a toy
+in comparison.
+.
+.Pp
+Here's what I did to install
+.Ox
+on Linode:
+.Bl -enum
+.It
+Create a Linode with the
+.Dq Choose a Distribution
+box blank.
+.
+.It
+Under the Storage tab,
+create a disk called
+.Dq miniroot
+of type raw
+with size 8 MB.
+This will hold the install image.
+.
+.It
+Create another disk called
+.Dq root
+of type raw
+using the remaining available storage.
+.
+.It
+Boot the Linode in rescue mode
+from the option in the three-dots menu
+next to
+.Dq Power On .
+Attach
+.Dq miniroot
+to
+.Pa /dev/sda .
+.
+.It
+Log into the LISH console
+and obtain the install image:
+.Bd -literal
+curl -O https://cdn.openbsd.org/pub/OpenBSD/6.9/amd64/miniroot69.img
+dd if=miniroot69.img of=/dev/sda
+.Ed
+.Pp
+Power off the Linode.
+.
+.It
+Under the Configurations tab,
+create a configuration called
+.Dq install
+in full virtualization mode.
+Paravirtualization works fine once installed,
+but for some reason the installer
+can't see the root disk
+without full virtualization.
+Under boot settings,
+select direct disk.
+Attach
+.Dq root
+to
+.Pa /dev/sda ,
+.Dq miniroot
+to
+.Pa /dev/sdb
+and set the root device to
+.Pa /dev/sdb .
+.
+.It
+Create a similar configuration called
+.Dq boot
+but using paravirtualiztion
+and without
+.Dq miniroot
+attached.
+Set the root device to
+.Pa /dev/sda .
+.
+.It
+Boot the
+.Dq install
+configuration,
+launch the LISH console
+and switch to Glish.
+It's possible
+to have the installer use serial console,
+but it requires entering commands
+at the boot prompt
+before the timeout,
+and I never managed it.
+If you do manage it,
+run:
+.Bd -literal
+stty com0 9600
+set tty com0
+boot
+.Ed
+.
+.It
+Proceed through the
+.Ox
+installer.
+When asked to
+change the default console to com0,
+answer yes
+so that regular LISH will work.
+Power off the Linode.
+.
+.It
+Boot the
+.Dq boot
+configuration
+and log in to LISH.
+Since the installer configured networking
+in full virtualization,
+rename the file to the paravirtualized interface:
+.Bd -literal
+mv /etc/hostname.em0 /etc/hostname.vio0
+.Ed
+.Pp
+In order to get the right public IPv6 address,
+disable privacy extensions
+by changing the inet6 line of
+.Pa hostname.vio0
+to:
+.Bd -literal
+inet6 autoconf -temporary -soii
+.Ed
+.
+.It
+Bring networking up
+and run
+.Xr syspatch 8
+since
+.Pa rc.firsttime
+couldn't do it:
+.Bd -literal
+sh /etc/netstart
+syspatch
+.Ed
+.
+.It
+Reboot.
+.El
+.
+.Pp
+I guess I'll be slowly moving things over
+to the new servers
+for the next little while.
+With any luck the next post here
+will not say
+.Fx
+in its header!
+.
+.Sh SEE ALSO
+I learned the basic idea
+of how to do this from
+.Lk https://www.subgeniuskitty.com/notes/openbsd_on_linode .
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/028-names.7 b/www/text.causal.agency/028-names.7
new file mode 100644
index 00000000..de47c074
--- /dev/null
+++ b/www/text.causal.agency/028-names.7
@@ -0,0 +1,81 @@
+.Dd October 30, 2021
+.Dt NAMES 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Names
+.Nd three types
+.
+.Sh DESCRIPTION
+There are (at least) three
+different types of names
+a person has.
+.
+.Pp
+First, there are normie names.
+These are names usually made up
+of several words
+each of which is capitalized.
+Most people have one of these,
+but it's possible to have more.
+They're names that might appear on
+various types of Documents.
+A
+.Dq legal name
+(dubious)
+is a normie name,
+but normie names need not be
+.Dq legal
+(dubious).
+I list this category first
+not because it's more important,
+but because it is by far the most boring.
+.
+.Pp
+Next, there are Real Names.
+Most people have at least a few
+and will probably go through
+different ones over time.
+Your Real Names are anything people
+use to refer to you.
+On the internet these are often not capitalized.
+Sometimes that is the only distinction
+between a Real Name
+and a normie name.
+.
+.Pp
+There was a period of time
+when I was playing a lot of TF2
+and not really leaving my apartment.
+I had set my steam name to
+.Dq gluten product
+(yeah, from that dril tweet)
+and I talked in the game's voice chat
+quite a bit.
+Naturally other Gamers in voice chat
+called me
+.Dq gluten
+and at some point I realized
+that over the span of months
+I had been refered to as
+.Dq gluten
+more often than any other name.
+So that was a Real Name of mine.
+People used it and I responded to it.
+.
+.Pp
+Last, there are the True Names.
+The kind of name that knowledge of
+gives one power over a person.
+I don't think any humans
+know their own True Names,
+but I do believe they exist.
+It's possible that other animals
+know theirs.
+It's probably best not to know though, right?
+I think if I knew mine
+I would always worry
+about accidentally revealing it.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/029-topics.7 b/www/text.causal.agency/029-topics.7
new file mode 100644
index 00000000..d071eb67
--- /dev/null
+++ b/www/text.causal.agency/029-topics.7
@@ -0,0 +1,116 @@
+.Dd January  8, 2022
+.Dt TOPICS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Topics
+.Nd a bit of a mess
+.
+.Sh DESCRIPTION
+Shortly after my last post
+I started writing another one
+but I never finished it.
+I don't think I had enough to say,
+or if I did it meant going into
+a whole extra thing.
+I also had a list in my mind
+of other things to write about,
+but inspiration hasn't really struck
+for any of them.
+I'm currently in the mood
+to write something anyway,
+so I'm just going to write a bit
+about the topics I have in mind.
+I may or may not ever
+write more about any of them.
+.
+.Pp
+The post I had started writing
+(twice, actually)
+was about voices.
+I like them a lot
+and I'm fascinated by them.
+The problem is
+I don't actually have much
+to say about it
+without getting into Gender,
+which as I say is a whole extra thing,
+and not something I've written about here before.
+.
+.Pp
+When I started writing here,
+I didn't want to blog about
+personal topics or LGBTQ stuff.
+But more recently
+I want to move away from
+only writing about computers.
+Or maybe away from
+writing about computers entirely.
+There are more interesting things,
+but I don't have experience
+writing about them.
+Yet,
+I should say.
+.
+.Pp
+I'm honestly still not sure
+if writing about gender here
+is at all a good idea.
+But it turns out to feel like
+a bit of a prerequisite
+for other things.
+I find gender perception
+in particular
+to be fascinating.
+It's interesting.
+It's neat.
+And I don't know if I can
+write anything coherent about it.
+.
+.Pp
+Related to that,
+I've been thinking of writing
+about how the pandemic
+has had a strangely positive effect
+on my life.
+Or at least,
+I've made a lot of positive changes
+during it.
+I'm in a better place emotionally now
+than ever before,
+and that obviously runs counter
+to most people's experiences.
+Additionally with that positive outlook
+I want to write about the meaning
+of my domain name.
+I'm proud of it.
+.
+.Pp
+This week the topic of fetish
+has been on my mind.
+That actually feels
+a bit less risky
+to write about than gender.
+And it may honestly be more interesting.
+I don't know.
+There's not enough sex
+on computer blogs,
+or whatever this is.
+Although my main ideas
+are not about sex at all.
+.
+.Pp
+Just this turned out to be
+harder to write than I thought it would be.
+I think I want to populate this space
+with more short posts like the previous one.
+I wrote that while very sleepy
+after 3 AM though,
+and I don't exactly
+want to repeat that regularly.
+We'll see.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+Listening to Kate Bush \(em Hounds of Love.
diff --git a/www/text.causal.agency/030-discs.7 b/www/text.causal.agency/030-discs.7
new file mode 100644
index 00000000..df73a750
--- /dev/null
+++ b/www/text.causal.agency/030-discs.7
@@ -0,0 +1,114 @@
+.Dd January  8, 2022
+.Dt DISCS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Desert Island Discs
+.Nd we're doing three in this one
+.
+.Sh DESCRIPTION
+In typical fashion
+I'm going to write about something
+completely different instead.
+Something short and simple.
+I got thinking about this
+after reading a little interview thing
+this week.
+The question is
+which three albums would you want to have
+if you were stranded on a desert island.
+What could you listen to
+for the rest of time?
+It's surprisingly easy
+to take this question very seriously.
+.
+.Pp
+My immediate thought was
+.Em Music for 18 Musicians.
+I've literally said this about it
+in conversation before.
+That's an album
+I'd want to have on a desert island.
+I find it incredibly soothing,
+almost hypnotic.
+I really do feel like
+I could listen to it forever.
+And then maybe I could finally determine
+which of its eleven sections
+is the best.
+.
+.Pp
+My next thought was
+.Em Soundtracks for the Blind .
+We already know I'm a huge SWANS fan.
+Despite what I've written about
+.Em Swans Are Dead ,
+I instead jumped to SFTB.
+I still think that
+.Em Dead
+has better tunes,
+but
+.Em Soundtracks
+is definitely the better cohesive album.
+It has such atmosphere and mood on it.
+Like
+.Em 18 ,
+it's an album that sucks me in.
+Also,
+either SWANS album
+is an economical choice
+in this hypothetical
+since they're each 2 hours and 20 minutes long.
+.
+.Pp
+Choosing a third album is a lot harder.
+There's so much other music I like
+and only one slot left.
+There's no other single album
+that stands out above the rest
+like the previous two,
+for me.
+.Em Wildlife ,
+maybe?
+Or 
+.Em Jane Doe ?
+Perhaps a classic like
+.Em Aeroplane ,
+or a boomer classic like
+.Em The Wall .
+But would I really want to
+listen to any of those
+to the exclusion of everything else?
+They're too mood-dependent.
+.
+.Pp
+Then I realized the perfect choice
+for third album.
+.Em Mouth Moods .
+A mashup album is the perfect wildcard,
+and
+.Em Moods
+is just fun as hell to listen to.
+I get songs from it stuck in my head
+instead of the originals.
+The final track,
+.Em Shit ,
+always gets me moving.
+It's a masterpiece.
+.
+.Bl -enum
+.It
+Steve Reich Ensemble \(em
+.Em Music for 18 Musicians
+.It
+SWANS \(em
+.Em Soundtracks for the Blind
+.It
+Neil Cicierega \(em
+.Em Mouth Moods
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+Listening to Steve Reich Ensemble \(em Music for 18 Musicians.
diff --git a/www/text.causal.agency/031-books-2021.7 b/www/text.causal.agency/031-books-2021.7
new file mode 100644
index 00000000..d7b46f17
--- /dev/null
+++ b/www/text.causal.agency/031-books-2021.7
@@ -0,0 +1,127 @@
+.Dd January 12, 2022
+.Dt BOOKS-2021 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Books 2021
+.Nd a review, I guess
+.
+.Sh DESCRIPTION
+In 2021 I read 26 books.
+Finished the 26th right on December 31st.
+It's not a lot but it's more than last year.
+Here are the ones I loved
+(in the order I read them).
+I will avoid spoilers,
+of course.
+.
+.Ss Network Effect by Martha Wells
+I've been reading the
+.Em Murderbot Diaries
+series for a while.
+They're fun stories.
+I liked this full-length novel entry a lot.
+I guess it felt like it had more room
+for the characters to develop.
+This is probably when I started
+asking my friends if they'd read it
+because I wanted to talk about
+Murderbot gender vibes.
+.Pp
+You may like if: you're trans.
+.
+.Ss The Once and Future Witches by Alix E. Harrow
+Um,
+it's about witches!
+One of them has the same name as me.
+Kind of has some similar vibes to
+.%T The Future of Another Timeline ,
+which was my favourite book I read in 2020.
+.Pp
+You may like if: you like women.
+.
+.Ss A Desolation Called Peace by Arkady Martine
+I was so excited for this sequel to
+.%T A Memory Called Empire ,
+another previous favourite
+and something I've been wanting more of.
+I kinda wish there was more fucking in it though honestly.
+.Pp
+You may like if: you like women.
+.
+.Ss Piranesi by Susanna Clarke
+Really something different.
+It turned out to be a different story
+than I expected
+from reading the first few pages.
+.Pp
+You may like if: you like statues, I guess?
+.
+.Ss A Psalm for the Wild-Built by Becky Chambers
+Ok yes I do give 3/3 stars
+to every Becky Chambers book.
+They're so fucking good.
+I'm looking forward to
+more entries in this novella series.
+(Also I'm currently reading
+the fourth
+.Em Wayfarers
+book
+and loving it too!)
+.Pp
+You may like if: your pronouns are they/them <3
+.
+.Sh HONOURABLE MENTIONS
+.Ss Her Body and Other Parties by Carmen Maria Machado
+I really enjoyed the short story
+.Dq Especially Heinous: 272 Views of Law & Order SVU
+in this collection.
+It goes on a bit too long
+but the format is unique.
+You can read that one online,
+actually.
+.
+.Ss The Hobbit by J. R. R. Tolkien
+Yeah I hadn't read this until last year.
+I borrowed it after marathoning
+the extended editions of the
+.%T Lord of the Rings
+trilogy during a heat wave.
+As I said at the time,
+pretty good for something
+written by a man
+like a hundred years ago.
+Kind of hilarious that women
+just don't exist
+in the world of
+.%T The Hobbit .
+.
+.Ss Earthlings by Sayaka Murata
+Pretty fucking wild.
+I'd recommend it,
+but I have to say it
+.Em extremely
+needs a child sexual abuse content warning on it.
+.
+.Ss Six Months, Three Days, Five Others by Charlie Jane Anders
+A surprising number of these short stories
+are actual stories!
+They have beginnings,
+middles
+and ends!
+.
+.Ss The City in the Middle of the Night by Charlie Jane Anders
+It's got some
+.Em Xenogenesis
+series vibes.
+Sophie is a goddamn lesbian idiot though
+and she never even realizes it.
+.
+.Sh SEE ALSO
+.Lk https://git.causal.agency/src/tree/txt/books.txt
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+Listening to
+.Em Ear Massage with Latex Gloves 100% Sensitivity 40 minute (No Talking) .
diff --git a/www/text.causal.agency/032-albums-2021.7 b/www/text.causal.agency/032-albums-2021.7
new file mode 100644
index 00000000..72c1d0d2
--- /dev/null
+++ b/www/text.causal.agency/032-albums-2021.7
@@ -0,0 +1,173 @@
+.Dd January 13, 2022
+.Dt ALBUMS-2021 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Albums 2021
+.Nd a review
+.
+.Sh DESCRIPTION
+Every year I create a new playlist
+in iTunes
+(Music dot app, whatever)
+for the albums I listen to that year.
+It's usually embarrassingly short.
+I don't listen to new music
+as much as I'd like,
+and usually only one or two
+are actually from the current year.
+Not that the playlist
+is limited to new (to me) music.
+If I get really into an album
+I've heard before,
+more than before,
+I also add it to the list.
+Anyway,
+this is a review
+of my 2021 albums playlist.
+.
+.Ss Black Country, New Road \(em For the First Time (2021)
+I first heard the single
+.Em Sunglasses
+from someone sharing it on IRC,
+and I loved it,
+so I was looking forward to this album.
+What a let down though.
+The version of
+.Em Sunglasses
+on the album is just plain worse
+than the single version.
+I still got some decent listening
+out of the album,
+but that just sours it for me.
+.Pp
+Favourite track:
+.Em Track X .
+.
+.Ss Black Dresses \(em Forever \&In Your Heart (2021)
+I fucking love Black Dresses.
+.Em Peaceful as Hell
+is one of my all-time favourite albums.
+I'm glad they put out another one
+after it looked like they wouldn't.
+The sounds are just so good.
+Exactly what my ears crave.
+The texture of it
+tickles my brain clit.
+.Pp
+Favourite tracks:
+.Em Waiting42moro ,
+.Em Mistake .
+.
+.Ss Low \(em Drums and Guns (2007)
+I've long loved the song
+.Em Breaker
+and its music video,
+but I only listened to the album
+it's on last year.
+Something I didn't realize,
+I guess because I usually pulled up
+the music video
+without headphones on,
+is how aggressively this album
+uses stereo panning.
+Vocals are generally
+panned hard right throughout,
+with much of the instrumentation
+panned centre or hard left.
+It's bold
+and it really works for me.
+I especially love the vocal harmony on
+.Em Breaker
+all the way on the opposite channel.
+Bring back stereo separation!
+.Pp
+Favourite tracks:
+.Em Breaker ,
+.Em Murderer ,
+.Em Violent Past .
+.
+.Ss The Armed \(em Ultrapop (2021)
+I have to admit
+I didn't actually listen to this one much.
+I listened to the previous album,
+.Em Only Love ,
+a lot in 2020.
+I think this album is good,
+but I'll probably only really get into it
+in some future year.
+.
+.Ss Lingua Ignota \(em Caligula (2019)
+Dear lord,
+why did I wait so long
+to listen to this one.
+I had heard
+.Em "Do You Doubt Me Traitor"
+back when it came out,
+but somehow I didn't realize
+just how much this album
+would be my shit.
+Fucking incredible vocals.
+Lovely sometimes minimal,
+sometimes extreme
+instrumentals
+and exquisite percussion.
+The sound of,
+I believe,
+a lightbulb rolling around on the floor on
+.Em Fragrant
+is such an interesting addition.
+.Pp
+Favourite tracks:
+.Em "Do You Doubt Me Traitor" ,
+.Em "Fragrant Is My Many Flower'd Crown" ,
+.Em "If the Poison Won't Take You My Dogs Will" .
+.
+.Ss Black Dresses \(em LOVE AND AFFECTION FOR STUPID LITTLE BITCHES (2019)
+I wanted even more Black Dresses
+and fortunately there was still more
+I hadn't yet listened to!
+I've already gushed about Black Dresses
+so I'll spare you.
+They're so good though.
+.Pp
+Favourite tracks:
+.Em STATIC ,
+.Em HERTZ ,
+.Em MY HEART BEATS OUT OF TIME .
+.
+.Ss Barenaked Ladies \(em All Their Greatest Hits: Disc One 1991-2001
+What?
+Yeah,
+late last year I decided to revisit BNL.
+My parents listened to them a lot
+when I was growing up,
+and I liked them too.
+The first show I ever went to was the
+.Dq Barenaked for the Holidays
+tour with my parents.
+It turns out
+I still think their '90s stuff
+is pretty darn good!
+Steven Page is really a great singer.
+This is also the first time
+I'm listening to these tunes
+with fancy headphones
+and it sounds great.
+Honestly
+.Em The Old Apartment
+can totally compete
+with the favourites
+I've accumulated more recently.
+\&'90s alt rock was good actually?
+.Pp
+Favourite tracks:
+.Em The Old Apartment ,
+.Em Brian Wilson ,
+.Em What a Good Boy ,
+.Em Too Little Too Late .
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+Listening to all my favourite tracks :)
diff --git a/www/text.causal.agency/033-jorts.7 b/www/text.causal.agency/033-jorts.7
new file mode 100644
index 00000000..001f877c
--- /dev/null
+++ b/www/text.causal.agency/033-jorts.7
@@ -0,0 +1,485 @@
+.Dd February  2, 2022
+.Dt JORTS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Introducing Jorts
+.Nd june's ports
+.
+.Sh DESCRIPTION
+Alright so I've gone off the deep end,
+maybe.
+After continual frustration with MacPorts
+culminating in not being able to install
+.Xr nvi 1
+on my work MacBook,
+I have just gone ahead
+and started my own personal ports tree
+for macOS.
+After a couple of weeks,
+I have 32 ports in my tree
+and only two remaining requested ports
+installed from MacPorts.
+.
+.Pp
+I set out with a couple ideas in mind:
+.Bl -bullet
+.It
+This will be my own personal ports tree.
+It only has to work for me.
+Since I'm using it on both
+my personal Intel MacBook Pro
+still running Catalina
+and my work M1 MacBook Pro
+running Monterey,
+it is at least that portable.
+.
+.It
+It's ok to rely on
+system libraries and tools
+provided by macOS.
+I'm not creating a distro,
+so it doesn't need to be totally isolated.
+This lets me skip really annoying things
+like compiler toolchains.
+.
+.It
+Sources get vendored,
+either from release tarballs
+or with
+.Xr git-subtree 1 .
+This allows totally pain-free
+local patching,
+and boy has this paid off.
+I can just do what I need to do
+to get the thing to build how I want
+and commit it in git like anything else.
+.Pp
+It also means that the tree itself
+is entirely self-contained
+and doesn't rely on any external sources
+or network access.
+Honestly with some old and obscure software
+it feels like upstream could disappear at any moment,
+so this gives me peace of mind too.
+.Pp
+Another advantage of vendoring upstream sources
+is that all of the code installed on my system
+(in
+.Pa /usr/local
+anyway)
+is easily inspected,
+much like
+.Pa /usr/src
+on a BSD.
+This can be super useful for debugging
+or just for reference.
+.
+.It
+Produce simple package tarballs.
+They're just the contents of
+.Ev DESTDIR
+after a staged install.
+They get installed for real
+by untarring them in
+.Pa / .
+They can then be uninstalled
+(or upgraded)
+by removing the paths contained
+in the tarball from the system.
+.
+.It
+Track installed packages with symbolic links
+to specific package tarballs.
+Keep old tarballs around for rollbacks.
+This means I can see what's installed
+with plain old
+.Xr ls 1 !
+.Bd -literal
+$ ls */Installed
+\&...
+libretls/Installed          toilet/Installed
+mandoc/Installed            tree/Installed
+
+$ ls -l toilet/Installed
+lrwxr-xr-x  1 root  staff  19 17 Jan 21:45 toilet/Installed -> toilet-0.3~1.tar.gz
+.Ed
+.
+.It
+Use
+.Xr bmake 1 .
+It's scrutable.
+It also knows how to bootstrap itself
+pretty well.
+Since
+.Xr bmake 1
+is itself a port in my tree
+that would require
+.Xr bmake 1
+to build and install,
+I wrote a small
+.Pa Bootstrap
+shell script
+to install
+.Xr bmake 1
+.Dq manually
+then use that
+.Xr bmake 1
+to build and install its own port.
+It also requires a bit of care
+when upgrading the
+.Xr bmake 1
+port since macOS
+rather doesn't like a binary
+deleting itself while it's running.
+.
+.It
+No GNU software.
+I simply refuse to do it.
+To that end,
+prefer configuring/building with
+.Xr cmake 1
+where at all possible.
+I fell into this early on
+since I originally just wanted to install
+.Xr nvi 1
+and
+.Sy lichray/nvi2
+is a better upstream source these days
+that uses
+.Xr cmake 1 .
+.Pp
+With a port and support for
+.Xr cmake 1
+in
+.Pa Port.mk ,
+I can make changes to
+.Pa CMakeLists.txt
+files without issue.
+I can also vendor upstreams
+directly from git
+rather than having to find
+release tarballs with generated
+.Pa configure
+scripts and so on.
+When I need to make changes
+to the build systems of projects using autotools,
+I either have to have autotools installed
+(from outside my tree)
+or painstakingly reflect my edits by hand
+in the generated files,
+both of which suck hard.
+.El
+.
+.Pp
+Ok so that's actually quite a number of ideas.
+But they have come together
+into something surprisingly usable
+surprisingly quickly!
+Like I said,
+this is only intended to be
+my own personal ports tree,
+but I hope that some of these ideas
+are interesting
+and maybe inspire others
+to explore similar approaches.
+.
+.Pp
+But wait,
+I'm not done yet!
+There are some other interesting things
+that I came up with along the way,
+and also some complaints
+about some upstreams,
+but I'll try to keep those to a minimum.
+.
+.Pp
+So it turns out that dependencies are hard.
+Who knew?
+It's easy enough to enforce
+direct dependencies
+at build time
+by just checking for the required
+.Pa Installed
+symlinks.
+It's less straightforward
+to do this recursively,
+which you need if
+you want to be able to say,
+.Do
+Install
+.Xr nvi
+for me!
+.Dc
+and get
+.Xr ncurses 3 ,
+.Xr cmake 1
+and
+.Xr pkgconf 1
+installed first
+if they aren't already.
+.
+.Pp
+Rather than trying to do all that in
+.Xr bmake 1 ,
+I wrote a shell script called
+.Pa Plan ,
+which itself produces a shell script.
+Given a list of ports
+to install or upgrade,
+it recursively gathers their dependencies
+and feeds them to
+.Xr tsort 1 ,
+which is a neat utility
+which topologically sorts a graph.
+In other words,
+it determines the order
+in which the graph of dependencies
+should be installed.
+The
+.Pa Plan
+script produces a list of
+.Xr bmake 1
+commands to make that happen
+on standard output,
+which can be piped to
+.Xr sh 1 .
+So,
+the way to say the above is:
+.Bd -literal -offset ident
+$ ./Plan -j4 nvi | sh -e
+.Ed
+.
+.Pp
+Now,
+what's missing from this approach
+is the ability to automatically
+uninstall no-longer-needed dependencies.
+It's something I've criticized Homebrew for lacking
+and one of the reasons I started using MacPorts,
+so it's somewhat ironic that
+my own system lacks it as well.
+However,
+I don't think it's much of a problem,
+since I'm only packaging
+what I actually want installed
+in the first place.
+On my personal computer,
+I have all 32 of my ports installed,
+and I expect that to continue.
+I can always keep using MacPorts
+to install things I only intend
+to use temporarily.
+.
+.Pp
+Another thing I was slightly concerned about
+from the beginning was disk usage.
+I think the benefits of vendoring sources
+far outweigh the cost in storage,
+but it would be nice to at least minimize that cost.
+Previously,
+I wrote about
+.Xr git-sparse-checkout 1 ,
+which allows you to only have certain paths
+checked out in your git working tree.
+Since port sources aren't always interesting
+and only
+.Em required
+while actually building the port,
+it makes sense to not have them always checked out.
+.
+.Pp
+Rather than manipulate
+.Xr git-sparse-checkout 1
+myself,
+I added support for it
+directly into
+.Pa Port.mk .
+If sparse checkout is enabled,
+building a port will automatically
+add its source tree to the checkout list,
+and cleaning that port will
+remove it from the list.
+At rest,
+only the port system itself
+and the package tarballs
+need to be present on the file system.
+.
+.Pp
+It turns out that upstream
+build system behaviour
+is super inconsistent,
+even among projects using
+the same tools.
+I started collecting a list of checks
+to perform on the output of my port builds
+to make sure they didn't do anything weird.
+They live in
+.Pa Check.sh ,
+which gets run
+when a package tarball is created.
+The current list of checks is:
+.Bl -bullet
+.It
+Check for directories not included by
+.Ev PACKAGE_DIRS .
+In other words,
+make sure the port isn't
+trying to install anything
+outside of
+.Pa /usr/local .
+Sometimes this makes sense,
+though,
+which is what
+.Ev PACKAGE_DIRS
+is for.
+.It
+Check for references to PWD,
+i.e. the build directory.
+This can mean the build
+didn't understand
+.Ev PREFIX
+and
+.Ev DESTDIR
+correctly,
+or that it built with debug info.
+.It
+Check for binaries without manuals.
+If your software installs an executable in
+.Pa bin
+but not a manual page,
+your software is incomplete!
+Sometimes this just means
+I missed an extra documentation install target.
+.It
+Check for dynamic linking to outside objects.
+In other words,
+if something ended up linking to
+a library installed by MacPorts
+rather than the one from
+.Nm jorts
+or macOS.
+.It
+Check for dynamic linking
+to system libraries
+.Nm jorts
+provides instead.
+Similar to the last one,
+if both macOS and
+.Nm jorts
+provide a library,
+check that ports link with the latter.
+.It
+Check for scripts with outside interpreters.
+This is analogous to the linking checks
+but for scripts,
+checking that their shebang lines
+refer to interpreters installed
+by macOS or
+.Nm jorts .
+.El
+.
+.Pp
+A number of my ports
+still fail some of these checks,
+but I have fixed a lot of problems
+the script called out.
+.
+.Pp
+Speaking of problem ports...
+git's build system is truly awful.
+I'm sorry,
+it's just really disappointing.
+On the upside though,
+I did manage to patch it
+to use
+.Xr asciidoctor 1
+directly to generate manual pages
+from asciidoc source,
+rather than generating docbook or whatever
+then converting that.
+One less build dependency!
+I also fixed up curl's
+.Pa CMakeLists.txt
+(which I guess are normally only used on Windows)
+to build and install documentation properly.
+And I got libcaca's Cocoa driver working again!
+Very important to be able to run
+.Xr cacafire 1
+in a Cocoa window.
+.
+.Pp
+Shout out to SDL2,
+which didn't require any patching
+or extra options beyond
+.Ev USE_CMAKE=yes .
+Model upstream.
+.
+.Pp
+Some other odds and ends:
+I like being able to name ports how I want
+(for example,
+.Sy ag )
+and use my own port version convention,
+using
+.Ql +
+to append VCS revisions
+and
+.Ql ~
+to append port revisions.
+I don't think those are likely
+to ever clash with upstream versioning schemes.
+Not that I even need to follow upstream versioning.
+There is no reason the version number of
+.Xr dash 1
+should start with a zero.
+.
+.Pp
+Speaking of versions,
+a big downside of maintaining your own ports tree
+is that you actually need to update it.
+Thankfully,
+once I packaged
+.Xr curl 1
+and
+.Xr jq 1
+(which needs a new release dammit,
+it's been 4 years and the build is broken
+on macOS),
+I could use the Repology API
+to check if I'm behind everyone else.
+Far more reliable than
+trying to automate checking upstreams
+for new versions.
+That lives in the
+.Pa Outdated
+shell script.
+.
+.Pp
+Phew!
+I wrote a lot about this.
+It feels a little self-indulgent,
+but I've had fun working on this
+and want to share.
+If anyone else tries anything similar,
+or is weird enough to give
+.Nm jorts
+a try themselves,
+I'd love to hear about it!
+.
+.Sh SEE ALSO
+.Lk https://git.causal.agency/jorts/
+.Pp
+.Lk https://youtu.be/Sx3ORAO1Y6s
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+Listening to
+.Em Arcade Fire \(em Arcade Fire (EP) ,
+.Em Arcade Fire \(em The Suburbs .
+.Pp
+Typed on a brand new
+Leopold FC660M
+with Cherry MX Red switches.
+Lovely keyboard.
diff --git a/www/text.causal.agency/034-voices.7 b/www/text.causal.agency/034-voices.7
new file mode 100644
index 00000000..4990295d
--- /dev/null
+++ b/www/text.causal.agency/034-voices.7
@@ -0,0 +1,56 @@
+.Dd March  5, 2022
+.Dt VOICES 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Voices
+.Nd more kinds of them
+.
+.Sh DESCRIPTION
+Welcome to the third time
+I started writing this post!
+I think the first time
+was after watching a jan Misali video
+that had clips of audio interviews in it.
+It got me thinking about
+how interesting it was
+to hear someone's voice
+without knowing anything else about them.
+.
+.Pp
+That's pretty much all I managed to write
+the first two times I started this.
+If I get past this next sentence,
+then I can probably finish the post.
+What stopped me was that
+all my thoughts and feelings about voices
+are influenced by being trans
+(and being a fan of other trans people),
+and I thought,
+.Dq I don't write about that here,
+but why don't I?
+I don't have to come out to my blog.
+.
+.Pp
+So really what I have been wanting to say is this:
+every trans woman's voice that I have heard
+has sounded genuinely wonderful to me.
+Especially if you're reading this
+and we've been on a voice call before.
+I know,
+voices are the object of so much self-consciousness,
+but I really wish they didn't have to be.
+Most of us do not sound like cis women
+and to me that is fine.
+Good, actually.
+Trans women sound like trans women.
+As a voice appreciator,
+I am so happy to hear more kinds.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+I've been watching some Vektroid streams lately,
+and I love her voice.
+It was another thing
+reminding me to write this.
diff --git a/www/text.causal.agency/035-addendum-2021.7 b/www/text.causal.agency/035-addendum-2021.7
new file mode 100644
index 00000000..262f2178
--- /dev/null
+++ b/www/text.causal.agency/035-addendum-2021.7
@@ -0,0 +1,111 @@
+.Dd March 18, 2022
+.Dt ADDENDUM-2021 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Addendum 2021
+.Nd missed music
+.
+.Sh DESCRIPTION
+I just realized that I totally forgot
+some important music for me from last year
+in my Albums 2021 post,
+because it wasn't in my playlist.
+Last year I watched
+the Berserk anime from 1997,
+and its soundtrack is incredible.
+.
+.Pp
+Actually the only reason
+I started watching it at all
+was because of the music.
+I was watching the wayneradiotv stream,
+.Do
+Mon repas durant un temps de tristesse;
+un pizza je n'oublierai jamais
+.Dc
+and I was mesmerized by the Guts theme.
+I had to find out what it was from.
+This was also around the time
+that Kentaro Miura died
+so people were really talking about it.
+Anyway just hearing
+that part of the soundtrack
+got me to start watching the anime,
+since you can find it all on youtube.
+.
+.Pp
+The anime in general did not disappoint.
+Actually it's really fucking good,
+and so is the rest of the soundtrack.
+The title sequence and credits tracks
+are so good that I let them play
+every episode even though
+I watched the series over only like 2 days.
+.
+.Pp
+I absolutely love whatever genre this stuff is.
+Is '90s anime intros its own genre?
+Something about combining
+acoustic and electric guitars,
+maybe.
+I'm also fond of
+the poorly written english lyrics.
+They're poetic in a distinctive way.
+I feel the same about
+that Shinsei Kamattechan
+song that was used for the credits of
+Attack on Titan season 2.
+Honestly awesome to write lyrics
+in a second language you haven't mastered.
+.
+.Pp
+So,
+the intro track,
+.Em Tell Me Why .
+First off,
+that sword sound effect
+near the beginning rules.
+Put that in more songs.
+What I really can't get enough of
+on this track are
+the quiet shouty vocals
+a bit off to the left
+during the chorus.
+It's such a cool idea
+to have clean lead vocals
+and shouting in the background.
+.
+.Pp
+And the credits track,
+.Em "Waiting So Long" .
+That first low note is so good.
+This is really a perfect credits song
+for the atmosphere of the show.
+It's creeping.
+The dual vocals
+the whole way through
+are such an interesting texture.
+Both of these tracks
+have really cool vocal sounds.
+And that dirty final guitar chord
+is a great sound to end on.
+.
+.Sh SEE ALSO
+These aren't great quality uploads
+but this stuff is sadly hard to find.
+.Bl -tag -width Ds
+.It "Guts"
+.Lk https://youtu.be/vZa0Yh6e7dw
+.It "Earth"
+.Lk https://youtu.be/5iAViNf9Z4Y
+.It "Penpals \(em Tell Me Why"
+.Lk https://youtu.be/I2rV8oKWSdM
+.It "Silver Fins \(em Waiting So Long"
+.Lk https://youtu.be/70GD2SBCq64
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+.Dq I like swinging my sword in battle.
diff --git a/www/text.causal.agency/036-compassion.7 b/www/text.causal.agency/036-compassion.7
new file mode 100644
index 00000000..9d0d887d
--- /dev/null
+++ b/www/text.causal.agency/036-compassion.7
@@ -0,0 +1,105 @@
+.Dd March 31, 2022
+.Dt COMPASSION 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Compassion
+.Nd better world fiction
+.
+.Sh DESCRIPTION
+Recently I watched the film
+.Em Margarita With a Straw .
+I'm not sure how to feel
+about some aspects of it,
+but it tries to do a lot,
+and I was still thinking about it
+a couple days later.
+.
+.Pp
+What really sticks out about it,
+to me,
+is that it is
+better world fiction,
+for lack of a better term.
+It's a film about two characters
+with disabilities,
+but it doesn't play into tropes.
+There's no big dramatic scene
+where a character gets treated unfairly.
+It doesn't really happen.
+In the world of the movie,
+most people are accepting,
+patient
+and compassionate.
+That's not to say
+there is no conflict.
+The film is just telling a different story.
+.
+.Pp
+The story takes place
+in a better world.
+Or maybe it takes place
+in a world that exists
+within our own,
+hidden between the worse parts.
+It's wonderfully subversive.
+Because I went into the film
+expecting at least one deeply upsetting
+scene of discrimination.
+What else would you expect
+of a story like this one,
+right?
+But instead of being upset,
+I was warmed.
+It was so nice to see
+the characters work through
+their own problems
+surrounded by simple kindness.
+And when it was over,
+I was left wanting
+to move our world
+closer to that one.
+.
+.Pp
+That's what I love about this kind of fiction.
+It's why I love the books of Becky Chambers so much.
+They give me hope,
+and guidance.
+I count the
+.Em Murderbot Diaries
+series in this as well,
+which shows a sort of bad world,
+and an alternative.
+I think it's so important
+to see the good that exists
+and the good that could exist.
+Rather than something to fight against,
+these stories show something to fight for.
+A more compassionate world.
+.
+.Pp
+I know,
+one person can't change the world.
+But they can change their own world,
+and the worlds of those around them.
+And slowly,
+good things can spread.
+I'll strive to be
+more patient,
+more understanding,
+more compassionate,
+and I hope you will too.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Pp
+I can't help but worry,
+when I write something like this,
+that someone I know will read it
+and think that I'm lying
+because I've hurt them.
+If that's the case,
+I am sorry,
+and I promise
+I am trying to do better.
diff --git a/www/text.causal.agency/037-care.7 b/www/text.causal.agency/037-care.7
new file mode 100644
index 00000000..052a4727
--- /dev/null
+++ b/www/text.causal.agency/037-care.7
@@ -0,0 +1,167 @@
+.Dd April  3, 2022
+.Dt CARE 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Care
+.Nd trans stuff in Montreal
+.
+.Sh DESCRIPTION
+This kind of info
+is frustratingly hard to find
+even from support orgs
+and the like.
+I think it's unlikely
+that anyone in my blog's audience
+is also someone who needs this info,
+and my blog isn't easy to find either,
+but I want to at least
+make it available somewhere.
+Really this is just like
+the posts where I figure out
+how to do something with a computer
+then I write it down.
+.
+.Pp
+Prices obviously change,
+by which I mean they inevitably go up,
+but I'm gonna give the amounts I paid
+in 2021\(en2022.
+Also if you want more details
+about any of this
+please email me.
+I will be happy to tell you all about it.
+.
+.Ss Medication
+I get HRT through
+Dr. Gabrielle Landry
+at La Clinique A,
+which is a private clinic.
+I've done everything over the phone.
+After the first consultation,
+I signed an informed consent form
+and had a prescription the next day,
+which I could start
+after I got an initial blood test.
+The information I found
+said to contact a specific person
+at the clinic with a direct phone number,
+which is what I did.
+Email me if you want that number.
+.
+.Pp
+I paid $300 for the first consult,
+$195 for the first followup,
+and $75 for further followups.
+I think annual appointments
+are more expensive
+than the followups.
+I've been getting blood tests done at a CLSC,
+which is free.
+On the public drug insurance plan,
+I paid $30-$35
+for my prescriptions
+as my dosage increased.
+I have private insurance now
+that entirely covers prescriptions,
+so I'm not sure what I'd be paying
+for my current prescription
+on the public plan.
+.
+.Ss Hair removal
+I tried laser hair removal,
+for longer than I should have.
+It was a waste of time and money.
+Do not believe any arguments about
+its convenience over electrolysis.
+.
+.Pp
+I've started getting electrolysis done
+with Dimi.
+Again,
+feel free to email me for contact info.
+He is very good and can do long sessions.
+I really don't find it very painful,
+which I think is partly my own pain tolerance
+and partly good equipment and skill.
+I've also found that taking acetaminophen beforehand
+and dressing warmly to keep my body relaxed help.
+I've paid $85 for hour-long sessions
+and $160 for two-hour sessions.
+I'm still early in treatment,
+but I'm really happy with the results so far!
+.
+.Ss Sex & name change
+The form for this is
+.Do
+Application to Change the Sex Designation
+of a Person 18 Years of Age and Over
+.Dc
+from the
+.Em Directeur de l'\('etat civil .
+It's self-ID,
+but you have to get it signed by
+someone you know
+and a commissioner for oaths.
+Julien at P10 is qualified for that
+and was super nice.
+We did it over Zoom.
+It's a free service,
+so I made a donation to P10.
+.
+.Pp
+I paid $144 to file mine
+but it's now FREE
+the first time you do it.
+Also $17 to mail it.
+Surprisingly,
+I got an acknowledgment letter
+.Po
+just saying they got it
+and would start looking at it
+.Dq shortly
+.Pc
+like a week and a half
+after I mailed the application.
+My cheque was cashed
+39 days after the date
+on the acknowledgment,
+and I got a
+.Dq favourable decision
+a week later.
+It takes another 30 days
+to get the certificate of change,
+after which you can
+order a new birth certificate
+and RAMQ will (slowly) send you a form
+to get a new card.
+In all it took about 4 months
+from when I mailed the application
+to having ID with my name on it.
+.
+.Ss Therapy
+I'm not seeking therapy
+for gender specifically,
+but I would like to find a good therapist
+that's aware of it.
+I'll update this
+if I find one.
+.
+.Ss Piercings
+Ok I know this isn't trans-specific
+but at least for me getting piercings
+was gender-affirming.
+Cuz I got nipple piercings lol.
+Anyway,
+I went to Mauve.
+They're super nice,
+really know what they're doing,
+and their website has lots of info.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Pp
+If somehow you did find this useful,
+I'd love for you to email me
+and let me know how things went for you.
diff --git a/www/text.causal.agency/038-agency.7 b/www/text.causal.agency/038-agency.7
new file mode 100644
index 00000000..f99a070b
--- /dev/null
+++ b/www/text.causal.agency/038-agency.7
@@ -0,0 +1,85 @@
+.Dd April 14, 2022
+.Dt AGENCY 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Agency
+.Nd origin of a name
+.
+.Sh DESCRIPTION
+When I registered this domain name,
+it was aspirational.
+Intentionally so.
+I wanted a new domain
+for a new identity,
+and I was thinking about personhood.
+That's what causal agency means.
+.
+.Pp
+It really was aspirational
+for me at the time.
+I spent a lot of time
+wishing I could be a person,
+because I didn't feel like one.
+I didn't feel real,
+like everyone else was.
+I didn't have any power
+over my own life.
+Things just happened to me,
+and I watched.
+There wasn't really a
+.Dq me
+there.
+The world was something that happened
+but that I couldn't interact with.
+I felt like that
+for most of my life.
+.
+.Pp
+But at some point
+I decided that,
+even if I wasn't now,
+one day I hoped to be an actual real life person.
+Like most programmers
+I am dreadful at naming things,
+so I didn't come up
+with this clever domain name
+myself.
+I typed
+.Dq person
+into some thesaurus,
+and it gave back
+.Dq causal agent ,
+and I realized
+agency is a TLD now.
+.
+.Pp
+Maybe it's a little dramatic
+to label myself with the thing
+I didn't think I had.
+But who knows,
+maybe it helped.
+Because it took a few years,
+but I did become a person.
+I feel real now.
+I can change my own life
+and the world around me.
+I have causal agency.
+.
+.Pp
+I am really proud of this domain name.
+I'm proud to put it on everything I make.
+Every instance of it
+is a reminder
+that I did what I set out to do,
+and that I'm still doing it.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.
+.Pp
+If anything in this post resonates with you,
+I want you to know that,
+whatever you think you can't do,
+it is possible,
+and you'll get there one day.
diff --git a/www/text.causal.agency/039-apologies.7 b/www/text.causal.agency/039-apologies.7
new file mode 100644
index 00000000..1b15076a
--- /dev/null
+++ b/www/text.causal.agency/039-apologies.7
@@ -0,0 +1,81 @@
+.Dd September 19, 2022
+.Dt APOLOGIES 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Apologies
+.Nd making them
+.
+.Sh DESCRIPTION
+Apologies are very important to me.
+Unfortunately
+I've only recently realized
+how valuable they are.
+I've tried to think about
+what makes a good apology,
+since it's not something
+I was ever taught.
+This is the advice
+I came up with for myself,
+on how to apologize.
+.
+.Bl -enum
+.It
+Make the apology.
+This is the most important part.
+If you feel guilty
+for something you've done,
+or think you might have hurt someone,
+apologize.
+Even if they don't need an apology,
+saying sorry won't hurt.
+And start with that.
+Literally say
+.Dq I'm sorry .
+Sometimes people forget that.
+.Pp
+On the other side,
+if you've been hurt by someone,
+and you trust them,
+let them know.
+Give them a chance to apologize.
+People don't always realize
+they've made a mistake.
+.
+.It
+Explain what you did wrong.
+I think it's important
+for the other person
+to know you understand
+how you've messed up.
+Really think about this!
+It's what will help you learn.
+If you know you've hurt someone
+but you're not sure why,
+you can try asking them.
+Take their answer seriously.
+.
+.It
+Don't make excuses.
+Do not talk about yourself.
+Don't even mention
+how you were feeling stressed that day,
+or whatever.
+It's not relevant.
+We all make mistakes,
+we all have bad days.
+.
+.It
+Commit to doing better.
+Try to learn from your mistakes.
+Say it won't happen again.
+Literally say
+.Dq I won't do that again .
+And then try your hardest to make that true.
+An apology is a commitment,
+not something you're done with
+once you've said it.
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/040-sound-memory.7 b/www/text.causal.agency/040-sound-memory.7
new file mode 100644
index 00000000..c995de08
--- /dev/null
+++ b/www/text.causal.agency/040-sound-memory.7
@@ -0,0 +1,165 @@
+.Dd November 14, 2022
+.Dt SOUND-MEMORY 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm Sound Memory
+.Nd associations
+.
+.Sh DESCRIPTION
+.Ss Talking Heads \(em "Remain In Light"
+The first time I gave this album a serious listen
+was when I was going for several-hour walks
+at 4 in the morning in,
+I think,
+fall 2020.
+I would stay up all night,
+go out walking at 4am
+for a couple hours,
+come home,
+eat
+.Dq breakfast
+and go to sleep.
+I listened to this album
+walking on completely empty
+big city streets
+in the dark.
+.
+.Ss Buffy Sainte-Marie \(em Up Where We Belong
+I started listening to this album
+after hearing it many mornings
+walking into the cafe on my block
+back in 2019.
+I could tell Vincent was working
+if I heard this when I opened the door.
+.
+.Ss Molasses \(em Trilogie: Toil & Peaceful Life
+I listened to this when I had 8am classes
+in CEGEP.
+In particular my first semester philosophy course,
+which was in the forum.
+I usually got there even earlier
+because of how the bus schedules worked out.
+There was another girl in my class,
+who I always sat next to,
+who also got there early,
+but we never spoke outside of class.
+.
+.Ss Arcade Fire \(em Funeral
+This album just feels like walking outside
+in fresh snow in early winter,
+you know?
+.
+.Ss Molasses \(em Trouble at Jinx Hotel
+I listened to this when I was looking for an apartment.
+I specifically remember listening to it
+walking down Clark toward my new place
+to pick up my keys.
+.
+.Ss Arcade Fire \(em Neon Bible
+The song
+.Dq "No Cars Go"
+is strongly associated for me
+with my earliest gender feelings.
+It's how I date when I first
+started to feel like something was wrong.
+The Suburbs was released in 2010,
+so I was probably listening to Neon Bible
+in 2011.
+Ten years between that
+and coming out.
+.
+.Ss "Do Make Say Think" \(em "You You're a History In Rust"
+I remember hearing
+.Dq "A Tender History In Rust"
+for the first time
+at the office of my first job.
+Me and my coworkers stayed late,
+probably on a Friday night,
+drinking free tech startup booze.
+.
+.Ss mewithoutYou \(em It's All Crazy! It's All False! It's All a Dream! It's Alright
+I exclusively listened to this album
+on a high school trip to Europe.
+Every morning when we got on the bus,
+I heard
+.Dq Every Thought a Thought of You
+and every night before bed
+I listened to
+.Dq The King Beetle on a Coconut Estate .
+.
+.Ss Arcade Fire \(em The Suburbs
+I listened to this album a tonne
+when I was playing
+Minecraft and Urban Terror
+with my online friends
+while I was in high school.
+In particular I remember
+a backyard shed World of Padman map
+and the apartments Minecraft world.
+.
+.Ss Arcade Fire \(em Reflektor
+I associate
+.Dq Afterlife
+with the walk between Laurier metro
+and my first job,
+in the winter.
+Must've just been how the timing worked out
+with my commute at the time.
+.
+.Ss Swans \(em To Be Kind
+I listened to this on one of my playthroughs
+of Half-Life 2.
+In particular I associate
+.Dq Bring the Sun / Toussaint L'Ouverture
+with the Water Hazard chapter.
+.
+.Ss Wrekmeister Harmonies \(em Light Falls
+For a while I put this on whenever I
+left my apartment to go somewhere
+and it was already dark,
+so probably winter.
+.
+.Ss St. Vincent \(em MASSEDUCTION
+This,
+along with the next one,
+I think were all I listened to
+on a family vacation
+to Quebec City and New Brunswick
+some years ago.
+.
+.Ss SOPHIE \(em Oil of Every Pearl's Un-Insides
+Many hours on the road
+on that family vacation.
+Two albums on repeat.
+.
+.Ss Julia Holter \(em Aviary
+This is another album
+I listened to when I was taking
+walks at 4am.
+I wasn't in a good place.
+Yet.
+.
+.Ss Beep Test \(em Laugh Track
+A tape from the first act
+at one of my favourite shows
+I've ever been to,
+at La Sotterenea
+in Suoni 2019.
+I wish I had been out already.
+.
+.Ss The Armed \(em Only Love
+The third of the albums I listened to
+on those dark walks.
+I listened to it loud,
+this album's mixing needs it.
+.
+.Ss Eliza Kavtion \(em The Rez That Summer
+A favourite local artist.
+I remember vividly the first time
+I heard her play,
+opening for Wrekmeister Harmonies
+at La Vitrola in 2018.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/041-albums-2022.7 b/www/text.causal.agency/041-albums-2022.7
new file mode 100644
index 00000000..48bd3c3d
--- /dev/null
+++ b/www/text.causal.agency/041-albums-2022.7
@@ -0,0 +1,185 @@
+.Dd December 21, 2022
+.Dt ALBUMS-2022 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm albums 2022
+.Nd review
+.
+.Sh DESCRIPTION
+it's the year-end review
+of albums I listened to.
+same as last year,
+I added any albums I got into
+this year to a playlist.
+I've actually done that
+every year since 2018.
+maybe I'll review
+those old playlists some time.
+.
+.Ss ZHAOZE \(em SUMMER INSECTS TALK ABOUT ICE (2021)
+it's a five-and-a-half-minute album!
+you can loop it however long you want.
+it's really lovely.
+.Pp
+favourite track:
+ON HORSEBACK, TO FARAWAY
+.
+.Ss KATE BUSH \(em HOUNDS OF LOVE (1985)
+first of all I do not watch that one show.
+I've known that track for a while actually.
+I mean I probably first heard the CHROMATICS cover.
+but anyway,
+I think someone mentioned this album
+on IRC at just the right time
+and I put it on.
+the second half really shines tbh.
+love a concept album.
+.Pp
+favourite tracks:
+RUNNING UP THAT HILL,
+HOUNDS OF LOVE,
+AND DREAM OF SHEEP,
+WATCHING YOU WITHOUT ME,
+THE MORNING FOG.
+.
+.Ss GODSPEED YOU! BLACK EMPEROR \(em ALL LIGHTS FUCKED ON THE HAIRY AMP DROOLING (1994)
+didn't expect to hear this probably ever.
+still wild that it finally got uploaded.
+and to be honest I'm a little mad
+that it's actually good.
+like yeah it's not a godspeed album
+but it holds up as a tape on its own.
+it's the kind of shit I listen to.
+also can't believe some people
+still thought it was fake.
+like have you not heard
+any other efrim menuck projects?
+.Pp
+favourite tracks:
+$13.13,
+DIMINISHING SHINE,
+DADMOMDADDY,
+333 FRAMES PER SECOND,
+ALL ANGELS GONE.
+.
+.Ss BLACK DRESSES \(em FORGET YOUR OWN FACE (2022)
+woops I think I only listened to this like twice.
+will need to revisit it later for sure.
+I'll like it.
+.
+.Ss BACKXWASH \(em I LIE HERE BURIED WITH MY RINGS AND MY DRESSES (2021)
+only got into this album
+after hearing it live this summer.
+was the first show I went to in years
+and it was really fucking good.
+gotta listen to this shit loud.
+sampling godspeed for a beat fucks.
+honestly back to back bangers.
+.Pp
+favourite tracks:
+I LIE HERE BURIED WITH MY RINGS AND MY DRESSES,
+TERROR PACKETS,
+SONG OF SINNERS,
+BURN TO ASHES.
+.
+.Ss PHILIP GLASS ENSEMBLE \(em EINSTEIN ON THE BEACH (1979)
+actually just the knee plays
+because I can't be bothered
+listening to all of it.
+and I'm embarrassed by how much
+I enjoy this avant-garde bullshit.
+like ok just sing repeating numbers at me
+and my brain is happy.
+what is this?
+my kink?
+anyway I also have kind of an obsession
+with the
+.Dq story of love
+in knee 5.
+I fucking hate it.
+but it's delivered so well.
+and that violin though!
+.Pp
+favourite tracks:
+KNEE 1,
+KNEE 5.
+.
+.Ss KANYE WEST \(em YEEZUS (2013)
+ok look I listened to this
+before recent events.
+what the fuck.
+it's a really good album though?
+pretty sure I listened to it
+because bound 2 kept getting in my head,
+because of that minecraft parody parody
+wayne did ages ago.
+.Pp
+favourite tracks:
+BLACK SKINHEAD,
+HOLD MY LIQUOR,
+BLOOD ON THE LEAVES,
+BOUND 2.
+.
+.Ss FLYING RACCOON SUIT \(em AFTERGLOW (2021)
+I've listened to the whole album
+a few times
+but I'm mostly just here
+for the title track.
+this also happened to be
+dropped in IRC at just the right time.
+good ska-punk-type shit.
+and I like lisps ok.
+.Pp
+favourite track:
+AFTERGLOW.
+.
+.Ss RAMSHACKLE GLORY \(em LIVE THE DREAM (2011)
+one of those albums
+I don't know why I took so long
+to get to.
+I've been listening to johnny hobo
+since I was like in high school.
+ramshackle is a little more hopeful
+and I love that.
+your heart is a muscle the size of your fist.
+keep on loving.
+keep on fighting.
+.Pp
+favourite tracks:
+WE ARE ALL COMPOST IN TRAINING,
+NEVER COMING HOME,
+YOUR HEART IS A MUSCLE THE SIZE OF YOUR FIST.
+.
+.Ss LES RALLIZES D\('ENUD\('ES \(em THE OZ TAPES (2022)
+a pleasant surprise in someone's playlist.
+lately I've been listening to this
+in the metro to or from electrolysis.
+it's good listening for that.
+bold to have two versions
+of the same 24-minute song
+on the same release.
+.Pp
+favourite tracks:
+A SHADOW ON OUR JOY,
+THE LAST ONE_1970 (ver.2).
+.
+.Ss LINGUA IGNOTA \(em SINNER GET READY (2021)
+another I'm only getting into
+after hearing it live.
+just last sunday actually.
+was a good show.
+people will go wild
+to hear a cover live for real.
+.Pp
+favourite tracks:
+I WHO BEND THE TALL GRASSES,
+PENNSYLVANIA FURNACE,
+PERPETUAL FLAME OF CENTRALIA.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+I started writing this
+before I saw LINGUA IGNOTA.
+good thing I waited.
diff --git a/www/text.causal.agency/042-comfort-music.7 b/www/text.causal.agency/042-comfort-music.7
new file mode 100644
index 00000000..445e04c3
--- /dev/null
+++ b/www/text.causal.agency/042-comfort-music.7
@@ -0,0 +1,62 @@
+.Dd February 23, 2024
+.Dt COMFORT-MUSIC 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm comfort music
+.Nd feel better
+.
+.Sh DESCRIPTION
+it's been a while.
+and I'm on almost no sleep
+and haven't eaten a real meal
+since noon.
+which is a state I've written
+at least a couple posts in before,
+so what better time
+to return to what has apparently
+become this blog's format:
+lists of some music I like.
+.
+.Pp
+this is a list of music that comforts me.
+.
+.Bl -bullet
+.It
+knee play 5, from einstein on the beach.
+I like the organ and the counting and the cadence of the story.
+.It
+low \(em words.
+and I'm tired.
+.It
+godspeed you! black emperor \(em storm.
+this is like my original comfort music.
+been listening to it since I was teenage.
+the grooves are worn deep in my mind.
+.It
+set fire to flames \(em love song for 15 ontario (w/ singing police car).
+I like how it ends.
+.It
+va, from the beginner's guide.
+I think that's the whole point.
+though maybe it's too sad
+to be truly comforting.
+.It
+undertale, from undertale.
+what can I say?
+.It
+wrekmeister harmonies \(em covered in blood from invisible wounds.
+I find quite a bit of the album comforting really.
+I'm picking this one because I like the cadence
+of the lyrics.
+.It
+lingua ignota \(em pennsylvania furnace and perpetual flame of centralia.
+these are really my go to in recent times.
+I like waiting for the next line.
+.El
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
+.Pp
+I don't think I've said anything
+very interesting here.
diff --git a/www/text.causal.agency/043-little-blessings.7 b/www/text.causal.agency/043-little-blessings.7
new file mode 100644
index 00000000..957c6289
--- /dev/null
+++ b/www/text.causal.agency/043-little-blessings.7
@@ -0,0 +1,78 @@
+.Dd March 24, 2024
+.Dt LITTLE-BLESSINGS 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm little blessings
+.Nd life's
+.
+.Sh DESCRIPTION
+today I went out to go around.
+run some errands and do some shopping.
+along the way I was given
+several of life's little blessings.
+.
+.Pp
+while walking on ste-cath
+between berri and complexe desjardins,
+there was a somewhat disheveled man
+walking in the same direction and singing.
+he had a beautiful voice.
+he was singing a sad song in french,
+and he sung it well and enunciated every word.
+.
+.Pp
+in the mcdonald's at complexe desjardins,
+while waiting for my order,
+there were what appeared to be
+a teenager and her younger brother,
+who must have been
+looking at the display of
+current happy meal toys.
+the teenager was playing smash or pass,
+to the amusement of the younger one.
+they got ice cream
+and ate it across the room from me downstairs.
+.
+.Pp
+later,
+taking the 24 home from atwater
+carrying my new vacuum cleaner,
+the bus got lost.
+I think the driver missed the stop
+and tried to compensate
+by turning north onto peel
+and stopping there.
+but then he had to keep going up peel.
+he turned right onto docteur-penfield,
+which just brings you further up the mountain.
+when it met des pins,
+he turned left and pulled over,
+asking for guidance over the radio.
+we got moving again,
+back towards peel.
+that's how I ended up
+on a 24
+.Dq sherbrooke
+east,
+facing west on des pins.
+it was actually quite scenic.
+and amusing.
+I was in no rush.
+.
+.Pp
+after getting back onto sherbrooke,
+the bus had to take another detour,
+this one planned.
+so my ride on the 24,
+which normally only drives on sherbrooke,
+ended up going on peel,
+docteur-penfield,
+des pins,
+de bleury,
+ren\('e-l\('evesque
+and saint-laurent.
+it was a very exciting bus trip.
+.
+.Sh AUTHORS
+.An june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/044-film-review.7 b/www/text.causal.agency/044-film-review.7
new file mode 100644
index 00000000..8e8feca8
--- /dev/null
+++ b/www/text.causal.agency/044-film-review.7
@@ -0,0 +1,208 @@
+.Dd October 12, 2024
+.Dt FILM-REVIEW 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm film review
+.Nd stock, that is
+.
+.Sh DESCRIPTION
+this summer I got really into analog photography.
+I've tried out a bunch of different film stocks,
+thanks to the local photo lab,
+and I've
+.Em developed
+(pun intended)
+some preferences.
+here they are.
+.
+.Sh BLACK & WHITE
+.Bl -enum
+.It
+Ilford FP4+ (ISO 125, United Kingdom)
+.Pp
+definitely my favourite b&w film.
+I love the fine grain and contrast
+with good shadow detail.
+really just exactly what I want
+out of a b&w film I think.
+ISO 125 is quite generous for what it is,
+but it's still best suited for sunny days.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-09-29/
+.
+.It
+Fomapan Creative (ISO 200, Czech Republic)
+.Pp
+I've only shot one roll of this so far,
+but I really like the balance it strikes
+between fine grain and high speed.
+it just seems like a good go-to film
+for what I like to do with b&w photography,
+given the extra flexibility over FP4.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-09-14/
+.
+.It
+Ferrania P30 (ISO 80, Italy)
+.Pp
+another that I've only shot one roll of,
+but I really like the results.
+obviously it swings in the other direction
+in terms of film sensitivity,
+but more importantly
+it has a distinctive look.
+that's harder in b&w than it is in colour!
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-10-05/
+.
+.It
+Ilford Delta 100 (United Kingdom)
+.Pp
+as far as I'm concerned this is just more expensive FP4.
+it certainly looks good
+but I'd rather save the couple extra dollars.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-09-22/
+.
+.It
+Ilford HP5+ (ISO 400, United Kingdom)
+.Pp
+it's like, ok.
+more grainy than I'd like,
+but that's to be expected of high speed.
+my real problem with it
+is the lack of contrast.
+maybe I should only be shooting it pushed,
+but I don't want to pay the extra fee
+to have my local photo lab do that.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-09-07/
+.
+.It
+Fomapan Action (ISO 400, Czech Republic)
+.Pp
+I almost wonder if something went wrong
+either in shooting or processing
+the one roll of this I shot.
+everything came out very low contrast.
+.Pp
+sample:
+I didn't end up uploading any.
+.El
+.
+.Sh COLOUR
+.Bl -enum
+.It
+Shanghai Color (ISO 400, China)
+.Pp
+I love the desaturated colours
+and the grain on this.
+I guess I like fine grain in b&w
+and coarse grain in colour.
+I think this is well suited
+to the subjects I like to photograph,
+like old brick buildings,
+but it also does nature quite nicely.
+I think this will be a good one to capture fall with.
+.Pp
+ok so this is almost certainly repackaged
+Wolfen Color NC500
+(made in germany).
+but the thing is,
+shanghai does a better job packaging it.
+they use real metal cassettes
+and add film edge markings.
+and their box design is way nicer.
+and on top of THAT,
+my local photo lab
+sells it for cheaper than NC500.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-09-22/
+.
+.It
+Harman Phoenix (ISO 200, United Kingdom)
+.Pp
+phoenix is a fun film!
+the lack of yellow filter
+and anti-halation layer
+can produce some neat effects.
+in the right conditions
+it also sometimes looks exceedingly normal.
+but it also sometimes just...
+doesn't work well.
+underexposed areas can get really bad.
+apparently it can be better to shoot it at ISO 100.
+I should give that a try,
+or just be more diligent with
+how I'm metering.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-08-10/
+.
+.It
+CineStill 800T (USA?)
+.Pp
+I can't really say much about this yet.
+I don't have much experience with indoor photography.
+the lack of anti-halation layer
+does tend to make lights look sinister as hell, though.
+I'll probably shoot
+one of the cheaper repackagings
+of ISO 800 cinema film
+in the future.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-10-06/
+.
+.It
+Film Washi
+.Dq X
+(ISO 100, France)
+.Pp
+this is mostly pretty normal film
+without a yellow filter.
+not much to say about it.
+I'd be more interested to try washi's
+other repackaged b&w technical films,
+but I think I missed them being in stock here.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-08-23/
+.
+.It
+Fujifilm 400 (Japan?)
+.Pp
+I shot my two first ever rolls on this.
+they were surprisingly good!
+the scans did the film dirty though.
+that was before I found the good photo lab.
+.
+.It
+Kodak Gold (ISO 200, USA)
+.Pp
+ok so this is a cheap film, right?
+but it's too damn good.
+fine grain, accurate colour.
+it looks like digital to me,
+and that's not what I want.
+even fuji has a little more character to it than this.
+puts me off kodak.
+.Pp
+sample:
+.Lk https://photo.causal.agency/2024-07-01/
+.El
+.
+.Sh AUTHORS
+.An Juniper Aq Mt june@causal.agency
+.
+.Pp
+if you have suggestions
+for film stocks I should try,
+send me an email.
diff --git a/www/text.causal.agency/Makefile b/www/text.causal.agency/Makefile
index c1b79645..6b1bd02f 100644
--- a/www/text.causal.agency/Makefile
+++ b/www/text.causal.agency/Makefile
@@ -1,4 +1,4 @@
-WEBROOT = /usr/local/www/text.causal.agency
+WEBROOT = /var/www/text.causal.agency
 
 TXTS += 001-make.txt
 TXTS += 002-writing-mdoc.txt
@@ -10,19 +10,58 @@ TXTS += 007-cgit-setup.txt
 TXTS += 008-how-irc.txt
 TXTS += 009-casual-update.txt
 TXTS += 010-irc-suite.txt
+TXTS += 011-libretls.txt
+TXTS += 012-inability.txt
+TXTS += 013-hot-tips.txt
+TXTS += 014-using-vi.txt
+TXTS += 015-reusing-tags.txt
+TXTS += 016-using-openbsd.txt
+TXTS += 017-unpasswords.txt
+TXTS += 018-operating-systems.txt
+TXTS += 019-mailing-list.txt
+TXTS += 020-c-style.txt
+TXTS += 021-time-machine.txt
+TXTS += 022-swans-are-dead.txt
+TXTS += 023-sparse-checkout.txt
+TXTS += 024-seprintf.txt
+TXTS += 025-v6-pwd.txt
+TXTS += 026-git-comment.txt
+TXTS += 027-openbsd-linode.txt
+TXTS += 028-names.txt
+TXTS += 029-topics.txt
+TXTS += 030-discs.txt
+TXTS += 031-books-2021.txt
+TXTS += 032-albums-2021.txt
+TXTS += 033-jorts.txt
+TXTS += 034-voices.txt
+TXTS += 035-addendum-2021.txt
+TXTS += 036-compassion.txt
+TXTS += 037-care.txt
+TXTS += 038-agency.txt
+TXTS += 039-apologies.txt
+TXTS += 040-sound-memory.txt
+TXTS += 041-albums-2022.txt
+TXTS += 042-comfort-music.txt
+TXTS += 043-little-blessings.txt
+TXTS += 044-film-review.txt
 
-all: ${TXTS}
+all: colb ${TXTS}
 
-.SUFFIXES: .7 .txt
+.SUFFIXES: .7 .fmt .txt
 
 .7.txt:
-	mandoc $< | col -bx > $@
+	mandoc -T utf8 $< | ./colb > $@
+	touch -m -r $< $@
 
-feed.atom: feed.sh ${TXTS}
+.fmt.txt:
+	fmt $< | sed '1,/^$$/d' > $@
+	touch -m -r $< $@
+
+feed.atom: feed.sh colb ${TXTS}
 	sh feed.sh > feed.atom
 
 clean:
-	rm -f ${TXTS} feed.atom
+	rm -f colb ${TXTS} feed.atom
 
-install: ${TXTS} feed.atom
+install: colb ${TXTS} feed.atom
 	install -p -m 644 ${TXTS} feed.atom ${WEBROOT}
diff --git a/www/text.causal.agency/colb.c b/www/text.causal.agency/colb.c
new file mode 100644
index 00000000..5faabc3a
--- /dev/null
+++ b/www/text.causal.agency/colb.c
@@ -0,0 +1,16 @@
+#include <locale.h>
+#include <stdio.h>
+#include <wchar.h>
+int main(void) {
+	setlocale(LC_CTYPE, "en_US.UTF-8");
+	wint_t next, prev = WEOF;
+	while (WEOF != (next = getwchar())) {
+		if (next == L'\b') {
+			prev = WEOF;
+		} else {
+			if (prev != WEOF) putwchar(prev);
+			prev = next;
+		}
+	}
+	if (prev != WEOF) putwchar(prev);
+}
diff --git a/www/text.causal.agency/feed.sh b/www/text.causal.agency/feed.sh
index de9e7c54..71bbf662 100644
--- a/www/text.causal.agency/feed.sh
+++ b/www/text.causal.agency/feed.sh
@@ -4,33 +4,53 @@ set -eu
 readonly Root='https://text.causal.agency'
 
 updated=$(date -u '+%FT%TZ')
-cat <<- EOF
+cat <<-EOF
 	<?xml version="1.0" encoding="utf-8"?>
 	<feed xmlns="http://www.w3.org/2005/Atom">
 	<title>Causal Agency</title>
 	<author><name>June</name><email>june@causal.agency</email></author>
 	<link href="${Root}"/>
-	<id>${Root}</id>
+	<link rel="self" href="${Root}/feed.atom"/>
+	<id>${Root}/</id>
 	<updated>${updated}</updated>
 EOF
 
-for entry in *.7; do
-	url="${Root}/${entry%.7}.txt"
+encode() {
+	sed '
+		s/&/\&amp;/g
+		s/</\&lt;/g
+		s/"/\&quot;/g
+	' "$@"
+}
+
+set -- *.txt
+shift $(( $# - 20 ))
+for txt; do
+	entry="${txt%.txt}.7"
+	test -f "$entry" || entry="${txt%.txt}.fmt"
 	date=$(grep '^[.]Dd' "$entry" | cut -c 5-)
-	title=$(grep '^[.]Nm' "$entry" | cut -c 5-)
-	summary=$(grep '^[.]Nd' "$entry" | cut -c 5-)
+	title=$(grep -m 1 '^[.]Nm' "$entry" | cut -c 5- | encode)
+	summary=$(grep '^[.]Nd' "$entry" | cut -c 5- | encode)
 	published=$(date -ju -f '%B %d, %Y %T' "${date} 00:00:00" '+%FT%TZ')
 	mtime=$(stat -f '%m' "$entry")
 	updated=$(date -ju -f '%s' "$mtime" '+%FT%TZ')
-	cat <<- EOF
+	cat <<-EOF
 		<entry>
 		<title>${title}</title>
 		<summary>${summary}</summary>
-		<link href="${url}"/>
-		<id>${url}</id>
+		<link href="${Root}/${txt}"/>
+		<id>${Root}/${txt}</id>
 		<published>${published}</published>
 		<updated>${updated}</updated>
-		<content type="text/plain" src="${url}"/>
+		<content type="xhtml">
+		<div xmlns="http://www.w3.org/1999/xhtml">
+	EOF
+	printf '<pre>'
+	encode "$txt"
+	cat <<-EOF
+		</pre>
+		</div>
+		</content>
 		</entry>
 	EOF
 done