No description
  • Python 43.4%
  • CSS 37.3%
  • HTML 19.3%
Find a file
2026-07-21 06:43:58 +00:00
.gitignore Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00
build_expanded_threads.py Open first post in each thread 2026-07-21 06:43:58 +00:00
cypherpunks.bootstrap.nginx Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00
cypherpunks.samuelshadrach.com.nginx Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00
index-pages.css Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00
index.html Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00
README.md Open first post in each thread 2026-07-21 06:43:58 +00:00
styles.css Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00
thread.css Deploy complete static Cypherpunks archive 2026-07-20 09:06:00 +00:00

Cypherpunks mailing-list archive

AI authorship: The code and deployment documentation in this repository were written by OpenAI gpt-5.6-sol.

Static, JavaScript-free frontend for the complete 19921999 Cypherpunks mailing-list archive, hosted at https://cypherpunks.samuelshadrach.com.

Each message URL renders the complete conversation containing that message. Every post is a native HTML <details> element; the top-most post is initially open and the rest are closed. Each <summary> toggles its body open and closed.

Contents

  • index.html — minimal archive homepage.
  • styles.css — homepage styling.
  • thread.css — expanded-thread styling.
  • index-pages.css — styling for imported year, month, and author indexes.
  • build_expanded_threads.py — final archive importer and thread generator.
  • cypherpunks.bootstrap.nginx — HTTP-only configuration used before certificate issuance.
  • cypherpunks.samuelshadrach.com.nginx — production Nginx and TLS configuration.
  • mailing-list-archive-source/ — local clone of the upstream generated archive. This is excluded from Git because it is approximately 2.1 GB and can be cloned again.

The live document root is /var/www/cypherpunks.

Requirements

  • Python 3
  • python3-bs4
  • python3-lxml
  • Nginx
  • Certbot with its Nginx plugin

On Ubuntu:

sudo apt-get update
sudo apt-get install -y python3-bs4 python3-lxml nginx certbot python3-certbot-nginx rsync

Obtain the source archive

git clone --depth 1 \
  https://github.com/cryptoanarchywiki/mailing-list-archive.git \
  /root/mailing-list-archive-source

Before generation, remove legacy script tags and rewrite inherited hostnames:

find /root/mailing-list-archive-source/archive \
     /root/mailing-list-archive-source/authors \
     -type f -name '*.html' -print0 |
  xargs -0 perl -pi -e \
  's#<script\b[^>]*>.*?</script>##g;
   s#https://mailing-list-archive\.cryptoanarchy\.wiki#https://cypherpunks.samuelshadrach.com#g;
   s#https://cryptoanarchy\.wiki#https://cypherpunks.samuelshadrach.com#g;
   s#http://localhost:4000#https://cypherpunks.samuelshadrach.com#g;
   s#/static/css/main\.css#/static/css/main.css?v=4#g;
   s/Return to cryptoanarchy\.wiki/Return to Cypherpunks Archive/g;
   s/>cryptoanarchy\.wiki</>Cypherpunks Archive</g'

Build and deploy

Create the document root and copy the indexes and assets:

sudo install -d -m 755 /var/www/cypherpunks
sudo rsync -a --delete /root/mailing-list-archive-source/archive/ /var/www/cypherpunks/archive/
sudo rsync -a --delete /root/mailing-list-archive-source/authors/ /var/www/cypherpunks/authors/
sudo rsync -a /root/mailing-list-archive-source/static/ /var/www/cypherpunks/static/
sudo rsync -a /root/mailing-list-archive-source/assets/ /var/www/cypherpunks/assets/
sudo install -m 644 index.html styles.css thread.css /var/www/cypherpunks/
sudo install -m 644 index-pages.css /var/www/cypherpunks/static/css/main.css
sudo install -m 644 /root/mailing-list-archive-source/authors/notable/index.html \
  /var/www/cypherpunks/authors/index.html

Generate complete thread pages and attach them to all message URLs:

sudo python3 /root/build_expanded_threads.py

The generator:

  1. Scans all 98,126 messages, including unknown month buckets.
  2. Uses the upstream nested thread outlines to group connected messages.
  3. Parses message headers and bodies from the archived source.
  4. Builds static parent/child trees.
  5. Writes one canonical page per thread.
  6. Hard-links every message URL to its complete thread page to avoid duplicating content.

Nginx and HTTPS

The production config references the final Let's Encrypt certificate, so begin with the HTTP-only bootstrap config:

sudo install -m 644 cypherpunks.bootstrap.nginx \
  /etc/nginx/sites-available/cypherpunks.samuelshadrach.com
sudo ln -sfn /etc/nginx/sites-available/cypherpunks.samuelshadrach.com \
  /etc/nginx/sites-enabled/cypherpunks.samuelshadrach.com
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl enable --now nginx

Issue the initial certificate:

sudo certbot --nginx \
  -d cypherpunks.samuelshadrach.com \
  --agree-tos --register-unsafely-without-email --redirect

Install the tracked production config after the certificate exists:

sudo install -m 644 cypherpunks.samuelshadrach.com.nginx \
  /etc/nginx/sites-available/cypherpunks.samuelshadrach.com
sudo nginx -t
sudo systemctl reload nginx

Certbot installs an automatic renewal timer. Check it with:

systemctl status certbot.timer
sudo certbot renew --dry-run

Verification

curl -I https://cypherpunks.samuelshadrach.com/
curl -I https://cypherpunks.samuelshadrach.com/archive/
curl -I https://cypherpunks.samuelshadrach.com/authors/

A message page should contain only static HTML and native collapsible posts:

curl -s https://cypherpunks.samuelshadrach.com/archive/YYYY/MM/MESSAGE_HASH/ |
  grep -E '<details class="post"|<script'