This repository contains the source code, assets, and blog posts for my personal website and blog, hosted at lerax.me. The blog is built using Jekyll, styled with custom Sass, and features a specialized publishing pipeline supporting Org-mode (via Emacs and org2jekyll). It can be developed and run both locally via Ruby or inside isolated Docker containers.
Below is an overview of the repository's layout and how the different directories and files contribute to the blog:
.
├── _config.yml # Global Jekyll configuration (title, plugins, social media, etc.)
├── Gemfile / Gemfile.lock # Ruby dependencies
├── Dockerfile # Debian-based Docker image definition with Jekyll & dependencies
├── Makefile # Build and deployment commands
├── _data/ # Custom data files
│ └── navigation.yml # Navigation menu structure
├── _includes/ # Reusable HTML partials/components (header, footer, comments, etc.)
├── _layouts/ # Jekyll page templates (home, post, page, categories, project)
├── _posts/ # Published posts (compiled HTML or markdown format, YYYY-MM-DD-title.*)
├── _sass/ # Custom SCSS stylesheets (typography, variables, responsive design)
├── assets/ # Static assets of the website
│ ├── css/ # Compiled stylesheet entries
│ ├── img/ # Images, avatars, post illustrations, and backgrounds
│ └── js/ # Custom and vendor JS scripts (interactivity, popups, scrolling)
└── org/ # Raw Org-mode source files of the blog posts
├── .dir-locals.el # Local Emacs configuration for org2jekyll automatic mode activation
└── [categories]/ # Subdirectories containing .org files
A Makefile is provided to streamline common development, build, and deployment operations.
Running the blog inside Docker avoids having to manage local Ruby and Gem installations. The container handles all Jekyll dependencies.
- Build the Docker Image:
This builds the Docker image tagged as
make build
ryukinix/blogusing theDockerfile. - Run the Development Server:
(Equivalent to running
make run
makewith no arguments)
Builds the image if not already built, and runs a container onhttp://localhost:4000. It mounts critical directories (_posts,assets,_sass,_includes,_layouts,about) as volumes, enabling live-reload so changes are updated instantly in your browser as you save files. - Debug/Test Build Output:
Runs a one-off build inside the Docker container to display trace output and check for errors.
make build-show
If you prefer to run Jekyll natively on your host machine:
- Install Dependencies Locally:
Installs all necessary Ruby gems locally under the
make install-local
vendor/bundledirectory. - Run Local Jekyll Server:
Launches the local Jekyll server using
make run-local
bundle exec jekyll serveonhttp://localhost:4000. - Clean Up Local Build Artifacts:
Deletes the generated local site directory (
make clean-local
_site/) and the locally installed gems (vendor/).
- Publish Docker Image:
Pushes the compiled
make publish
ryukinix/blogDocker image to Docker Hub. - Test Deploy:
Builds and publishes the Docker image, and then connects via SSH to the server
make deploy-test
starfoxto trigger/home/lerax/Deploy/blog.shto redeploy the site.
This project uses Org-mode as the primary authoring format for blog posts. Original posts are saved in the org/ directory and compiled into _posts/ as standard HTML posts.
-
Repository Setup: The
org/directory contains a.dir-locals.elfile:((org-mode . ((eval . (org2jekyll-mode)))))
This automatically enables
org2jekyll-modein Emacs whenever you open any.orgfile underorg/. -
Writing an Org Post: Org files should start with specific Org headers that
org2jekyllconverts to Jekyll Front Matter. For example:#+STARTUP: showall #+STARTUP: hidestars #+OPTIONS: H:2 num:nil tags:t toc:nil timestamps:t #+LAYOUT: post #+AUTHOR: Manoel Vilela #+DATE: 2025-07-20 dom 01:11 #+TITLE: Common Lisp Brasil #+DESCRIPTION: Gerenciando a comunidade de Common Lisp desde 2018 #+TAGS: programming lisp #+CATEGORIES: programming #+PROJECT: true * O início de tudo Este post deve contar parte da história... -
Compiling and Publishing: Within Emacs, triggering the
org2jekyllexport/publishing functions translates your.orgfile into an HTML file under_posts/(e.g.,_posts/2025-07-20-common-lisp-brasil.html).The export process automatically generates the Jekyll-compatible YAML front matter from the Org-mode headers:
--- date: 2025-07-20 01:11 author: Manoel Vilela layout: post title: Common Lisp Brasil excerpt: Gerenciando a comunidade de Common Lisp desde 2018 tags: - programming - lisp categories: - programming project: true ---
Once the post is generated in
_posts/, Jekyll's build pipeline compiles it into the final static webpage.
This repository includes a GitHub Actions CI workflow (defined in .github/workflows/build.yml) that validates pull requests to the master branch by automatically building the Docker image to ensure the site compiles cleanly without errors.