- Python 43.4%
- CSS 37.3%
- HTML 19.3%
| .gitignore | ||
| build_expanded_threads.py | ||
| cypherpunks.bootstrap.nginx | ||
| cypherpunks.samuelshadrach.com.nginx | ||
| index-pages.css | ||
| index.html | ||
| README.md | ||
| styles.css | ||
| thread.css | ||
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 1992–1999 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-bs4python3-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:
- Scans all 98,126 messages, including
unknownmonth buckets. - Uses the upstream nested thread outlines to group connected messages.
- Parses message headers and bodies from the archived source.
- Builds static parent/child trees.
- Writes one canonical page per thread.
- 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'