summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--etc/pronouns/.gitignore2
-rw-r--r--etc/pronouns/bot.sh69
-rwxr-xr-xhome/.local/bin/masto12
-rw-r--r--txt/books.txt9
-rw-r--r--txt/shows.txt1
-rw-r--r--www/causal.agency/Makefile2
-rw-r--r--www/causal.agency/dais.html11
-rw-r--r--www/causal.agency/index.721
-rw-r--r--www/photo.causal.agency/.gitignore7
-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-002A.txt10
-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-017A.txt3
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-019A.txt4
-rw-r--r--www/photo.causal.agency/2024-06-12/R1-07671-022A.txt8
-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/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.html68
-rw-r--r--www/photo.causal.agency/generate.sh92
-rw-r--r--www/photo.causal.agency/mastodon.sh54
-rw-r--r--www/photo.causal.agency/trips.html373
-rw-r--r--www/text.causal.agency/044-film-review.7208
-rw-r--r--www/text.causal.agency/045-time-2025.7131
-rw-r--r--www/text.causal.agency/Makefile2
-rw-r--r--www/they.causal.agency/Makefile4
-rw-r--r--www/they.causal.agency/post-update.sh41
89 files changed, 1074 insertions, 444 deletions
diff --git a/etc/pronouns/.gitignore b/etc/pronouns/.gitignore
new file mode 100644
index 00000000..facfb3f3
--- /dev/null
+++ b/etc/pronouns/.gitignore
@@ -0,0 +1,2 @@
+access_token
+[1-9]*
diff --git a/etc/pronouns/bot.sh b/etc/pronouns/bot.sh
new file mode 100644
index 00000000..8b7c9802
--- /dev/null
+++ b/etc/pronouns/bot.sh
@@ -0,0 +1,69 @@
+#!/bin/sh
+set -eu
+
+Instance=https://mstdn.isometry.group
+
+if ! test -f access_token; then
+	echo 'No access_token!' >&2
+	exit 1
+fi
+
+post=true
+while getopts 'n' opt; do
+	case $opt in
+		(n) post=false;;
+		(?) exit 1;;
+	esac
+done
+shift $((OPTIND - 1))
+
+access_token=$(cat access_token)
+
+account_id=$(
+	curl -Ss \
+		-H "Authorization: Bearer ${access_token}" \
+		${Instance}/api/v1/accounts/verify_credentials |
+	jq -r .id
+)
+
+# XXX: no pagination because I don't expect this to ever have over 80 followers
+followers=$(
+	curl -Ss \
+		-H "Authorization: Bearer ${access_token}" \
+		"${Instance}/api/v1/accounts/${account_id}/followers?limit=80" |
+	jq -r 'map(select(.acct | contains("@") | not)) | .[].id'
+)
+
+for follower_id in $followers 112284333737697665; do
+	account=$(
+		curl -Ss \
+			-H "Authorization: Bearer ${access_token}" \
+			${Instance}/api/v1/accounts/${follower_id}
+	)
+	username=$(printf '%s' "${account}" | jq -r .username)
+	pronouns=$(
+		printf '%s' "${account}" |
+		jq -r '
+			.fields |
+			map(select(.name | test("^prono(un|m)s?[?]?$|^((professional|leisure|casual) |anti-)no(un|m)s?$"; "i"))) |
+			.[].value
+		'
+	)
+	if ! test -f $follower_id; then
+		printf '%s' "${pronouns}" >$follower_id
+		continue
+	fi
+	old_pronouns=$(cat $follower_id)
+	if [ "${pronouns}" != "${old_pronouns}" ]; then
+		text=$(printf '%s' "${pronouns}" | dehtml)
+		if $post; then
+			curl -Ss -X POST \
+				-H "Authorization: Bearer ${access_token}" \
+				-F visibility=unlisted \
+				--form-string \
+				"status=@${username} has changed pronouns to: ${text}" \
+				${Instance}/api/v1/statuses >/dev/null
+		fi
+		printf '%s' "${pronouns}" >$follower_id
+	fi
+done
diff --git a/home/.local/bin/masto b/home/.local/bin/masto
new file mode 100755
index 00000000..9fdbfdf1
--- /dev/null
+++ b/home/.local/bin/masto
@@ -0,0 +1,12 @@
+#!/bin/sh
+set -eu
+
+outbox=$1
+pattern=$2
+
+jq -r "
+	.orderedItems[] |
+	select(.object | type == \"object\") | .object |
+	select(.content | test(\"${pattern}\")) |
+	\"\\(.content)\\n\\(.url)\\n\"
+" "$outbox" | dehtml
diff --git a/txt/books.txt b/txt/books.txt
index fc3fb203..d8166d72 100644
--- a/txt/books.txt
+++ b/txt/books.txt
@@ -1,5 +1,14 @@
+[ 2025 ]
+
+  5. ★★★ Alix E. Harrow, The Everlasting
+  4. ★★☆ Arkady Martine, Rose/House
+  3. ★★☆ H. E., second draft of Last Train Home
+  2. ★★☆ Nicola Griffith, Spear
+  1. ★★☆ Ruthanna Emrys, A Half-Built Garden
+
 [ 2024 ]
 
+  2. ★☆☆ R. A. MacAvoy, Tea with the Black Dragon
   1. ★☆☆ Sybil Lamb, The Girl Who Was Convinced Beyond All Reason That She Could Fly
 
 [ 2023 ]
diff --git a/txt/shows.txt b/txt/shows.txt
index 2abacf5b..a9c5ee95 100644
--- a/txt/shows.txt
+++ b/txt/shows.txt
@@ -1,3 +1,4 @@
+2024-06-21 (La Sala Rossa) MAGELLA, Quinton Barnes, BACKXWASH
 2022-12-18 (SAT) LINGUA IGNOTA
 2022-06-04 (MAI) Honeydrip, MAGELLA, BACKXWASH
 2020-01-23 (La Sala Rossa) Secondsight, BIG|BRAVE
diff --git a/www/causal.agency/Makefile b/www/causal.agency/Makefile
index 8c74f8f1..d3af7265 100644
--- a/www/causal.agency/Makefile
+++ b/www/causal.agency/Makefile
@@ -1,7 +1,7 @@
 WEBROOT = /var/www/causal.agency
 
 GEN = index.html scheme.css scheme.png
-FILES = ${GEN} style.css alpha.html lands.html
+FILES = ${GEN} style.css alpha.html dais.html lands.html
 
 all: ${FILES}
 
diff --git a/www/causal.agency/dais.html b/www/causal.agency/dais.html
new file mode 100644
index 00000000..109654d3
--- /dev/null
+++ b/www/causal.agency/dais.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Dais</title>
+<meta charset="utf-8">
+<style>
+body { line-height: 1.5em; max-width: 78ch; margin: auto; padding: 0.5em 1ch; }
+</style>
+
+<h1>First occurrences of the word “dais”</h1>
+<ol>
+<li>A. K. Larkwood, The Unspoken Name: p. 19
+</ol>
diff --git a/www/causal.agency/index.7 b/www/causal.agency/index.7
index 1e019574..bc212a5e 100644
--- a/www/causal.agency/index.7
+++ b/www/causal.agency/index.7
@@ -1,10 +1,10 @@
-.Dd April 18, 2024
+.Dd August 27, 2025
 .Dt CAUSAL.AGENCY 7
 .Os "Causal Agency"
 .
 .Sh NAME
 .Nm june
-.Nd computer enthusiast (she/her)
+.Nd enthusiast (she/they)
 .
 .Sh SYNOPSIS
 .Nm mail
@@ -15,26 +15,21 @@ in
 on tilde.chat
 .
 .Sh DESCRIPTION
-I make mostly IRC software in C.
-I like
-.Ox
-but also the GPL.
-I just want to read books
-and try to learn to be kinder.
-When I can I'd like to talk to strangers
-and experience more magic.
+primarily a photographer these days.
+I used to write IRC software in C.
+I still use it every day.
 .
 .Pp
-.Lk https://git.causal.agency code
+.Lk https://photo.causal.agency photos
 \(em
 .Lk https://text.causal.agency words
 \(em
-.Lk https://photo.causal.agency photos
+.Lk https://git.causal.agency code
 \(em
 .Lk /list/ mailist
 .
 .Pp
-These are some things I've done:
+these are some computer things I've done:
 .Bl -tag -width Ds
 .It Lk https://git.causal.agency/pounce/about pounce
 a multi-client-first IRC bouncer
diff --git a/www/photo.causal.agency/.gitignore b/www/photo.causal.agency/.gitignore
index a5f66a9d..22c11f6e 100644
--- a/www/photo.causal.agency/.gitignore
+++ b/www/photo.causal.agency/.gitignore
@@ -1,2 +1,7 @@
-static/
+[0-9]*/
+*.jpg
 *.JPG
+app.json
+posted.txt
+static/
+token.json
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0832.txt b/www/photo.causal.agency/2024-04-10/IMG_0832.txt
deleted file mode 100644
index 65724024..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0832.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 4cbb3def..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0850.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 707d7cd6..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0852.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 42f243e4..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0858.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index ca33d7e0..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0859.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 7a955fc2..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0865.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index 9d2cdc43..00000000
--- a/www/photo.causal.agency/2024-04-10/IMG_0890.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index f4803ee2..00000000
--- a/www/photo.causal.agency/2024-04-14/IMG_1054.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index 21aeb189..00000000
--- a/www/photo.causal.agency/2024-04-14/IMG_1058.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 81747287..00000000
--- a/www/photo.causal.agency/2024-04-14/IMG_1066.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-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
deleted file mode 100644
index e18bd6c7..00000000
--- a/www/photo.causal.agency/2024-04-19/IMG_1158.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index 525a4bf3..00000000
--- a/www/photo.causal.agency/2024-04-20/IMG_1225.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index faee1be9..00000000
--- a/www/photo.causal.agency/2024-04-20/IMG_1234.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index c971da91..00000000
--- a/www/photo.causal.agency/2024-04-20/IMG_1245.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 5158c533..00000000
--- a/www/photo.causal.agency/2024-04-20/IMG_1253.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index 4780f8b5..00000000
--- a/www/photo.causal.agency/2024-04-20/IMG_1254.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 27f87311..00000000
--- a/www/photo.causal.agency/2024-04-30/IMG_1619.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 08624d6e..00000000
--- a/www/photo.causal.agency/2024-05-03/IMG_1684.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index 182319f2..00000000
--- a/www/photo.causal.agency/2024-05-03/IMG_1692.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index d325d518..00000000
--- a/www/photo.causal.agency/2024-05-03/IMG_1706.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 2dd5bb3d..00000000
--- a/www/photo.causal.agency/2024-05-03/IMG_1724.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index ca51034b..00000000
--- a/www/photo.causal.agency/2024-05-03/IMG_1730.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 29bc3a76..00000000
--- a/www/photo.causal.agency/2024-05-03/IMG_1748.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 78fe46a7..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_1951.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index 6276a710..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_1969.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index b23e190b..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_1973.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index ddbc0a2b..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_1996.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 42cf62cc..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_1998.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index 60518f52..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_2009.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 48494b77..00000000
--- a/www/photo.causal.agency/2024-05-06/IMG_2015.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 5a08757c..00000000
--- a/www/photo.causal.agency/2024-05-31/IMG_2078.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index d88645c5..00000000
--- a/www/photo.causal.agency/2024-05-31/IMG_2079.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index b8ed4fc5..00000000
--- a/www/photo.causal.agency/2024-05-31/IMG_2084.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 26b1e1cd..00000000
--- a/www/photo.causal.agency/2024-05-31/IMG_2103.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 7702a374..00000000
--- a/www/photo.causal.agency/2024-05-31/IMG_2114.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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-002A.txt b/www/photo.causal.agency/2024-06-08/R1-07534-002A.txt
deleted file mode 100644
index 6a70030e..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-002A.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-profile of Ayla on the couch in our apartment.
-behind her on the left of the frame is a warm brick wall.
-there's a band from what might be a light leak
-just to the right of her head.
-I've DIY replaced the light seals
-on this camera so we'll see how it looks
-on the next roll.
-there's also a narrow dark band
-at the right edge of the frame.
-I don't know what's up with that.
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
deleted file mode 100644
index 7affb93a..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-009A.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 4628a2c2..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-011A.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index aabe2b40..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-012A.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index 57fb909b..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-015A.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index a5bb9fa0..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-016A.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index 5da2a186..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-020A.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index d82ec10e..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-024A.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index e891695b..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-026A.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-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
deleted file mode 100644
index dd732a64..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-028A.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index f8be350d..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-030A.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index 3614056a..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-031A.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index 24678e0f..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-032A.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index b9fbf500..00000000
--- a/www/photo.causal.agency/2024-06-08/R1-07534-036A.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index 0555f564..00000000
--- a/www/photo.causal.agency/2024-06-08/film
+++ /dev/null
@@ -1 +0,0 @@
-Fujifilm 400
diff --git a/www/photo.causal.agency/2024-06-08/lens b/www/photo.causal.agency/2024-06-08/lens
deleted file mode 100644
index 13f1fc49..00000000
--- a/www/photo.causal.agency/2024-06-08/lens
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index a233035e..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-002A.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index db048266..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-003A.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-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
deleted file mode 100644
index c6e673d9..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-007A.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index fa47b704..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-009A.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index c71a81ac..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-010A.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 5d2096fa..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-012A.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-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
deleted file mode 100644
index 56d6d814..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-013A.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-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
deleted file mode 100644
index a3cb3fcf..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-015A.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 7c94196c..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-016A.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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-017A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-017A.txt
deleted file mode 100644
index a42ac1da..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-017A.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Ayla lying on the couch,
-head propped up on her arm,
-smiling at her phone.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-019A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-019A.txt
deleted file mode 100644
index 110edad8..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-019A.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Ayla outside in stark lighting
-as the sun was just starting to set,
-looking at some yellow long flowers
-growing on a large bush.
diff --git a/www/photo.causal.agency/2024-06-12/R1-07671-022A.txt b/www/photo.causal.agency/2024-06-12/R1-07671-022A.txt
deleted file mode 100644
index 89dc567e..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-022A.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Ayla looking back
-from halfway down a staircase
-leading towards an old stone building.
-there's a black band
-of underexposed film
-on the right edge of the frame.
-a problem with the shutter
-at slower speeds or something?
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
deleted file mode 100644
index c4383804..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-029A.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 12b5fc48..00000000
--- a/www/photo.causal.agency/2024-06-12/R1-07671-031A.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 0555f564..00000000
--- a/www/photo.causal.agency/2024-06-12/film
+++ /dev/null
@@ -1 +0,0 @@
-Fujifilm 400
diff --git a/www/photo.causal.agency/2024-06-12/lens b/www/photo.causal.agency/2024-06-12/lens
deleted file mode 100644
index 13f1fc49..00000000
--- a/www/photo.causal.agency/2024-06-12/lens
+++ /dev/null
@@ -1 +0,0 @@
-Yashica DSB 50mm ƒ/1.9
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..04cd3781
--- /dev/null
+++ b/www/photo.causal.agency/gear.html
@@ -0,0 +1,68 @@
+<!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)
+<li>Minolta XE-5
+<li>Praktica MTL3
+<li>Zenit-122
+<li>Yashica FX-2
+<li>Yashica-D (Yashikor 80mm f/3.5)
+</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>Minolta MD Rokkor-X 50mm f/1.7 (XE-5 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>Fujifilm X-T5
+<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-X adapter
+<li>Skier CS-700 copy stand
+<li>Valoi 135 & 120 film holders
+<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
index 558b8a54..2fbdcb68 100644
--- a/www/photo.causal.agency/generate.sh
+++ b/www/photo.causal.agency/generate.sh
@@ -35,20 +35,36 @@ encode() {
 }
 
 page_title() {
-	date -j -f '%F' $1 '+%B %e, %Y'
+	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 date=$1
-	local title=$(page_title $date)
-	local lens film
+	local page=$1
+	local title=$(page_title $page)
+	local date body lens film chem note
 
-	if test -f $date/lens; then
-		lens=$(encode $date/lens)
+	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]' \
-				$date/$(ls -1 $date | head -n 1) 2>/dev/null |
+				$page/$(ls -1 $page | head -n 1) 2>/dev/null |
 			sed '
 				s/\([A-Z]\)\([0-9]\)/\1 \2/
 				s,f/,ƒ/,
@@ -57,8 +73,14 @@ page_head() {
 			encode
 		)
 	fi
-	if test -f $date/film; then
-		film=$(encode $date/film)
+	if test -f $page/film; then
+		film=$(encode $page/film)
+	fi
+	if test -f $page/chem; then
+		chem=$(encode $page/chem)
+	fi
+	if test -f $page/note; then
+		note=$(encode $page/note)
 	fi
 
 	cat <<-EOF
@@ -75,7 +97,8 @@ page_head() {
 	details { max-width: 78ch; margin: 0.5em auto; }
 	</style>
 	<h1>${title}</h1>
-	<p>📷 ${lens}${film:+ 🎞️ }${film:-}</p>
+	<p>${date:+📆 }${date:-} 📷 ${body:-}${body:+ 🔘 }${lens:-}${film:+ 🎞️ }${film:-}${chem:+ 🧪 }${chem:-}</p>
+	${note:+<p>}${note:-}${note:+</p>}
 	EOF
 }
 
@@ -101,14 +124,21 @@ photo_id() {
 
 page_photo() {
 	local photo=$1 preview=$2 description=$3
-	if ! test -f $description; then
-		description=/dev/null
-	fi
 	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
@@ -120,11 +150,15 @@ page_photo() {
 			${PhotographicSensitivity} ISO
 		EOF
 	fi
-	cat <<-EOF
+	if test -f $description; then
+		cat <<-EOF
 			<details>
 				<summary>description</summary>
 				$(encode $description)
 			</details>
+		EOF
+	fi
+	cat <<-EOF
 		</figcaption>
 	</figure>
 	EOF
@@ -205,23 +239,37 @@ atom_tail() {
 }
 
 set --
-for date in 20*; do
-	mkdir -p static/${date}
-	page=static/${date}/index.html
+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 $date >$page
-		for photo in ${date}/*.JPG; do
+		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%.JPG}.txt >>$page
+			page_photo $photo $preview ${photo%.[Jj][Pp][Gg]}.txt >>$page
 		done
 	fi
-	set -- $date "$@"
+	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
@@ -229,7 +277,7 @@ 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}/*.JPG; do
+	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
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/trips.html b/www/photo.causal.agency/trips.html
new file mode 100644
index 00000000..e81be6ef
--- /dev/null
+++ b/www/photo.causal.agency/trips.html
@@ -0,0 +1,373 @@
+<!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">
+</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);
+		}
+	}
+	if (trips.length) {
+		selects.forEach(select => select.value = trips[trips.length-1].body);
+	}
+}
+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 || 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();
+}
+
+function setFilms() {
+	let datalist = document.getElementById("films");
+	datalist.innerHTML = "";
+	let films = new Set(trips.reverse().map(trip => trip.film));
+	for (let film of films.values().take(20)) {
+		let option = document.createElement("option");
+		option.innerText = film;
+		datalist.appendChild(option);
+	}
+}
+setFilms();
+
+</script>
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/045-time-2025.7 b/www/text.causal.agency/045-time-2025.7
new file mode 100644
index 00000000..80fa428b
--- /dev/null
+++ b/www/text.causal.agency/045-time-2025.7
@@ -0,0 +1,131 @@
+.Dd August 18, 2025
+.Dt TIME-2025 7
+.Os "Causal Agency"
+.
+.Sh NAME
+.Nm time
+.Nd 2025
+.
+.Sh DESCRIPTION
+time has passed.
+this blog still exists.
+I don't feel bad about not writing.
+I haven't had anything I want to say in this form.
+.
+.Pp
+I go back and read my own posts here fairly often.
+most recently I looked up how I calculated
+.Dq unique lines of code
+all the way back in 2018.
+I read my own post on apologies a lot.
+I'm glad I wrote that down.
+.
+.Pp
+other people, too,
+still refer to my old posts.
+.Dq operating systems
+has been repeatedly referenced
+by a friend for years.
+I still occasionally get emails in reply to
+.Dq inability .
+I try to wish those people well.
+recently I got asked about
+.Dq names .
+it was interesting trying to explain
+an idea I was playing with four years ago.
+.
+.Pp
+some time in the last year
+I had started writing
+a semi-ficticious history of my life.
+I never finished it
+and I don't think I'm interested in the idea anymore.
+.
+.Pp
+I used to write posts about
+books I'd read
+or albums I'd listened to
+in the year.
+since 2022 I haven't really listened to new music.
+I put a lot of songs I really like
+in a big playlist called
+.Dq more tunes
+and I put that on shuffle
+whenever I want music.
+I don't know why
+music doesn't play the same role
+in my life anymore.
+.
+.Pp
+I've read books since 2021,
+though not at a very high rate.
+I still love Becky Chambers
+and Alix E. Harrow.
+I still need to finish
+the Andrea Stewart trilogy I started.
+I read an old collection
+of short erotic fiction
+by trans authors.
+that was really good.
+I just finished a novel draft by a friend.
+.
+.Pp
+I've shot a lot more film
+since my last post.
+I was wrong about a lot.
+I don't feel like writing more about it.
+.
+.Pp
+in october of 2022
+I started a relationship
+that lasted two years.
+we moved in together in 2023.
+by early 2024 things were going badly.
+in february I posted
+.Dq comfort music .
+I think someone emailed me
+because they didn't think I was doing well.
+I wasn't.
+from summer 2024
+to summer 2025
+was the worst year I've had.
+in october someone I barely knew at the time
+messaged me to ask if I was ok.
+I think I was sitting in a tim hortons
+after getting a blood test.
+I felt bad all the time
+and I didn't know what to do.
+.
+.Pp
+we broke up 2 weeks after 2 years together.
+everything got worse.
+it wasn't a clean breakup.
+I was still clinging onto
+the familiar pieces of the relationship
+that had used to make me happy.
+they didn't anymore.
+it was torture.
+I lived in agony for months.
+I think I lost my mind a little,
+trying to handle things I couldn't.
+.
+.Pp
+in march I went no-contact.
+I started going to therapy.
+I went on a weekend trip to ottawa by myself.
+I looked at art in the national gallery.
+I started trying to become myself again.
+.
+.Pp
+in june I invited people out
+for my 30th birthday.
+I was terrified,
+convinced up until the last second
+that no one was going to come.
+but they did.
+and since then I've been doing better.
+I think I've picked up where I left off,
+at some point in the last few years.
+.
+.Sh AUTHORS
+.Nm june Aq Mt june@causal.agency
diff --git a/www/text.causal.agency/Makefile b/www/text.causal.agency/Makefile
index a8683a20..c9e86ab2 100644
--- a/www/text.causal.agency/Makefile
+++ b/www/text.causal.agency/Makefile
@@ -43,6 +43,8 @@ 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
+TXTS += 045-time-2025.txt
 
 all: colb ${TXTS}
 
diff --git a/www/they.causal.agency/Makefile b/www/they.causal.agency/Makefile
new file mode 100644
index 00000000..81f47ea9
--- /dev/null
+++ b/www/they.causal.agency/Makefile
@@ -0,0 +1,4 @@
+ROOT = /var/www/man
+
+install: post-update.sh
+	install post-update.sh ${ROOT}/post-update
diff --git a/www/they.causal.agency/post-update.sh b/www/they.causal.agency/post-update.sh
new file mode 100644
index 00000000..db2d5936
--- /dev/null
+++ b/www/they.causal.agency/post-update.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+set -eu
+
+do_tree() {
+	tree=$1
+	manpath=$2
+	echo "Copying manuals for ${tree}..."
+	git ls-tree $tree | while read -r mode type hash name; do
+		if [ $type != blob ]; then
+			continue
+		fi
+		case "$name" in
+			(README.7)
+				continue
+				;;
+			(*.[1-9])
+				section=${name##*.}
+				mkdir -p /var/www/man/${manpath}/man${section}
+				git cat-file $type $hash \
+					>/var/www/man/${manpath}/man${section}/${name}
+				;;
+		esac
+	done
+	if test -d /var/www/man/${manpath}; then
+		makewhatis /var/www/man/${manpath}
+		if ! fgrep -q ${manpath} /var/www/man/manpath.conf; then
+			echo $manpath >>/var/www/man/manpath.conf
+			sort -o /var/www/man/manpath.conf /var/www/man/manpath.conf
+		fi
+	fi
+}
+
+do_tree HEAD HEAD
+
+repo=${PWD##*/}
+for tag in $(git tag); do
+	manpath=${repo%.git}-${tag}
+	if ! test -d /var/www/man/${manpath}; then
+		do_tree $tag $manpath
+	fi
+done