Jekyll source for the Telekom Security research and publications site.
Production domain: https://github.security.telekom.com
rbenv install -s 3.3.4
rbenv local 3.3.4
ruby -v
bundle install
bundle exec rake new_post title="My Title" tags="research" description="Short summary"
bundle exec jekyll serve --livereload
bundle exec rake ci
git add .
git commit -m "Add post: My Title"
git push origin masterAfter the push, check the GitHub Pages pages-build-deployment run. A
successful run deploys the site to GitHub Pages.
- Ruby 3.3.4, matching
.ruby-versionand the current GitHub Pages runtime. - Bundler with
Gemfile.lock; Ruby 3.3.4 usually ships with Bundler, so usebundle installfor a clean local install. - GitHub Pages remains configured as the legacy branch build from
master /. - No deploy workflow is required for this Jekyll setup.
Install Apple's command line tools if git is missing:
xcode-select --installInstall Ruby with Homebrew and rbenv:
brew install rbenv ruby-buildEnable rbenv in your shell. macOS uses zsh by default:
echo 'eval "$(rbenv init - zsh)"' >> ~/.zshrc
exec zsh -lIf you use bash instead:
echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc
exec bash -lInstall and activate Ruby:
rbenv install -s 3.3.4
rbenv local 3.3.4
ruby -v
which ruby
gem env home
bundle -v || gem install bundler
bundle installruby -v must print ruby 3.3.4..., which ruby must point to an rbenv
shim, and gem env home must not point to /Library/Ruby/Gems/....
Debian/Ubuntu prerequisites:
sudo apt update
sudo apt install -y git curl build-essential libssl-dev libreadline-dev zlib1g-devInstall rbenv:
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-installer | bashAdd rbenv to your shell profile:
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - bash)"For bash, persist that setup with:
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc
exec bash -lFor zsh, use ~/.zshrc and rbenv init - zsh instead.
Install and activate Ruby:
rbenv install -s 3.3.4
rbenv local 3.3.4
ruby -v
which ruby
gem env home
bundle -v || gem install bundler
bundle installruby -v must print ruby 3.3.4..., which ruby must point to an rbenv
shim, and gem env home must not point to a system Ruby directory.
Normal local server:
bundle exec jekyll serve --livereloadOpen http://localhost:4000.
Demo mode includes draft and future posts and emits noindex metadata:
bundle exec jekyll serve --livereload --config _config.yml,_config_demo.ymlContainerized demo mode:
docker compose up demoRun the full local gate before publishing:
bundle exec rake ciIndividual checks:
bundle exec rake check_content
bundle exec rake audit_content
bundle exec rake security_audit
bundle exec jekyll buildcheck_content is blocking. It validates post filenames, required frontmatter,
local asset references, and disallows new raw <script> or <style> blocks in
posts.
audit_content is informational. It reports legacy patterns such as missing
excerpt markers, HTTP links, raw HTML in historical posts, possible Jekyll
patterns, and potentially unreferenced assets. Do not delete historical assets
solely based on this report; old posts or external deep links may still use
them.
security_audit runs bundler-audit against the current bundle.
Use the generator:
bundle exec rake new_post title="My Title" tags="ThreatIntel" description="Short summary"Optional parameters:
author="Name"
date="YYYY-MM-DD"
slug="custom-slug"
draft="true"The default is publish-ready. The script does not add draft: true unless
draft="true" is passed. Publishing still requires manual git commit and
git push.
Posts live in _posts/ and keep the historical filename format:
YYYY-MM-DD-slug.md
The filename defines the public URL:
/YYYY/MM/slug.html
Use <!--more--> after the opening paragraph. Everything before this marker is
used as the listing excerpt.
Required:
| Field | Description | Example |
|---|---|---|
title |
SEO fallback title | Shining some light on the DarkGate loader |
header |
Displayed article headline | Shining some light on the DarkGate loader |
tags |
Category/tag list | ['advisories'], ['ThreatIntel'] |
Recommended:
| Field | Description | Example |
|---|---|---|
description |
Meta description; excerpt is fallback | Discovery of printer CVE during Red Team assessment |
author |
Author name | jdoe |
image |
Listing/article image path | /assets/images/example.png |
Optional social overrides:
| Field | Used for | Fallback |
|---|---|---|
og_title |
og:title, twitter:title |
header or title |
og_description |
og:description, twitter:description |
description or excerpt |
og_image |
og:image, twitter:image, preview image |
image or default site image |
og_type |
og:type |
article for posts |
twitter_card |
twitter:card |
summary |
twitter_creator |
twitter:creator |
omitted |
Advisory-specific fields for /advisories.html:
| Field | Description | Example |
|---|---|---|
cwes |
CWE list | ['CWE-79', 'CWE-922'] |
affected_product |
Affected product | Airmail - Your Mail With You |
vulnerability_release_date |
Advisory publication date | 2026-02-15 |
Primary category labels are derived from the first matching tag:
| Tag | Display label |
|---|---|
ThreatIntel |
Threat Intelligence |
advisories |
Security Advisory |
Honeypots |
Honeypot Research |
tools |
Tooling |
research |
Research Note |
writeup or Write-up |
Write-up |
general or General |
General Update |
Use the established tag names above for new posts unless a new category is
intentionally introduced in _data/categories.yml.
Static files live in the repository root and are served from the site root.
Examples:
| File | Public URL |
|---|---|
assets/images/example.png |
/assets/images/example.png |
assets/advisories/report.pdf |
/assets/advisories/report.pdf |
img/favicon.png |
/img/favicon.png |
Rules for new posts:
- Prefer local assets under
assets/.... - Use root-relative paths, for example
/assets/images/example.png. - Avoid spaces in new filenames. Historical assets with spaces remain supported.
- Do not add inline
<script>or<style>to Markdown posts. - Use existing global classes such as
img-smallinstead of per-post CSS.
- Create the post with
bundle exec rake new_post. - Add images or downloads under
assets/.... - Run
bundle exec jekyll serve --livereloadfor normal local testing. - Run demo mode only when checking draft or future posts.
- Run
bundle exec rake ci. - Review
git diff. - Commit manually.
- Push to
master. - Check the GitHub Pages
pages-build-deploymentrun.
GitHub Pages builds from master / with its native Jekyll pipeline. The site
does not require a custom deploy workflow.
- If Ruby version errors appear, verify
ruby -vprints3.3.4. - If
ruby -vstill prints the macOS system Ruby, for example2.6.x, rbenv is not active in the current shell. Runeval "$(rbenv init - zsh)"once for the current terminal, then checkwhich rubyagain. Persist the setup in~/.zshrcas shown above. - If
gem install bundlertries to write to/Library/Ruby/Gems/2.6.0, stop before usingsudo. That path belongs to macOS system Ruby. Fix rbenv first; after thatgem env homeshould point below~/.rbenv/versions/3.3.4/.... - If dependencies look inconsistent, run
bundle install. - If an asset is reported missing, verify the file exists under
assets/orimg/and the Markdown path starts with/assets/or/img/. - If a post is not in production, check for
draft: trueor a future filename date. - If GitHub Pages does not update after push, inspect the
pages-build-deploymentrun and verify the Pages API still reportsbuild_type: legacy.