Find a file
russell@unturf.com 4bd8e24d62 Add training-data target to convert RST posts to plain text for ML training
Creates a new Makefile target that converts all RST blog posts to plain text format using pandoc, enabling use of blog content as training data for machine learning applications.
2026-03-08 16:53:41 -04:00
content fix grammar: "a permacomputer" not "the permacomputer" 2026-03-07 23:11:59 -05:00
lib Fix llms.txt: recent articles from blog.json, correct JSON Blog description 2026-01-26 08:35:11 -05:00
pelican-themes new file: pelican-themes/README.rst 2015-11-15 17:00:27 -05:00
.gitignore Add temp files to gitignore 2026-01-26 09:16:01 -05:00
.gitlab-ci-deploy.yml remove old server deploy, only deploy to ingress 2026-02-13 20:29:07 -05:00
.gitlab-ci.yml deploy to ingress via deploy-www.sh on proxy.uncloseai.com runner 2026-02-14 06:39:24 -05:00
.theme-version Trigger deployment: Add bottom margin to addon links 2025-10-12 14:10:02 -04:00
CLAUDE.md update postmortem with salt state details, update CLAUDE.md 2026-03-07 22:16:03 -05:00
Makefile Add training-data target to convert RST posts to plain text for ML training 2026-03-08 16:53:41 -04:00
new_entry.sh new file: content/2016-09-06-set-static-hostname-for-rhel-centos-7-on-aws.rst 2016-09-06 11:53:58 -04:00
pelican-upstream-patch.diff Rebuild site with lighter code background in dark mode 2025-10-13 11:42:44 -04:00
pelicanconf.py modified: CLAUDE.md 2026-02-03 10:40:01 -05:00
README.rst Switch blog.json from embedded content to content_url links 2026-01-20 03:21:19 -05:00
requirements.txt Fix all Pelican build errors and implement proper testing workflow 2025-10-10 18:36:08 -04:00
tasks.py new file: tasks.py 2019-11-08 13:05:39 -05:00
template_new_entry.rst modified: content/2011-09-08-a-system-administrators-guide-to-installing-and-maintaining-multiple-python-environments.rst 2016-06-22 11:32:18 -04:00
vars.fish.tmpl Trying to upgrade pelican project. 2019-11-08 13:01:13 -05:00

russell.ballestrini.net
#######################

This is the source code for `my blog <https://russell.ballestrini.net>`_. My blog is a static web site with just HTML!
This project uses Pelican (a static site generator) to produce HTML from ``.rst`` or ``.md`` files.

Pelican is written in Python and uses Jinja2 template engine by default.

The theme defaults to dark mode with a light mode toggle. Theme preference is saved to localStorage and persists across sessions. The dark mode toggle also passes the theme preference to embedded Remarkbox comments via the mode parameter.

Need a new blog post entry?
===============================

Try running:

.. code-block:: bash

 ./new_entry


development
===============================

**Setup (one command does everything):**

.. code-block:: bash

 make venv

This creates a ``venv/`` directory with Pelican, installs all dependencies, clones the theme, and configures everything automatically.

**Testing workflow (ALWAYS test before committing):**

.. code-block:: bash

 make clean && make html && make serve

This builds the site and serves it at http://localhost:8000

**Available commands:**

.. code-block:: bash

 make venv          # Setup virtual environment
 make html          # Build the site
 make clean         # Remove output directory
 make serve         # Serve site at localhost:8000
 make devserver     # Serve with auto-reload
 make resume        # Generate PDF resume
 make formats       # Generate all agent-friendly formats

agent-friendly formats
===============================

The blog automatically generates multiple formats optimized for AI agents & LLM consumption:

**Automated format generation (run via ``make formats``):**

.. code-block:: bash

 make rst2md        # Convert all RST to Markdown (index.md)
 make plaintext     # Generate plain text versions (index.txt)
 make jsonfeed      # Generate JSON Feed v1.1 (/feeds/all.json)
 make jsonblog      # Generate JSON Blog format (/blog.json)
 make llms          # Generate llms.txt for AI agent onboarding
 make formats       # Run all of the above

**Generated files:**

- ``/blog.json`` - Blog index with links to markdown files (jsonblog.dev format)
- ``/feeds/all.json`` - JSON Feed v1.1 alternative to Atom/RSS
- ``/llms.txt`` - AI agent onboarding documentation with API info
- ``/*/index.md`` - GitHub-flavored Markdown for every post
- ``/*/index.txt`` - Plain text (no markup) for direct LLM ingestion

**Purpose:**

These formats enable AI agents, LLMs, & automated systems to:

- Discover all posts & fetch markdown via ``content_url`` links (blog.json)
- Subscribe to updates via JSON instead of XML (feeds/all.json)
- Discover blog structure & available formats (llms.txt)
- Read posts without HTML parsing (index.txt, index.md)

**How blog.json works:**

The ``blog.json`` file uses the jsonblog.dev format & links to hosted markdown files instead of embedding content. Each post includes a ``content_url`` field pointing to ``https://russell.ballestrini.net/{slug}/index.md``. This keeps the JSON file lightweight while providing full access to all post content through standard HTTP requests.

All formats are automatically generated during CI/CD builds & kept in sync with the HTML content.

**Requirements:**

- ``pandoc`` - Needed for RST to Markdown conversion (``make rst2md``)

blah

production release process
===============================

we use Gitlab runners to build (look at .gitlab-ci.yml file) this site and Salt Stack to release the zipped artifacts.

Any web server may be used to host an HTML site. I choose nginx in production because it is known to be very fast at serving static files.

we use environment variables in my ``pelicanconf.py`` to store secrets.

For example: `Remarkbox comments <https://www.remarkbox.com>`_.

---

you should check out https://uncloseai.com for machine learning on your static web pages!

now with translation services!

nice,
dude