summaryrefslogtreecommitdiff
path: root/gemini
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-06-18 19:59:58 +0100
committerJoe Carstairs <me@joeac.net>2026-06-18 20:01:32 +0100
commit2d89475f0b9648e5efcf827d3e01356ee84b5465 (patch)
treeb7e0e41a729e638abc97f287cfb6b1fa772f50d1 /gemini
parentf71fbdafacff125830268a4d7eab29f39f55aec1 (diff)
renames capsule -> gemini
Diffstat (limited to 'gemini')
-rw-r--r--gemini/.editorconfig2
-rw-r--r--gemini/.gitignore8
-rw-r--r--gemini/Makefile34
-rwxr-xr-xgemini/build_loglog.bash131
-rwxr-xr-xgemini/build_longlog.bash38
-rwxr-xr-xgemini/build_microlog.bash38
-rw-r--r--gemini/comitium-data/feeds.txt16
-rw-r--r--gemini/comitium-data/header.gmi4
l---------gemini/content/feed.gmi1
l---------gemini/content/images1
-rw-r--r--gemini/content/index.gmi17
-rw-r--r--gemini/content/logs/index.gmi8
l---------gemini/content/logs/longlog1
l---------gemini/content/subscriptions.gmi1
l---------gemini/microlog1
-rwxr-xr-xgemini/run.sh5
-rw-r--r--gemini/templates/loglog-header.gmi6
-rw-r--r--gemini/templates/longlog-header.gmi3
-rw-r--r--gemini/templates/microlog-header.gmi3
19 files changed, 318 insertions, 0 deletions
diff --git a/gemini/.editorconfig b/gemini/.editorconfig
new file mode 100644
index 0000000..22357a2
--- /dev/null
+++ b/gemini/.editorconfig
@@ -0,0 +1,2 @@
+[*]
+max_line_length = 99999
diff --git a/gemini/.gitignore b/gemini/.gitignore
new file mode 100644
index 0000000..398c8d1
--- /dev/null
+++ b/gemini/.gitignore
@@ -0,0 +1,8 @@
+.certificates
+content/logs/microlog.gmi
+content/logs/longlog.gmi
+content/logs/loglog.gmi
+tmp-build-loglog-*
+comitium-data/feed.gmi
+comitium-data/subscriptions.gmi
+comitium-data/comitium.json
diff --git a/gemini/Makefile b/gemini/Makefile
new file mode 100644
index 0000000..eee7273
--- /dev/null
+++ b/gemini/Makefile
@@ -0,0 +1,34 @@
+COMITIUM_DATA := comitium-data
+TEMPLATES_DIR := templates
+MICROLOG_HEADER := $(TEMPLATES_DIR)/microlog-header.gmi
+LONGLOG_HEADER := $(TEMPLATES_DIR)/longlog-header.gmi
+LOGLOG_HEADER := $(TEMPLATES_DIR)/loglog-header.gmi
+MICROLOG_ENTRIES := $(wildcard microlog/*)
+LONGLOG_ENTRIES := $(wildcard content/logs/longlog/*)
+LOGLOG_TARGET := content/logs/loglog.gmi
+FEED_TARGET := $(COMITIUM_DATA)/subscriptions.json $(COMITIUM_DATA)/feed.gmi $(COMITIUM_DATA)/subscriptions.gmi
+FEED_OUTPUTS := $(FEED_TARGET) $(COMITIUM_DATA)/subscriptions.json $(COMITIUM_DATA)/feed.gmi $(COMITIUM_DATA)/subscriptions.gmi
+MICROLOG_TARGET := content/logs/microlog.gmi
+MICROLOG_OUTPUTS := $(MICROLOG_TARGET) $(wildcard content/logs/microlog/*)
+LONGLOG_TARGET := content/logs/longlog.gmi
+
+.DELETE_ON_ERROR:
+all: $(MICROLOG_TARGET) $(MICROLOG_OUTPUTS) $(LONGLOG_TARGET) $(LOGLOG_TARGET) $(FEED_OUTPUTS)
+
+$(MICROLOG_TARGET): $(wildcard microlog/*) $(MICROLOG_HEADER)
+ bash ./build_microlog.bash
+
+$(LONGLOG_TARGET): $(LONGLOG_ENTRIES) $(LONGLOG_HEADER)
+ bash ./build_longlog.bash
+
+$(LOGLOG_TARGET): $(MICROLOG_TARGET) $(LONGLOG_TARGET) $(LOGLOG_HEADER)
+ bash ./build_loglog.bash
+
+$(FEED_TARGET): $(COMITIUM_DATA)/feeds.txt
+ rm -f $(COMITIUM_DATA)/comitium.json
+ while read feed; do \
+ comitium add --data "$(COMITIUM_DATA)" $$feed; \
+ done <$(COMITIUM_DATA)/feeds.txt
+
+clean:
+ rm -rf $(MICROLOG_OUTPUTS) $(LONGLOG_TARGET) $(LOGLOG_TARGET) $(FEED_OUTPUTS)
diff --git a/gemini/build_loglog.bash b/gemini/build_loglog.bash
new file mode 100755
index 0000000..247da74
--- /dev/null
+++ b/gemini/build_loglog.bash
@@ -0,0 +1,131 @@
+#!/bin/bash
+
+TMP="tmp-build-loglog-$(date +%s%N)"
+LOGLOG="content/logs/loglog.gmi"
+LOGLOG_HEADER="templates/loglog-header.gmi"
+
+new_filename()
+{
+ DATE="$1"
+ mkdir -p "$TMP/$DATE"
+ N=0
+ while [[ -f "$TMP/$DATE/$N" ]]; do
+ N=$(( N + 1 ))
+ done
+ echo "$TMP/$DATE/$N"
+}
+
+read_log_to_tmp()
+{
+ LOGPATH="$1"
+ LOG="$(echo $LOGPATH | sed "s/.*\///g" | sed "s/\.gmi//g")"
+ CURRENT_POST_HEADING=""
+ CURRENT_POST_FILENAME=""
+ while read line; do
+ if [[ -z "$CURRENT_POST_FILENAME" ]]; then
+ if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})(\.[0-9]+)?\ * ]]; then
+ CURRENT_POST_HEADING="${BASH_REMATCH[1]}"
+ DATE="${BASH_REMATCH[2]}"
+ CURRENT_POST_FILENAME="$(new_filename $DATE)"
+ elif [[ "$line" =~ \=\>\ +([^\ ]+)\ +([0-9]{4}-[0-9]{2}-[0-9]{2})(\.[0-9]+)?\ +(.*) ]]; then
+ HREF="${BASH_REMATCH[1]}"
+ DATE="${BASH_REMATCH[2]}"
+ NAME="${BASH_REMATCH[3]}"
+ FILENAME="$(new_filename $DATE)"
+ echo "
+=> $HREF $DATE $NAME
+
+From my $LOG.
+
+=> /logs/$LOG.gmi My $LOG" \
+ >> "$FILENAME"
+ fi
+ else
+ if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})\ * ]]; then
+ echo "From my $LOG.
+
+=> /logs/$LOG.gmi My $LOG" \
+ >> "$CURRENT_POST_FILENAME"
+ CURRENT_POST_HEADING="${BASH_REMATCH[1]}"
+ DATE="${BASH_REMATCH[2]}"
+ CURRENT_POST_FILENAME="$(new_filename $DATE)"
+ elif [[ "$line" =~ \#.* ]] && ! [[ "$line" =~ ${CURRENT_POST_HEADING}\#.* ]]; then
+ echo "From my $LOG.
+
+=> /logs/$LOG.gmi My $LOG" \
+ >> "$CURRENT_POST_FILENAME"
+ CURRENT_POST_HEADING=""
+ DATE=""
+ CURRENT_POST_FILENAME=""
+ else
+ echo "$line" >> "$CURRENT_POST_FILENAME"
+ fi
+ fi
+ done <$LOGPATH
+}
+
+trim_entries()
+{
+ ENTRY_DIR="$1"
+ for entry in $ENTRY_DIR/*; do
+ while [[ -z "$(head -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do
+ tail -n +2 "$entry" | tee "$entry" 1>/dev/null
+ done
+ while [[ -z "$(tail -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do
+ head -n -1 "$entry" | tee "$entry" 1>/dev/null
+ done
+ if [[ -z "$(cat "$entry")" ]]; then
+ echo "Removing entry $entry: $(cat $entry)"
+ rm "$entry"
+ fi
+ done
+ if [[ "$(ls "$ENTRY_DIR" | wc -l)" -eq 0 ]]; then
+ rmdir "$ENTRY_DIR"
+ fi
+}
+
+append_entries_for_date()
+{
+ DATE_DIR="$1"
+ DATE="$(echo "$DATE_DIR" | sed "s/.*\///g")"
+ echo "## $DATE
+" >> "$LOGLOG"
+ ENTRY_COUNT="$(ls $DATE_DIR | wc -l)"
+ LAST_ENTRY="$(ls $DATE_DIR | tail -n 1)"
+ for entry in $DATE_DIR/*; do
+ cat "$entry" >> "$LOGLOG"
+ echo "" >> "$LOGLOG"
+ if [[ "$ENTRY_COUNT" -gt 1 && "$entry" != "$DATE_DIR/$LAST_ENTRY" ]]; then
+ echo \
+------------------------------------------------------------------------ >> "$LOGLOG"
+ echo "" >> "$LOGLOG"
+ fi
+ done
+}
+
+echo "Cleaning existing loglog..."
+rm -f "$LOGLOG"
+
+echo "Reading logs to temporary files..."
+for log in content/logs/*log.gmi; do
+ read_log_to_tmp "$log"
+done
+
+echo "Trimming entries in temporary files..."
+for date in $TMP/*; do
+ trim_entries "$date"
+done
+
+echo "Copying loglog header..."
+cp "$LOGLOG_HEADER" "$LOGLOG"
+
+echo "Appending entries to loglog..."
+dates=($TMP/*)
+for ((i=${#dates[@]}-1; i>=0; i--)); do
+ append_entries_for_date "${dates[i]}"
+done
+
+echo "Cleaning up temporary files..."
+rm -rf "$TMP"
+
+echo "Done."
diff --git a/gemini/build_longlog.bash b/gemini/build_longlog.bash
new file mode 100755
index 0000000..d23acfa
--- /dev/null
+++ b/gemini/build_longlog.bash
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+LONGLOG="content/logs/longlog.gmi"
+LONGLOG_HEADER="templates/longlog-header.gmi"
+LONGLOG_SRC_DIR="content/logs/longlog"
+HR="-----------------------------------------------------------------------"
+
+trim_longlog_tail()
+{
+ while [[ -z "$(tail -n 1 "$LONGLOG")" && "$(wc -l "$LONGLOG" | cut -c1)" -ne 0 ]]; do
+ head -n -1 "$LONGLOG" | tee "$LONGLOG" 1>/dev/null
+ done
+}
+
+echo "Cleaning existing longlog..."
+rm -f "$LONGLOG"
+
+echo "Copying longlog header..."
+cp "$LONGLOG_HEADER" "$LONGLOG"
+trim_longlog_tail
+echo "" >> "$LONGLOG"
+
+echo "Appending entries to longlog..."
+posts=(${LONGLOG_SRC_DIR}/*)
+for ((i=${#posts[@]}-1; i>=0; i--)); do
+ post="${posts[i]}"
+ if [[ "$post" =~ ${LONGLOG_SRC_DIR}/([0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?)\.gmi ]]; then
+ date="${BASH_REMATCH[1]}"
+ suffix="${BASH_REMATCH[2]}"
+ title="$(head -n 1 "${posts[i]}" | sed "s/^\#\+ *//")"
+ echo "=> /logs/longlog/${date}${suffix}.gmi ${date} ${title}" >> "$LONGLOG"
+ else
+ echo "Error: $post does not match format YYYY-MM-DD(.n). Aborting..."
+ exit 1
+ fi
+done
+
+echo "Done."
diff --git a/gemini/build_microlog.bash b/gemini/build_microlog.bash
new file mode 100755
index 0000000..b3c37dc
--- /dev/null
+++ b/gemini/build_microlog.bash
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+MICROLOG="content/logs/microlog.gmi"
+MICROLOG_HEADER="templates/microlog-header.gmi"
+MICROLOG_SRC_DIR="microlog"
+HR="-----------------------------------------------------------------------"
+
+trim_microlog_tail()
+{
+ while [[ -z "$(tail -n 1 "$MICROLOG")" && "$(wc -l "$MICROLOG" | cut -c1)" -ne 0 ]]; do
+ head -n -1 "$MICROLOG" | tee "$MICROLOG" 1>/dev/null
+ done
+}
+
+echo "Cleaning existing microlog..."
+rm -f "$MICROLOG"
+
+echo "Copying microlog header..."
+cp $MICROLOG_HEADER $MICROLOG
+trim_microlog_tail
+
+echo "Appending entries to microlog..."
+posts=(${MICROLOG_SRC_DIR}/*)
+for ((i=${#posts[@]}-1; i>=0; i--)); do
+ if [[ "${posts[i]}" =~ ${MICROLOG_SRC_DIR}/([0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?)\.gmi ]]; then
+ date="${BASH_REMATCH[1]}"
+ echo "" >> "$MICROLOG"
+ echo "## ${date}" >> "$MICROLOG"
+ echo "" >> "$MICROLOG"
+ cat "${posts[i]}" >> "$MICROLOG"
+ trim_microlog_tail
+ else
+ echo "Error: ${posts[i]} does not match format YYYY-MM-DD(.n). Aborting..."
+ exit 1
+ fi
+done
+
+echo "Done."
diff --git a/gemini/comitium-data/feeds.txt b/gemini/comitium-data/feeds.txt
new file mode 100644
index 0000000..6b5fff2
--- /dev/null
+++ b/gemini/comitium-data/feeds.txt
@@ -0,0 +1,16 @@
+gemini://joeac.net/logs/loglog.gmi
+gemini://joeac.net/logs/microlog.gmi --watch
+gemini://idiomdrottning.org:1965/sub
+gemini://spool-five.com:1965/gemlog/index.gmi
+gemini://jsreed5.org:1965/feeds/log.xml
+https://free-our-feeds.ghost.io/rss
+https://www.inkandswitch.com/index.xml
+https://euhwc.co.uk/feed/
+https://www.youtube.com/feeds/videos.xml?channel_id=UCVfwlh9XpX2Y_tQfjeln9QA
+https://www.youtube.com/feeds/videos.xml?channel_id=UCfJxmjbygyA5KEdzzZv6Pbw
+gemini://eph.smol.pub/posts
+https://mwgmac.github.io --watch
+https://dieterhelm.co.uk/feed/
+https://extinctionrebellion.uk/feed/
+https://pluralistic.net/feed/
+https://podcasts.files.bbci.co.uk/p0gg4k6r.rss "Radical with Amol Rajan"
diff --git a/gemini/comitium-data/header.gmi b/gemini/comitium-data/header.gmi
new file mode 100644
index 0000000..b7609bb
--- /dev/null
+++ b/gemini/comitium-data/header.gmi
@@ -0,0 +1,4 @@
+# joeac's feed aggregator
+
+Hi! I'm Joe Carstairs, and you've found my feed aggregator. This is a list of
+some stuff I think I might read.
diff --git a/gemini/content/feed.gmi b/gemini/content/feed.gmi
new file mode 120000
index 0000000..c05592d
--- /dev/null
+++ b/gemini/content/feed.gmi
@@ -0,0 +1 @@
+../comitium-data/feed.gmi \ No newline at end of file
diff --git a/gemini/content/images b/gemini/content/images
new file mode 120000
index 0000000..ccc7a5b
--- /dev/null
+++ b/gemini/content/images
@@ -0,0 +1 @@
+../../common/images/ \ No newline at end of file
diff --git a/gemini/content/index.gmi b/gemini/content/index.gmi
new file mode 100644
index 0000000..88b7303
--- /dev/null
+++ b/gemini/content/index.gmi
@@ -0,0 +1,17 @@
+# joeac's capsule
+
+Hi! I'm Joe Carstairs, and you've found my capsule, gemini://joeac.net.
+
+=> /logs/longlog.gmi My longlog (for long posts)
+=> /logs/microlog.gmi My microlog (for short posts)
+=> /logs/loglog.gmi My loglog (all my posts forgathered)
+=> /logs/index.gmi An index of all my logs (don't visit this page)
+=> /feed.gmi My feed aggregator
+
+Here are some other ways to 'engage' with me on the so-called 'Internet':
+
+=> https://joeac.net Web
+=> https://www.linkedin.com/in/joe-carstairs-0aa936277/ LinkedIn
+=> https://www.facebook.com/joe.carstairs.5 Facebook
+=> https://git.joeac.net My own Gitea instance
+=> https://github.com/joeacarstairs GitHub
diff --git a/gemini/content/logs/index.gmi b/gemini/content/logs/index.gmi
new file mode 100644
index 0000000..e9109a8
--- /dev/null
+++ b/gemini/content/logs/index.gmi
@@ -0,0 +1,8 @@
+# joeac's logs
+
+I told you not to visit this page! There's nothing here you can't get on my homepage. I hope you're disappointed.
+
+=> / My homepage (way cooler than this page)
+=> /logs/longlog.gmi My longlog (for long posts)
+=> /logs/microlog.gmi My microlog (for short posts)
+=> /logs/loglog.gmi My loglog (all my posts forgathered)
diff --git a/gemini/content/logs/longlog b/gemini/content/logs/longlog
new file mode 120000
index 0000000..f04f5e4
--- /dev/null
+++ b/gemini/content/logs/longlog
@@ -0,0 +1 @@
+../../../common/longlog/ \ No newline at end of file
diff --git a/gemini/content/subscriptions.gmi b/gemini/content/subscriptions.gmi
new file mode 120000
index 0000000..0935ecb
--- /dev/null
+++ b/gemini/content/subscriptions.gmi
@@ -0,0 +1 @@
+../comitium-data/subscriptions.gmi \ No newline at end of file
diff --git a/gemini/microlog b/gemini/microlog
new file mode 120000
index 0000000..5fcc383
--- /dev/null
+++ b/gemini/microlog
@@ -0,0 +1 @@
+../common/microlog/ \ No newline at end of file
diff --git a/gemini/run.sh b/gemini/run.sh
new file mode 100755
index 0000000..7535975
--- /dev/null
+++ b/gemini/run.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+make && \
+ ( ( sleep 5; comitium refresh --data comitium-data/ ) & ) \
+ && agate --content content/ --addr [::]:1965 --addr 0.0.0.0:1965 --lang en-GB
diff --git a/gemini/templates/loglog-header.gmi b/gemini/templates/loglog-header.gmi
new file mode 100644
index 0000000..59bf60a
--- /dev/null
+++ b/gemini/templates/loglog-header.gmi
@@ -0,0 +1,6 @@
+# joeac's loglog
+
+Hi! I'm Joe Carstairs, and you've found my loglog; my log of logs; all my posts of every description, all gathered into one place. If you're really that interested in my posts, I would encourage you to strongly consider the benefits of touching grass.
+
+You should be aware that my build script seems to muck up the dates. Everything seems to be 2 months and 2 days off? I haven't got round to debugging and fixing this yet. Any theories, let me know.
+
diff --git a/gemini/templates/longlog-header.gmi b/gemini/templates/longlog-header.gmi
new file mode 100644
index 0000000..6e82e48
--- /dev/null
+++ b/gemini/templates/longlog-header.gmi
@@ -0,0 +1,3 @@
+# joeac's longlog
+
+Hi! I'm Joe Carstairs, and you've found my longlog. Sometimes, I write a long or long-ish post, and I put it here.
diff --git a/gemini/templates/microlog-header.gmi b/gemini/templates/microlog-header.gmi
new file mode 100644
index 0000000..761e61a
--- /dev/null
+++ b/gemini/templates/microlog-header.gmi
@@ -0,0 +1,3 @@
+# joeac's microlog
+
+Hi! I'm Joe Carstairs, and you've found my microlog. Sometimes, when I think something, I put the thought here. I'm not sure why you'd want to read this, to be honest. I'd recommend turning the computer off and going for a walk instead.