"Jekyll and Bootstrap 5 theme for perfectionists. Step-by-step instructions to build your blog, portfolio, and documentation site with no mistakes, unless you're a n00b."
Production URL. For GitHub Pages: https://USERNAME.github.io
Leave empty for apex domains
Personalization
Analytics
Live Preview
Loading…
Tip: Changes are reflected instantly in the preview. Download the file and replace your project's _config.yml, then restart your dev server.
_config.yml
# Welcome to the configuration file for Jekyll.
# Full docs at: http://jekyllrb.com/docs/configuration/
# YAML docs at: https://yaml.org/spec/1.2.2/
# ---------------------------------------------------------------------------------
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server.
#
# If you need help with YAML syntax, here are some quick references for you:
# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
# https://learnxinyminutes.com/docs/yaml/
#
# You can find config options at: https://jekyllrb.com/docs/configuration/options/
#
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
# Site Settings ###################################################################
site_configured : true # Tells the theme this site has been personalised
founder : "Amr Abdel-Motaleb"
remote_theme : "bamr87/zer0-mistakes"
gem : &gem "jekyll-theme-zer0"
# theme : "jekyll-theme-zer0"
## Github Information
github_user : &github_user "bamr87"
repository_name : &github_repository "zer0-mistakes"
repository : [*github_user, "/", *github_repository] # GitHub username/repo-name
local_repo : &local_repo "zer0-mistakes"
branch : &branch "main"
repo_map : "/sitemap/"
portfolio : &portfolio [*github_user, '.', 'github.io']
## Site Information ---------------------------------------------------------------
# Emit the SoftwareApplication JSON-LD block (_includes/content/jsonld-software.html)
# on the homepage. That payload describes THE THEME — its RubyGems URL, GitHub
# repo, MIT licence, feature list and author — so only the theme's own site may
# truthfully claim it. Consumers must leave this off; on their homepage it would
# assert that their site is this Ruby gem.
jsonld_software_application: true
title : &title "zer0-mistakes"
title_url : "/"
title_icon : "robot"
subtitle : ""
subtitle_url : "localhost"
subtitle_icon : "code"
title_separator : "|" # Appears in the web browser tab name
domain : &domain "zer0-mistakes"
domain_ext : &domain_ext "com"
baseurl : &baseurl "" # the subpath of your site, e.g. /blog - Use this if you want this whole repo to be a domain branch
url_test : &url_test [ 'https', '://', *github_user, '.', *domain, '.', *domain_ext ] # the base hostname & protocol for your site, e.g. http://example.com
domain_url : &domain_url [ 'https', '://', *domain, '.', *domain_ext ]
github_io_url : &github_io_url [ 'https', '://', *github_user, '.', *domain, '.', *domain_ext, '/', *github_repository ]
url : &url https://zer0-mistakes.com
public_folder : assets # path to the public folder
port : 4000 # Jekyll Serve Dev port
dg_port : 4001 # TODO: Doppelganger site. Use this if you want to switch between parallel deployments
og_image : '/assets/images/wizard-on-journey.png'
### Owner Information -------------------------------------------------------------
name : &name "Amr"
email : "amr@zer0-mistakes.com"
description : >- # this means to ignore newlines until the next variable
"Jekyll and Bootstrap 5 theme for perfectionists.
Step-by-step instructions to build your blog, portfolio,
and documentation site with no mistakes, unless you're a n00b."
level : 'n00b'
## Maintainer Information----------------------------------------------------------
maintainers:
- name: *name
profile: ["https://github.com", "/", *github_user]
- name: "Vacant"
profile: "/github.com"
## Personalization ----------------------------------------------------------------
locale : "en-US"
home_dir : &home '/Users/bamr87/'
local_git : [ *home, 'github' ]
logo : /assets/images/gravatar-small.png # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png"
logo_link : [ *url, *baseurl ] # URL to link the logo to, e.g. "/"
teaser : '/assets/images/favicon_gpt_computer_retro.png' # path of fallback teaser image, e.g. "/assets/images/500x300.png"
info_banner : '/assets/images/info-banner-mountain-wizard.png' # path of fallback teaser image, e.g. "/assets/images/500x300.png"
# Favicon / browser identity — rendered by _includes/core/favicon.html.
# All keys optional; with no block at all the theme still links /favicon.ico.
# theme_color falls back to theme_color.main below when unset here.
favicon:
ico : /favicon.ico
apple_touch : /assets/images/favicon_gpt_computer_retro.png
## Preview Image Generation (AI-powered) #####################################
# Settings for automatic preview image generation using AI
# Used by: scripts/generate-preview-images.sh → scripts/lib/preview_generator.py
#
# Claude ORCHESTRATES, an image model RENDERS: Claude analyzes the article and
# writes the art-direction brief (prompt_engine: claude), the provider below
# renders it, then Claude reviews the image and may request one refined
# [redacted]
# [redacted]
# logged-in `claude` CLI — without one, orchestration degrades to the template
# prompt with no review. Renderers (openai, xai, stability, gemini) need their
# own key; `local` needs none (deterministic SVG, skips orchestration).
#
# Per-author override: a post's `author:` may point at an entry in
# _data/authors.yml that defines a `preview:` block (style, style_modifiers,
# size, quality, model). Those values WIN over the settings below for that
# post's banner — giving each AI author persona (e.g. cassandra, vega) a
# distinct art style. See pages/_docs/customization/author-profiles.md § 6.
preview_images:
enabled : true
provider : 'openai' # renderer: openai, xai, stability, gemini, local
model : 'gpt-image-2' # renderer model; another vendor family falls back to the provider default
size : '1536x1024' # Landscape banners; raster vendors adapt per model (DALL-E 3: 1792x1024)
quality : 'auto' # auto for GPT Image models; standard/hd for DALL-E 3
style : 'retro pixel art, 8-bit video game aesthetic, vibrant colors, nostalgic, clean pixel graphics'
output_dir : 'assets/images/previews'
# Claude orchestration: 'claude' analyzes the article into the art brief
# ('template' = built-in prompt), and reviews the rendered image with vision
# ('none' disables). claude_model overrides the orchestration model.
prompt_engine : 'claude'
review_engine : 'claude'
# claude_model : 'claude-opus-4-8'
# Path normalization: allows omitting /assets/ prefix in frontmatter
# e.g., preview: /images/previews/my-image.png becomes /assets/images/previews/my-image.png
assets_prefix : '/assets' # Prefix to prepend to relative preview paths
auto_prefix : true # Auto-add assets_prefix if path doesn't start with it
# Additional style modifiers applied to all prompts
style_modifiers : 'pixelated, retro gaming style, CRT screen glow effect, limited color palette'
# Content statistics
# _data/content_statistics.yml is committed and read directly by templates
# (site.data.content_statistics). The _plugins/content_statistics_generator.rb
# hook re-derives it from a full content scan on EVERY `jekyll build` (~12x per
# CI run) — pure waste when content hasn't changed, plus it dirties a tracked
# file. Keep it off by default; refresh explicitly with `rake stats:generate`
# (or _data/generate_statistics.sh) when content changes.
content_statistics:
auto_generate : false
breadcrumbs : true # true, false (default)
words_per_minute : 200
_posts_file_structure : "year-month-day-title.md"
# UI navigation behaviour --------------------------------------------------
# Optional consolidation of the mobile sidebar + main-menu offcanvases into
# a single tabbed drawer (Browse / Menu / Settings). Default false to avoid
# disrupting existing forks. See _includes/navigation/unified-drawer.html.
navigation:
unified_mobile_drawer : false # true to opt into the single-drawer pattern
# News layouts (news.html / section.html) ----------------------------------
# Every key optional; the layouts also work with NO _data/navigation/posts.yml
# (sections then derive from site.categories). See _layouts/news.html header.
# news:
# category_base : "/news/" # base path of per-category section pages (e.g. "/categories/")
# index_url : "/news/" # the news homepage (section breadcrumbs / back-links)
# hero : true # false = no latest-post hero fallback when nothing is breaking/featured
# archives_url : "" # archives page to deep-link months to (auto-detects /archives/; unlinked otherwise)
# newsletter:
# enabled : true # false hides the subscribe band
# endpoint : "" # form POST target; without one a mailto: on site.email is used
# heading : "Stay Updated"
# lead : "Subscribe to get the latest news and updates delivered to your inbox."
# Left sidebar defaults -----------------------------------------------------
# Site-wide defaults for the docs sidebar panel. Pages override via the
# `sidebar:` front-matter hash; collections via `sidebar:` metadata under
# `collections:` below. Resolution: page → collection → site (this block).
# Full reference: /docs/features/sidebar-navigation/
sidebar:
title : "Browse docs" # panel heading text
icon : "bi-journal-bookmark" # Bootstrap Icons class for the heading
# nav : auto # optional site-wide fallback nav mode for pages
# # that set none. Modes: auto | collection |
# # categories | tags | <_data/navigation/*.yml name>
# Opt-in user override hooks. When true, the theme loads:
# - assets/css/user-overrides.css (after main.css, wins over theme rules)
# - assets/js/user-overrides.js (after the theme JS bundle)
# Ship these files in your fork; they are not bundled with the theme.
user_overrides : false
# Default color mode for new visitors (before any localStorage preference is set).
# Values: dark | light | auto
# dark — always start in dark mode (Bootstrap data-bs-theme="dark")
# light — always start in light mode (Bootstrap data-bs-theme="light")
# auto — follow the visitor's OS/browser prefers-color-scheme (default)
# The user can still override this at any time with the Appearance panel.
# An inline script in <head> applies the correct mode before CSS loads, preventing FOUC.
color_mode_default : auto
# Pin the color mode site-wide. When true, color_mode_default wins
# unconditionally: visitor preference (localStorage) and the OS scheme are
# ignored, and the light/dark/auto switcher is removed from the UI. For
# brand-locked sites that are designed for exactly one mode.
color_mode_lock : false
# Runtime Appearance panel inside the Settings offcanvas (Track 6).
# Adds light/dark/auto color-mode buttons + a primary-color picker that
# writes to localStorage["zer0-appearance"] and updates --zer0-color-primary
# without a page reload. Falls back gracefully when disabled.
appearance_panel : true
## Identity #####################################################################
author:
name : *name # *name is a YAML reference pointing to the &anchor earlier
avatar : "/assets/images/gravatar-small.png"
email_hash : &email_hash '71d7a4fc9712df49e13d606e620f89c7' # https://en.gravatar.com/site/check/{ site.email }
gravatar : [ 'https://s.gravatar.com/avatar/', *email_hash, '?s=80' ]
bio : "IT nerd trying to be an IT hero"
location : "Denver, CO"
twitter_username : "bamr87"
github_username : *github_user
## Site Analytics #############################################################
google_analytics : 'G-ZBDKNMC168'
# Google Tag Manager container for THIS site. The GTM includes emit nothing
# when this is unset, so consumer sites never inherit this container.
google_tag_manager : 'GTM-NN8P7RZ'
# PostHog Analytics Configuration
# https://posthog.com/docs/libraries/js
posthog:
enabled : true
# [redacted]
api_host : 'https://us.i.posthog.com'
person_profiles : 'identified_only' # Options: 'always', 'identified_only', 'never'
autocapture : true # Automatically capture clicks, form submissions, etc.
capture_pageview : true # Track page views
capture_pageleave : true # Track when users leave pages
session_recording : false # Enable session recordings (privacy consideration)
disable_cookie : false # Set to true for cookieless tracking
respect_dnt : true # Respect Do Not Track browser setting
cross_subdomain_cookie : false # Enable if you have multiple subdomains
secure_cookie : true # Use secure cookies in production
persistence : 'localStorage+cookie' # Options: 'localStorage+cookie', 'cookie', 'memory'
custom_events:
track_downloads : true # Track PDF, ZIP, etc. downloads
track_external_links : true # Track clicks to external websites
track_search : true # Track search queries
track_scroll_depth : true # Track how far users scroll
privacy:
mask_all_text : false # Mask all text in session recordings
mask_all_inputs : true # Mask form inputs in session recordings
ip_anonymization : false # Anonymize IP addresses
respect_gpc : true # Honor the Global Privacy Control signal (like DNT; a legal signal under CCPA/CPRA)
require_consent : false # true = start opted OUT (memory-only persistence, no cookies) until the visitor
# accepts the "analytics" category in the theme's cookie-consent banner
geoip_disable : false # true = stop PostHog resolving IP → location on every event
# Page Views - Per-page view counter ##############################################
# Tracks a view for the page being read and displays the count in the article
# meta row (components/page-views.html; badge markup, behaviour in
# assets/js/page-views.js). Privacy gates mirror the posthog block above.
#
# Providers:
# local Counts live in THIS visitor's localStorage. No server, no network,
# GitHub-Pages safe — the number is "how often you opened this page".
# The zero-config default.
# remote Counts come from an HTTP counter endpoint you control (the chat
# proxy, a Cloudflare/Netlify function, CounterAPI, …). The endpoint
# is the source of truth; the theme only asks it for a number.
page_views:
enabled : true # Master switch for tracking + display
provider : 'local' # 'local' (localStorage) | 'remote' (HTTP endpoint)
track : true # false = display known counts, never record new ones
dedupe : 'session' # 'session' = one view per page per browser session
# 'never' = count every page load
max_entries : 500 # Cap on locally stored paths (oldest evicted first)
label_one : 'view' # Singular label rendered next to the count
label_other : 'views' # Plural label
# Privacy — these suppress RECORDING only; an already-known count still renders
respect_dnt : true # Honor the Do Not Track browser setting
respect_gpc : true # Honor the Global Privacy Control signal
require_consent : false # true = record nothing until the visitor accepts the
# "analytics" category in the cookie-consent banner
# Remote provider only (ignored when provider is 'local')
endpoint : '' # Counter URL; '{path}' is substituted, otherwise
# the page path is appended as ?path=…
method : 'POST' # HTTP method used to record a view
count_key : 'views' # Key holding the number in the JSON response
# (dotted paths allowed, e.g. 'data.views')
fallback_local : false # true = fall back to the local counter when the
# endpoint is unreachable
# Nanobar - Page Loading Progress Bar #############################################
# Visual loading indicator shown on every page load.
# Library: https://github.com/jacoborus/nanobar
nanobar:
enabled : true # Master switch — set false to disable entirely
# Visual styling (any valid CSS values; CSS variables / var() are supported)
color : "var(--bs-primary)" # Bar (progress) color
background : "transparent" # Track background behind the bar
height : "3px" # Bar thickness (e.g. 2px, 4px, 0.25rem)
# Placement
position : "navbar" # top | bottom | navbar (under header)
z_index : 9999 # Stacking order
# Loading simulation — percentages applied in order on DOMContentLoaded.
# With step_delay_ms = 0 the bar fills instantly and is essentially invisible
# on fast pages. Increase to slow / make the animation perceivable.
steps : [20, 55, 85, 100]
step_delay_ms : 180 # Delay between steps in ms (0 = instant burst)
# Advanced (rarely needs changing)
classname : "nanobar" # Class added to the injected element
id : "top-progress-bar" # DOM id of the injected element
target : "" # CSS selector to mount inside; "" = fixed to viewport
## AI Chat Configuration #####################################################
# Frontend chatbot that provides AI-powered assistance with page context
# [redacted]
# [redacted]
#
# Security Note: For production use, consider routing requests through a
# server-side proxy to avoid exposing the API key in client-side code.
ai_chat:
enabled : true
provider : 'anthropic' # AI provider (Claude Messages API)
auth_mode : 'proxy' # 'proxy' (recommended) or 'direct'
proxy_ready : false # Set true only when your proxy endpoint is deployed
model : 'claude-opus-4-8' # Claude model to use
# [redacted]
# [redacted]
# [redacted]
# [redacted]
endpoint : '/api/chat' # Proxy endpoint (same-origin) for production safety.
# Direct mode talks to https://api.anthropic.com/v1/messages
anthropic_version : '2023-06-01' # Anthropic API version header
# [redacted]
strict_context : true # Ground answers to current page context only
out_of_scope_message : "I can only answer from the content on this page."
system_prompt : >-
You are a helpful assistant for the Zer0-Mistakes website,
a Jekyll theme and developer blog. Answer questions about the
current page content and help users navigate the site.
Be concise and friendly.
welcome_message : "Hi! I'm the Zer0 assistant. Ask about this page, report a problem, or suggest an improvement."
placeholder : "Ask about this page..."
context_max_length : 2000 # Max chars of page content sent as context
icon : 'bi-robot' # Bootstrap icon for chat button
local_edit : false # DEV ONLY: let the assistant write the current page's
# source file via the dev proxy (never enable in production)
local_edit_endpoint : '/api/page' # dev proxy base for reading/writing the local source file
github: # GitHub actions exposed to the assistant (tool use)
enabled : true # Offer issue/PR tools in the chat
# [redacted]
# 'proxy' = real issues + PRs via the proxy's GitHub routes
# (see templates/deploy/chat-proxy/)
endpoint : '/api/github' # Proxy base path for GitHub actions (proxy mode)
base_branch : 'main' # Branch sources are read from / PRs are based on
default_labels : ['from-chat'] # Labels added to issues created from the chat
pr_branch_prefix : 'chat/' # Prefix for PR branches created by the proxy
## Page Feedback — "Improve this page" capture #################################
# Runtime capture widget: _includes/components/page-feedback.html +
# assets/js/page-feedback.js. Turns what a reader is looking at into a
# well-formed GitHub issue — request type + description + live page context +
# captured console/error logs — filed with labels that actually exist.
#
# Two layers:
# [redacted]
# github.com/issues/new form. Works on any fork of the theme.
# - AI enrichment (optional): when the chat proxy is deployed
# (ai_chat.proxy_ready), the capture is sent to Claude — via Claude Code
# OAuth, server-side — to clarify, vet, prioritize, and recommend before
# the issue is filed. Reuses templates/deploy/chat-proxy/.
page_feedback:
enabled : true # Master switch for the widget
fab : true # Show the global floating feedback button
fab_icon : 'bi-megaphone' # Bootstrap icon for the FAB
fab_label : 'Improve this page'
capture_logs : true # Capture console/error logs (previewed before submit)
log_limit : 40 # Max console/error entries kept in the ring buffer
# [redacted]
# 'proxy' = file real issues via the chat proxy
endpoint : '/api/feedback' # Proxy triage/analysis route (AI layer)
issue_endpoint : '/api/github/issue' # Proxy real-issue route (proxy mode)
default_labels : ['page-feedback'] # Marker label added to every issue (MUST exist in repo)
assignee : 'copilot' # Assignee for agent-actionable types ('' to disable)
ai:
enabled : true # Offer AI clarify/vet/prioritize (needs the proxy deployed)
auto : false # false = user taps "Analyze with AI"; true = on open
model : 'claude-opus-4-8' # Model for the triage call
# [redacted]
## Multilingual Translation (AI-generated alternates) ##########################
# English content under pages/** is the ONLY human-maintained language.
# Alternate languages are generated by scripts/translate.rb — using Claude
# [redacted]
# [redacted]
# .github/workflows/translate.yml (one bulk `full` job on dispatch, plus
# incremental runs when English content changes on main):
# fr/** translated page files (permalink /fr<en-url>)
# _data/i18n/<lang>.yml translated UI strings (from _data/ui-text.yml en)
# _data/i18n/manifest.yml en URL -> translations map (language toggle,
# hreflang tags, incremental change detection)
# Never edit generated files by hand — change the English source and let the
# workflow retranslate. Docs: docs/systems/multilingual-translation.md
translation:
enabled : true
source_lang : en # human-maintained language
languages : [fr] # generated alternates (ISO 639-1)
provider : claude # claude | stub (offline test provider)
model : claude-opus-4-8 # Claude model for translation calls
ui_text : true # also translate _data/ui-text.yml en
sources: # English roots -> /<lang>/<output>/
- path: pages/_posts
output: posts
- path: pages/_docs
output: docs
- path: pages/_about
output: about
- path: pages/_quickstart
output: quickstart
- path: pages/_notes
output: notes
exclude:
- "**/README.md"
- "**/_templates/**"
# Admin config utility: embeds a raw _config.yml dump via `include_relative`,
# whose sibling data file isn't copied into the translated tree (breaks the
# GitHub Pages build). Nothing prose-like to translate anyway.
- "**/_about/settings/config.md"
## Site verification #############################################################
google_site_verification : null
bing_site_verification : null
alexa_site_verification : null
yandex_site_verification : null
aver_site_verification : null
baidu_site_verification : null
## Affiliations ##############################################################
default_icon: "bi" ## Bootstrap Icons https://icons.getbootstrap.com/
links:
- label: "Portfolio"
url: [ 'https://', *github_user, '.github.io/']
icon: "bi-link"
- label: "X"
icon: "bi-twitter-x"
url: "https://x.com/bamr87"
- label: "GitHub"
icon: "bi-github"
url: [ 'https://github.com/' , *github_user ]
- label: "Instagram"
icon: "bi-instagram"
url: "https://instagram.com/bamr42"
youtube:
- label: "YouTube"
icon: "bi-youtube"
url: "https://www.youtube.com/channel/UCO0j3Opg3J9i2iWnDwHUsXQ"
## Build Framework ##############################################################
powered_by:
- name: "Ruby"
version: "3.3"
url: "https://www.ruby-lang.org/"
icon: "bi-gem"
- name: "Jekyll"
version: "3.10"
url: "https://jekyllrb.com/"
icon: "bi-joystick"
- name: "Bootstrap"
version: "5.3.3"
url: "https://getbootstrap.com/"
icon: "bi-bootstrap"
- name: "MathJax"
url: "https://www.mathjax.org/"
icon: "bi-calculator"
- name: "GitHub Pages"
version: "232"
url: "https://pages.github.com/"
icon: "bi-github"
- name: "Docker"
url: "https://www.docker.com/"
icon: "bi-docker"
### Plugins #####################################################################
# https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/about-github-pages-and-jekyll#plugins
# http://jekyllrb.com/docs/plugins/
# All plugins are enabled by default for GitHub Pages. https://pages.github.com/versions/
plugins:
- github-pages
- jekyll-remote-theme
- jekyll-feed
- jekyll-sitemap
- jekyll-seo-tag
- jekyll-paginate
- jekyll-relative-links
# jekyll-redirect-from is on the GitHub Pages whitelist and powers Obsidian
# `aliases:` → URL redirects (see pages/_docs/obsidian/syntax-reference.md).
- jekyll-redirect-from
# jekyll-include-cache (on the GitHub Pages whitelist) provides the
# {% include_cached %} tag used by setup-banner.html and other includes to
# collapse per-page renders of stable content into a single cached render.
- jekyll-include-cache
# Note: jekyll-mermaid is NOT in GitHub Pages whitelist - it only provides the
# `mermaid` Liquid tag. Do NOT write that tag with its Liquid braces anywhere in
# this file: github-pages filters the non-whitelisted gem out, so the tag never
# registers, and a literal occurrence here is parsed as a real tag and fails the
# build with "Unknown tag 'mermaid'".
# Mermaid diagrams work without this plugin via client-side JavaScript (see _includes/components/mermaid.html)
- jekyll-mermaid
# Project resource links (used by landing page and includes)
resources:
github_repo: [ 'https://github.com/', *github_user, '/', *github_repository ]
github_fork: [ 'https://github.com/', *github_user, '/', *github_repository, '/fork' ]
contributing: [ 'https://github.com/', *github_user, '/', *github_repository, '/blob/', *branch, '/CONTRIBUTING.md' ]
rubygems:
name: *gem
url: [ 'https://rubygems.org/gems/', *gem ]
docker:
image: [ *github_user, '/', *github_repository ]
hub_url: [ 'https://hub.docker.com/r/', *github_user, '/', *github_repository ]
## Giscus Comments (GitHub Discussions) #########################################
# Powered by https://giscus.app/ — comments are stored as GitHub Discussions.
# The theme reads exactly three keys: enabled, data-repo-id, data-category-id.
# data-repo is filled automatically from `repository` above.
# Docs: pages/_docs/features/giscus-comments.md
# NOTE: the key MUST be `giscus` — layouts/includes read `site.giscus.*`.
giscus:
enabled: true
# IDs below belong to bamr87/zer0-mistakes (Announcements category).
# Regenerate for a fork at https://giscus.app/ or run:
# ./scripts/bin/giscus-discussions categories
data-repo-id: "R_kgDOMFgJHQ"
data-category-id: "DIC_kwDOMFgJHc4C52bX"
## Mermaid Diagram Configuration #################################################
# Mermaid diagrams support both native markdown code blocks and div syntax
# Usage:
# 1. Add 'mermaid: true' to page front matter
# 2. Use ```mermaid ... ``` code blocks OR <div class="mermaid">...</div>
#
# GitHub Pages Compatible: Yes (client-side; script bundled under assets/vendor/)
# Update file: npm install && npm run vendor:mermaid (copies from node_modules/mermaid, not jsDelivr)
# Plugin: jekyll-mermaid is OPTIONAL (not needed for GitHub Pages)
# Documentation: https://mermaid.js.org/
mermaid:
src: '/assets/vendor/mermaid/mermaid.min.js'
## Conversion
# Markdown Options https://jekyllrb.com/docs/configuration/markdown/
# https://github.com/github/jekyll-commonmark-ghpages
markdown: kramdown
# highlighter: rouge
# lsi: false
# excerpt_separator: "\n\n"
# incremental: false
# Markdown Processing https://jekyllrb.com/docs/configuration/markdown/
kramdown: # https://kramdown.gettalong.org/options.html
input: GFM
header_offset: 0
# hard_wrap: false
# auto_ids: true
# footnote_nr: 1
# entity_output: as_char
toc_levels: 1..6
# smart_quotes: lsquo,rsquo,ldquo,rdquo
# enable_coderay: false
# Collections: https://jekyllrb.com/docs/collections/
# Permalinks: https://jekyllrb.com/docs/permalinks/
collections_dir: &collections_dir pages
local_repo_path: [ *collections_dir, '/', *local_repo ]
# Collection metadata used by the sidebar's "collection" mode:
# title — heading shown above the collection tree (default: label)
# icon — Bootstrap Icons class for the heading
# sidebar — per-collection sidebar defaults, e.g.
# sidebar: { nav: collection, title: "Guides" }
# (page front matter still wins; see sidebar-config.html)
collections:
pages:
output: true
permalink: /:collection/:name/
posts:
output: true
permalink: /:collection/:year/:month/:day/:slug/
docs:
output: true
title: Documentation
icon: bi-journal-text
permalink: /:collection/:categories/:name/
quests:
output: true
permalink: /:collection/:categories/:name/
hobbies:
output: true
permalink: /:collection/:categories/:name/
notebooks:
output: true
title: Notebooks
icon: bi-journal-code
permalink: /:collection/:path/:name/
notes:
output: true
title: Notes
icon: bi-journal-richtext
permalink: /:collection/:path/:name/
quickstart:
output: true
title: Quick Start
icon: bi-rocket-takeoff
permalink: /:collection/:name/
about:
output: true
title: About
icon: bi-person-badge
permalink: /:collection/:categories/:name/
# Children's-book collection: each book is a folder of story "chapters"
# (numeric `chapter:` front matter) plus an index.md landing page
# (`layout: book`). Layouts: book.html + book-story.html; components:
# bookshelf / book-card / book-toc / book-nav / book-plate.
# Docs: /docs/features/book-collection/
books:
output: true
title: Books
icon: bi-book-half
permalink: /:collection/:path/
permalink: pretty
# pagination https://jekyllrb.com/docs/pagination/
paginate: 10
paginate_path: "/pages/:num/"
# Defaults https://jekyllrb.com/docs/configuration/front-matter-defaults/
defaults:
# ALL
# No sidebar nav here on purpose: root-level pages (landing README, 404)
# use layouts without the #bdSidebar panel, so a resolvable site-wide nav
# would put a dead toggle in their navbar. Collections opt in below.
-
scope:
path: ""
values:
layout: root
author_profile: false
read_time: true
comments: false # true
share: true
related: true
permalink: /:collection/:name/
# pages
-
scope:
path: pages
values:
layout: &pages default
author_profile: true
read_time: true
comments: # true
share: true
related: true
toc_sticky: true
sidebar:
nav: categories
permalink: /:path/:name/
# pages/_about
-
scope:
path: pages/_about
values:
layout: *pages
collection: about
share: true
related: true
sidebar:
nav: auto
# pages/_quickstart
-
scope:
path: pages/_quickstart
values:
layout: default
collection: quickstart
share: true
related: true
sidebar:
nav: auto
# pages/_posts
-
scope:
path: pages/_posts
values:
layout: article
post_type: standard
index: false
sidebar: true
author_profile: true
read_time: true
comments: true # blog posts show Giscus comments (override per-page with `comments: false`)
share: true
related: true
# permalink: /:collection/:name/
# pages/_docs
-
scope:
path: pages/_docs
values:
layout: *pages
# category: docs
author_profile: true
read_time: true
sidebar:
nav: auto
comments: # true
share: true
related: true
# permalink: /docs/:category/:name/
# pages/_notes
-
scope:
path: pages/_notes
type: notes
values:
layout: note
collection: notes
author_profile: true
read_time: true
comments: true
share: true
related: true
sidebar:
nav: auto
# pages/_notebooks
-
scope:
path: pages/_notebooks
type: notebooks
values:
layout: notebook
collection: notebooks
author_profile: true
read_time: true
comments: true
share: true
related: true
jupyter_metadata: true
sidebar:
nav: auto
# pages/_books — picture-book stories read cover-to-cover: no sidebar,
# no comments by default; index.md overrides layout to `book` per book.
-
scope:
path: pages/_books
type: books
values:
layout: book-story
sidebar: false
comments: false
share: true
author_profile: false
# fr/ — GENERATED translations (scripts/translate.rb). These are plain
# Jekyll pages (safe-mode friendly: no plugin needed) whose permalinks are
# written explicitly into each file; the scopes below mirror the key
# front-matter defaults of their English source trees.
-
scope:
path: fr
values:
layout: default
author_profile: true
read_time: true
share: true
related: true
toc_sticky: true
sidebar:
nav: categories
-
scope:
path: fr/posts
values:
layout: article
post_type: standard
index: false
sidebar: true
comments: true
-
scope:
path: fr/notes
values:
layout: note
comments: true
# Exclude from processing.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
# NOTE: When _config_dev.yml is layered on top (--config _config.yml,_config_dev.yml),
# the dev file MUST repeat this full list — Jekyll replaces, not merges, the exclude key.
exclude:
# ── Jekyll cache ─────────────────────────────────────────────────────────
- .sass-cache/
- .jekyll-cache/
# ── Obsidian vault working files ─────────────────────────────────────────
- .obsidian/
- "*.canvas"
- "*.excalidraw.md"
# ── IDE / editor config (dot-prefix dirs hidden by default; listed for clarity) ─
- .cursor/
- .devcontainer/
- .frontmatter/
- .github/
- .vscode/
# ── Ruby / Bundler ────────────────────────────────────────────────────────
- Gemfile
- Gemfile.lock
- gemfiles/
- jekyll-theme-zer0.gemspec
- lib/
- pkg/
- vendor/bundle/
- vendor/cache/
- vendor/gems/
- vendor/ruby/
# ── Node.js ───────────────────────────────────────────────────────────────
- node_modules/
- package.json
- package-lock.json
# ── Shell scripts and automation ──────────────────────────────────────────
- scripts/
- "*.sh"
# ── Docker configuration ──────────────────────────────────────────────────
- docker/
- docker-compose.yml
- docker-compose.test.yml
# ── Build / task runners ──────────────────────────────────────────────────
- Makefile
- Rakefile
# ── Project tooling metadata ──────────────────────────────────────────────
- AGENTS.md
- docs/
- frontmatter.json
- logs/
- templates/
- vendor-manifest.json
- "*.code-workspace"
# ── Submodules, tests, and authoring scaffolding ──────────────────────────
# examples/ holds self-contained demo sites, each with its own _config.yml
# and Gemfile. They are built independently (see examples/README.md), never
# as part of this site.
- examples/
- submodules/
- test/
- tests/
- MERMAID-*.md
- MERMAID-*/
- pages/_notes/_templates/
# Force-include — underscore-prefixed paths Jekyll would otherwise skip.
# _design-system/ is the git mirror of the Claude Design project (contract:
# [redacted]
# manifest, and specimen cards live URLs under /_design-system/ — linked from
# the /design/ hub page and consumable by prototypes ("link THIS one file").
include:
- _design-system
# Sass/SCSS
# Production default: minified output, no sourcemaps. main.css is render-blocking
# on every page, so we ship it compressed (~182KB expanded -> ~140KB minified)
# and skip the .css.map files. _config_dev.yml overrides this back to expanded +
# sourcemaps for local debugging.
sass:
sass_dir: _sass
style: compressed
sourcemap: never
# TODO: Fix bootstrap plugin
# load_paths:
# - /usr/local/bundle/gems/bootstrap-5.3.3/assets/stylesheets
## Style Settings -------------------------------------------------------------
# theme : "zer0-mistakes-jekyll"
# remote_theme : "bamr87/zer0-mistakes"
theme_skin : "air" # "air", "aqua", "dirt", "neon", "mint", "plum", "sunrise"
# SVG background layers (fffuel.co style) — gradient, pattern, noise per skin
theme_background:
enabled: true # Master toggle for SVG backgrounds
gradient_opacity: 0.6 # Hero/header gradient layer opacity
texture_opacity: 0.04 # Body noise texture overlay opacity
pattern_opacity: 0.08 # Surface/card pattern overlay opacity
blend_mode: overlay # CSS mix-blend-mode for all layers
# style : "default" # "default", "dark", "light", "solarized-dark", "solarized-light"
# remote_style : "bamr87/zer0-mistakes"
# NOTE: Hex codes MUST be quoted — unquoted `#007bff` is parsed as a YAML
# comment and the key resolves to null. These values feed
# [redacted]
theme_color:
main: "#007bff"
secondary: "#6c757d"
red: "#a11111"
yellow: "#ffe900"
teal: "#376986"
blue: "#007bff"
green: "#28a745"
purple: "#6f42c1"
pink: "#e83e8c"
orange: "#fd7e14"
brown: "#795548"
cyan: "#17a2b8"
indigo: "#6610f2"
lime: "#cddc39"
amber: "#ffc107"
deep_orange: "#ff5722"
deep_purple: "#673ab7"
light_blue: "#03a9f4"
light_green: "#8bc34a"
light_purple: "#9c27b0"
light_red: "#f44336"
light_yellow: "#ffeb3b"
light_teal: "#009688"
## Copyright Settings --------------------------------------------------------------
cr_year: 2024
cr_entity: *name
cr_lisense: "MIT"
## Sitemap Settings --------------------------------------------------------------
# sitemap_include: A list of file extensions that should be included in the sitemap. By default, HTML files and any files with sitemap: true in their front matter are included.
# sitemap_exclude: A list of files or directories that should be excluded from the sitemap.
sitemap_include: ["html", "xml"]
# [redacted]
Regenerate Config
Copy the live _config.yml into this settings directory for documentation purposes.
Bash
```bash
cd ~/github/zer0-mistakes
# Wraps the copy in Liquid raw markers so config comments that mention
# Liquid tags render literally (scripts/bin/validate checks for drift).
# The awk string-splits keep this page itself Liquid-safe.
awk 'BEGIN{print "{" "% raw %" "}"} {print} END{print "{" "% endraw %" "}"}' \
_config.yml > pages/_about/settings/_config.yml
```
# Welcome to the configuration file for Jekyll.
# Full docs at: http://jekyllrb.com/docs/configuration/
# YAML docs at: https://yaml.org/spec/1.2.2/
# ---------------------------------------------------------------------------------
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server.
#
# If you need help with YAML syntax, here are some quick references for you:
# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
# https://learnxinyminutes.com/docs/yaml/
#
# You can find config options at: https://jekyllrb.com/docs/configuration/options/
#
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
# Site Settings ###################################################################
site_configured : true # Tells the theme this site has been personalised
founder : "Amr Abdel-Motaleb"
remote_theme : "bamr87/zer0-mistakes"
gem : &gem "jekyll-theme-zer0"
# theme : "jekyll-theme-zer0"
## Github Information
github_user : &github_user "bamr87"
repository_name : &github_repository "zer0-mistakes"
repository : [*github_user, "/", *github_repository] # GitHub username/repo-name
local_repo : &local_repo "zer0-mistakes"
branch : &branch "main"
repo_map : "/sitemap/"
portfolio : &portfolio [*github_user, '.', 'github.io']
## Site Information ---------------------------------------------------------------
# Emit the SoftwareApplication JSON-LD block (_includes/content/jsonld-software.html)
# on the homepage. That payload describes THE THEME — its RubyGems URL, GitHub
# repo, MIT licence, feature list and author — so only the theme's own site may
# truthfully claim it. Consumers must leave this off; on their homepage it would
# assert that their site is this Ruby gem.
jsonld_software_application: true
title : &title "zer0-mistakes"
title_url : "/"
title_icon : "robot"
subtitle : ""
subtitle_url : "localhost"
subtitle_icon : "code"
title_separator : "|" # Appears in the web browser tab name
domain : &domain "zer0-mistakes"
domain_ext : &domain_ext "com"
baseurl : &baseurl "" # the subpath of your site, e.g. /blog - Use this if you want this whole repo to be a domain branch
url_test : &url_test [ 'https', '://', *github_user, '.', *domain, '.', *domain_ext ] # the base hostname & protocol for your site, e.g. http://example.com
domain_url : &domain_url [ 'https', '://', *domain, '.', *domain_ext ]
github_io_url : &github_io_url [ 'https', '://', *github_user, '.', *domain, '.', *domain_ext, '/', *github_repository ]
url : &url https://zer0-mistakes.com
public_folder : assets # path to the public folder
port : 4000 # Jekyll Serve Dev port
dg_port : 4001 # TODO: Doppelganger site. Use this if you want to switch between parallel deployments
og_image : '/assets/images/wizard-on-journey.png'
### Owner Information -------------------------------------------------------------
name : &name "Amr"
email : "amr@zer0-mistakes.com"
description : >- # this means to ignore newlines until the next variable
"Jekyll and Bootstrap 5 theme for perfectionists.
Step-by-step instructions to build your blog, portfolio,
and documentation site with no mistakes, unless you're a n00b."
level : 'n00b'
## Maintainer Information----------------------------------------------------------
maintainers:
- name: *name
profile: ["https://github.com", "/", *github_user]
- name: "Vacant"
profile: "/github.com"
## Personalization ----------------------------------------------------------------
locale : "en-US"
home_dir : &home '/Users/bamr87/'
local_git : [ *home, 'github' ]
logo : /assets/images/gravatar-small.png # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png"
logo_link : [ *url, *baseurl ] # URL to link the logo to, e.g. "/"
teaser : '/assets/images/favicon_gpt_computer_retro.png' # path of fallback teaser image, e.g. "/assets/images/500x300.png"
info_banner : '/assets/images/info-banner-mountain-wizard.png' # path of fallback teaser image, e.g. "/assets/images/500x300.png"
# Favicon / browser identity — rendered by _includes/core/favicon.html.
# All keys optional; with no block at all the theme still links /favicon.ico.
# theme_color falls back to theme_color.main below when unset here.
favicon:
ico : /favicon.ico
apple_touch : /assets/images/favicon_gpt_computer_retro.png
## Preview Image Generation (AI-powered) #####################################
# Settings for automatic preview image generation using AI
# Used by: scripts/generate-preview-images.sh → scripts/lib/preview_generator.py
#
# Claude ORCHESTRATES, an image model RENDERS: Claude analyzes the article and
# writes the art-direction brief (prompt_engine: claude), the provider below
# renders it, then Claude reviews the image and may request one refined
# [redacted]
# [redacted]
# logged-in `claude` CLI — without one, orchestration degrades to the template
# prompt with no review. Renderers (openai, xai, stability, gemini) need their
# own key; `local` needs none (deterministic SVG, skips orchestration).
#
# Per-author override: a post's `author:` may point at an entry in
# _data/authors.yml that defines a `preview:` block (style, style_modifiers,
# size, quality, model). Those values WIN over the settings below for that
# post's banner — giving each AI author persona (e.g. cassandra, vega) a
# distinct art style. See pages/_docs/customization/author-profiles.md § 6.
preview_images:
enabled : true
provider : 'openai' # renderer: openai, xai, stability, gemini, local
model : 'gpt-image-2' # renderer model; another vendor family falls back to the provider default
size : '1536x1024' # Landscape banners; raster vendors adapt per model (DALL-E 3: 1792x1024)
quality : 'auto' # auto for GPT Image models; standard/hd for DALL-E 3
style : 'retro pixel art, 8-bit video game aesthetic, vibrant colors, nostalgic, clean pixel graphics'
output_dir : 'assets/images/previews'
# Claude orchestration: 'claude' analyzes the article into the art brief
# ('template' = built-in prompt), and reviews the rendered image with vision
# ('none' disables). claude_model overrides the orchestration model.
prompt_engine : 'claude'
review_engine : 'claude'
# claude_model : 'claude-opus-4-8'
# Path normalization: allows omitting /assets/ prefix in frontmatter
# e.g., preview: /images/previews/my-image.png becomes /assets/images/previews/my-image.png
assets_prefix : '/assets' # Prefix to prepend to relative preview paths
auto_prefix : true # Auto-add assets_prefix if path doesn't start with it
# Additional style modifiers applied to all prompts
style_modifiers : 'pixelated, retro gaming style, CRT screen glow effect, limited color palette'
# Content statistics
# _data/content_statistics.yml is committed and read directly by templates
# (site.data.content_statistics). The _plugins/content_statistics_generator.rb
# hook re-derives it from a full content scan on EVERY `jekyll build` (~12x per
# CI run) — pure waste when content hasn't changed, plus it dirties a tracked
# file. Keep it off by default; refresh explicitly with `rake stats:generate`
# (or _data/generate_statistics.sh) when content changes.
content_statistics:
auto_generate : false
breadcrumbs : true # true, false (default)
words_per_minute : 200
_posts_file_structure : "year-month-day-title.md"
# UI navigation behaviour --------------------------------------------------
# Optional consolidation of the mobile sidebar + main-menu offcanvases into
# a single tabbed drawer (Browse / Menu / Settings). Default false to avoid
# disrupting existing forks. See _includes/navigation/unified-drawer.html.
navigation:
unified_mobile_drawer : false # true to opt into the single-drawer pattern
# News layouts (news.html / section.html) ----------------------------------
# Every key optional; the layouts also work with NO _data/navigation/posts.yml
# (sections then derive from site.categories). See _layouts/news.html header.
# news:
# category_base : "/news/" # base path of per-category section pages (e.g. "/categories/")
# index_url : "/news/" # the news homepage (section breadcrumbs / back-links)
# hero : true # false = no latest-post hero fallback when nothing is breaking/featured
# archives_url : "" # archives page to deep-link months to (auto-detects /archives/; unlinked otherwise)
# newsletter:
# enabled : true # false hides the subscribe band
# endpoint : "" # form POST target; without one a mailto: on site.email is used
# heading : "Stay Updated"
# lead : "Subscribe to get the latest news and updates delivered to your inbox."
# Left sidebar defaults -----------------------------------------------------
# Site-wide defaults for the docs sidebar panel. Pages override via the
# `sidebar:` front-matter hash; collections via `sidebar:` metadata under
# `collections:` below. Resolution: page → collection → site (this block).
# Full reference: /docs/features/sidebar-navigation/
sidebar:
title : "Browse docs" # panel heading text
icon : "bi-journal-bookmark" # Bootstrap Icons class for the heading
# nav : auto # optional site-wide fallback nav mode for pages
# # that set none. Modes: auto | collection |
# # categories | tags | <_data/navigation/*.yml name>
# Opt-in user override hooks. When true, the theme loads:
# - assets/css/user-overrides.css (after main.css, wins over theme rules)
# - assets/js/user-overrides.js (after the theme JS bundle)
# Ship these files in your fork; they are not bundled with the theme.
user_overrides : false
# Default color mode for new visitors (before any localStorage preference is set).
# Values: dark | light | auto
# dark — always start in dark mode (Bootstrap data-bs-theme="dark")
# light — always start in light mode (Bootstrap data-bs-theme="light")
# auto — follow the visitor's OS/browser prefers-color-scheme (default)
# The user can still override this at any time with the Appearance panel.
# An inline script in <head> applies the correct mode before CSS loads, preventing FOUC.
color_mode_default : auto
# Pin the color mode site-wide. When true, color_mode_default wins
# unconditionally: visitor preference (localStorage) and the OS scheme are
# ignored, and the light/dark/auto switcher is removed from the UI. For
# brand-locked sites that are designed for exactly one mode.
color_mode_lock : false
# Runtime Appearance panel inside the Settings offcanvas (Track 6).
# Adds light/dark/auto color-mode buttons + a primary-color picker that
# writes to localStorage["zer0-appearance"] and updates --zer0-color-primary
# without a page reload. Falls back gracefully when disabled.
appearance_panel : true
## Identity #####################################################################
author:
name : *name # *name is a YAML reference pointing to the &anchor earlier
avatar : "/assets/images/gravatar-small.png"
email_hash : &email_hash '71d7a4fc9712df49e13d606e620f89c7' # https://en.gravatar.com/site/check/{ site.email }
gravatar : [ 'https://s.gravatar.com/avatar/', *email_hash, '?s=80' ]
bio : "IT nerd trying to be an IT hero"
location : "Denver, CO"
twitter_username : "bamr87"
github_username : *github_user
## Site Analytics #############################################################
google_analytics : 'G-ZBDKNMC168'
# Google Tag Manager container for THIS site. The GTM includes emit nothing
# when this is unset, so consumer sites never inherit this container.
google_tag_manager : 'GTM-NN8P7RZ'
# PostHog Analytics Configuration
# https://posthog.com/docs/libraries/js
posthog:
enabled : true
# [redacted]
api_host : 'https://us.i.posthog.com'
person_profiles : 'identified_only' # Options: 'always', 'identified_only', 'never'
autocapture : true # Automatically capture clicks, form submissions, etc.
capture_pageview : true # Track page views
capture_pageleave : true # Track when users leave pages
session_recording : false # Enable session recordings (privacy consideration)
disable_cookie : false # Set to true for cookieless tracking
respect_dnt : true # Respect Do Not Track browser setting
cross_subdomain_cookie : false # Enable if you have multiple subdomains
secure_cookie : true # Use secure cookies in production
persistence : 'localStorage+cookie' # Options: 'localStorage+cookie', 'cookie', 'memory'
custom_events:
track_downloads : true # Track PDF, ZIP, etc. downloads
track_external_links : true # Track clicks to external websites
track_search : true # Track search queries
track_scroll_depth : true # Track how far users scroll
privacy:
mask_all_text : false # Mask all text in session recordings
mask_all_inputs : true # Mask form inputs in session recordings
ip_anonymization : false # Anonymize IP addresses
respect_gpc : true # Honor the Global Privacy Control signal (like DNT; a legal signal under CCPA/CPRA)
require_consent : false # true = start opted OUT (memory-only persistence, no cookies) until the visitor
# accepts the "analytics" category in the theme's cookie-consent banner
geoip_disable : false # true = stop PostHog resolving IP → location on every event
# Page Views - Per-page view counter ##############################################
# Tracks a view for the page being read and displays the count in the article
# meta row (components/page-views.html; badge markup, behaviour in
# assets/js/page-views.js). Privacy gates mirror the posthog block above.
#
# Providers:
# local Counts live in THIS visitor's localStorage. No server, no network,
# GitHub-Pages safe — the number is "how often you opened this page".
# The zero-config default.
# remote Counts come from an HTTP counter endpoint you control (the chat
# proxy, a Cloudflare/Netlify function, CounterAPI, …). The endpoint
# is the source of truth; the theme only asks it for a number.
page_views:
enabled : true # Master switch for tracking + display
provider : 'local' # 'local' (localStorage) | 'remote' (HTTP endpoint)
track : true # false = display known counts, never record new ones
dedupe : 'session' # 'session' = one view per page per browser session
# 'never' = count every page load
max_entries : 500 # Cap on locally stored paths (oldest evicted first)
label_one : 'view' # Singular label rendered next to the count
label_other : 'views' # Plural label
# Privacy — these suppress RECORDING only; an already-known count still renders
respect_dnt : true # Honor the Do Not Track browser setting
respect_gpc : true # Honor the Global Privacy Control signal
require_consent : false # true = record nothing until the visitor accepts the
# "analytics" category in the cookie-consent banner
# Remote provider only (ignored when provider is 'local')
endpoint : '' # Counter URL; '{path}' is substituted, otherwise
# the page path is appended as ?path=…
method : 'POST' # HTTP method used to record a view
count_key : 'views' # Key holding the number in the JSON response
# (dotted paths allowed, e.g. 'data.views')
fallback_local : false # true = fall back to the local counter when the
# endpoint is unreachable
# Nanobar - Page Loading Progress Bar #############################################
# Visual loading indicator shown on every page load.
# Library: https://github.com/jacoborus/nanobar
nanobar:
enabled : true # Master switch — set false to disable entirely
# Visual styling (any valid CSS values; CSS variables / var() are supported)
color : "var(--bs-primary)" # Bar (progress) color
background : "transparent" # Track background behind the bar
height : "3px" # Bar thickness (e.g. 2px, 4px, 0.25rem)
# Placement
position : "navbar" # top | bottom | navbar (under header)
z_index : 9999 # Stacking order
# Loading simulation — percentages applied in order on DOMContentLoaded.
# With step_delay_ms = 0 the bar fills instantly and is essentially invisible
# on fast pages. Increase to slow / make the animation perceivable.
steps : [20, 55, 85, 100]
step_delay_ms : 180 # Delay between steps in ms (0 = instant burst)
# Advanced (rarely needs changing)
classname : "nanobar" # Class added to the injected element
id : "top-progress-bar" # DOM id of the injected element
target : "" # CSS selector to mount inside; "" = fixed to viewport
## AI Chat Configuration #####################################################
# Frontend chatbot that provides AI-powered assistance with page context
# [redacted]
# [redacted]
#
# Security Note: For production use, consider routing requests through a
# server-side proxy to avoid exposing the API key in client-side code.
ai_chat:
enabled : true
provider : 'anthropic' # AI provider (Claude Messages API)
auth_mode : 'proxy' # 'proxy' (recommended) or 'direct'
proxy_ready : false # Set true only when your proxy endpoint is deployed
model : 'claude-opus-4-8' # Claude model to use
# [redacted]
# [redacted]
# [redacted]
# [redacted]
endpoint : '/api/chat' # Proxy endpoint (same-origin) for production safety.
# Direct mode talks to https://api.anthropic.com/v1/messages
anthropic_version : '2023-06-01' # Anthropic API version header
# [redacted]
strict_context : true # Ground answers to current page context only
out_of_scope_message : "I can only answer from the content on this page."
system_prompt : >-
You are a helpful assistant for the Zer0-Mistakes website,
a Jekyll theme and developer blog. Answer questions about the
current page content and help users navigate the site.
Be concise and friendly.
welcome_message : "Hi! I'm the Zer0 assistant. Ask about this page, report a problem, or suggest an improvement."
placeholder : "Ask about this page..."
context_max_length : 2000 # Max chars of page content sent as context
icon : 'bi-robot' # Bootstrap icon for chat button
local_edit : false # DEV ONLY: let the assistant write the current page's
# source file via the dev proxy (never enable in production)
local_edit_endpoint : '/api/page' # dev proxy base for reading/writing the local source file
github: # GitHub actions exposed to the assistant (tool use)
enabled : true # Offer issue/PR tools in the chat
# [redacted]
# 'proxy' = real issues + PRs via the proxy's GitHub routes
# (see templates/deploy/chat-proxy/)
endpoint : '/api/github' # Proxy base path for GitHub actions (proxy mode)
base_branch : 'main' # Branch sources are read from / PRs are based on
default_labels : ['from-chat'] # Labels added to issues created from the chat
pr_branch_prefix : 'chat/' # Prefix for PR branches created by the proxy
## Page Feedback — "Improve this page" capture #################################
# Runtime capture widget: _includes/components/page-feedback.html +
# assets/js/page-feedback.js. Turns what a reader is looking at into a
# well-formed GitHub issue — request type + description + live page context +
# captured console/error logs — filed with labels that actually exist.
#
# Two layers:
# [redacted]
# github.com/issues/new form. Works on any fork of the theme.
# - AI enrichment (optional): when the chat proxy is deployed
# (ai_chat.proxy_ready), the capture is sent to Claude — via Claude Code
# OAuth, server-side — to clarify, vet, prioritize, and recommend before
# the issue is filed. Reuses templates/deploy/chat-proxy/.
page_feedback:
enabled : true # Master switch for the widget
fab : true # Show the global floating feedback button
fab_icon : 'bi-megaphone' # Bootstrap icon for the FAB
fab_label : 'Improve this page'
capture_logs : true # Capture console/error logs (previewed before submit)
log_limit : 40 # Max console/error entries kept in the ring buffer
# [redacted]
# 'proxy' = file real issues via the chat proxy
endpoint : '/api/feedback' # Proxy triage/analysis route (AI layer)
issue_endpoint : '/api/github/issue' # Proxy real-issue route (proxy mode)
default_labels : ['page-feedback'] # Marker label added to every issue (MUST exist in repo)
assignee : 'copilot' # Assignee for agent-actionable types ('' to disable)
ai:
enabled : true # Offer AI clarify/vet/prioritize (needs the proxy deployed)
auto : false # false = user taps "Analyze with AI"; true = on open
model : 'claude-opus-4-8' # Model for the triage call
# [redacted]
## Multilingual Translation (AI-generated alternates) ##########################
# English content under pages/** is the ONLY human-maintained language.
# Alternate languages are generated by scripts/translate.rb — using Claude
# [redacted]
# [redacted]
# .github/workflows/translate.yml (one bulk `full` job on dispatch, plus
# incremental runs when English content changes on main):
# fr/** translated page files (permalink /fr<en-url>)
# _data/i18n/<lang>.yml translated UI strings (from _data/ui-text.yml en)
# _data/i18n/manifest.yml en URL -> translations map (language toggle,
# hreflang tags, incremental change detection)
# Never edit generated files by hand — change the English source and let the
# workflow retranslate. Docs: docs/systems/multilingual-translation.md
translation:
enabled : true
source_lang : en # human-maintained language
languages : [fr] # generated alternates (ISO 639-1)
provider : claude # claude | stub (offline test provider)
model : claude-opus-4-8 # Claude model for translation calls
ui_text : true # also translate _data/ui-text.yml en
sources: # English roots -> /<lang>/<output>/
- path: pages/_posts
output: posts
- path: pages/_docs
output: docs
- path: pages/_about
output: about
- path: pages/_quickstart
output: quickstart
- path: pages/_notes
output: notes
exclude:
- "**/README.md"
- "**/_templates/**"
# Admin config utility: embeds a raw _config.yml dump via `include_relative`,
# whose sibling data file isn't copied into the translated tree (breaks the
# GitHub Pages build). Nothing prose-like to translate anyway.
- "**/_about/settings/config.md"
## Site verification #############################################################
google_site_verification : null
bing_site_verification : null
alexa_site_verification : null
yandex_site_verification : null
aver_site_verification : null
baidu_site_verification : null
## Affiliations ##############################################################
default_icon: "bi" ## Bootstrap Icons https://icons.getbootstrap.com/
links:
- label: "Portfolio"
url: [ 'https://', *github_user, '.github.io/']
icon: "bi-link"
- label: "X"
icon: "bi-twitter-x"
url: "https://x.com/bamr87"
- label: "GitHub"
icon: "bi-github"
url: [ 'https://github.com/' , *github_user ]
- label: "Instagram"
icon: "bi-instagram"
url: "https://instagram.com/bamr42"
youtube:
- label: "YouTube"
icon: "bi-youtube"
url: "https://www.youtube.com/channel/UCO0j3Opg3J9i2iWnDwHUsXQ"
## Build Framework ##############################################################
powered_by:
- name: "Ruby"
version: "3.3"
url: "https://www.ruby-lang.org/"
icon: "bi-gem"
- name: "Jekyll"
version: "3.10"
url: "https://jekyllrb.com/"
icon: "bi-joystick"
- name: "Bootstrap"
version: "5.3.3"
url: "https://getbootstrap.com/"
icon: "bi-bootstrap"
- name: "MathJax"
url: "https://www.mathjax.org/"
icon: "bi-calculator"
- name: "GitHub Pages"
version: "232"
url: "https://pages.github.com/"
icon: "bi-github"
- name: "Docker"
url: "https://www.docker.com/"
icon: "bi-docker"
### Plugins #####################################################################
# https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/about-github-pages-and-jekyll#plugins
# http://jekyllrb.com/docs/plugins/
# All plugins are enabled by default for GitHub Pages. https://pages.github.com/versions/
plugins:
- github-pages
- jekyll-remote-theme
- jekyll-feed
- jekyll-sitemap
- jekyll-seo-tag
- jekyll-paginate
- jekyll-relative-links
# jekyll-redirect-from is on the GitHub Pages whitelist and powers Obsidian
# `aliases:` → URL redirects (see pages/_docs/obsidian/syntax-reference.md).
- jekyll-redirect-from
# jekyll-include-cache (on the GitHub Pages whitelist) provides the
# {% include_cached %} tag used by setup-banner.html and other includes to
# collapse per-page renders of stable content into a single cached render.
- jekyll-include-cache
# Note: jekyll-mermaid is NOT in GitHub Pages whitelist - it only provides the
# `mermaid` Liquid tag. Do NOT write that tag with its Liquid braces anywhere in
# this file: github-pages filters the non-whitelisted gem out, so the tag never
# registers, and a literal occurrence here is parsed as a real tag and fails the
# build with "Unknown tag 'mermaid'".
# Mermaid diagrams work without this plugin via client-side JavaScript (see _includes/components/mermaid.html)
- jekyll-mermaid
# Project resource links (used by landing page and includes)
resources:
github_repo: [ 'https://github.com/', *github_user, '/', *github_repository ]
github_fork: [ 'https://github.com/', *github_user, '/', *github_repository, '/fork' ]
contributing: [ 'https://github.com/', *github_user, '/', *github_repository, '/blob/', *branch, '/CONTRIBUTING.md' ]
rubygems:
name: *gem
url: [ 'https://rubygems.org/gems/', *gem ]
docker:
image: [ *github_user, '/', *github_repository ]
hub_url: [ 'https://hub.docker.com/r/', *github_user, '/', *github_repository ]
## Giscus Comments (GitHub Discussions) #########################################
# Powered by https://giscus.app/ — comments are stored as GitHub Discussions.
# The theme reads exactly three keys: enabled, data-repo-id, data-category-id.
# data-repo is filled automatically from `repository` above.
# Docs: pages/_docs/features/giscus-comments.md
# NOTE: the key MUST be `giscus` — layouts/includes read `site.giscus.*`.
giscus:
enabled: true
# IDs below belong to bamr87/zer0-mistakes (Announcements category).
# Regenerate for a fork at https://giscus.app/ or run:
# ./scripts/bin/giscus-discussions categories
data-repo-id: "R_kgDOMFgJHQ"
data-category-id: "DIC_kwDOMFgJHc4C52bX"
## Mermaid Diagram Configuration #################################################
# Mermaid diagrams support both native markdown code blocks and div syntax
# Usage:
# 1. Add 'mermaid: true' to page front matter
# 2. Use ```mermaid ... ``` code blocks OR <div class="mermaid">...</div>
#
# GitHub Pages Compatible: Yes (client-side; script bundled under assets/vendor/)
# Update file: npm install && npm run vendor:mermaid (copies from node_modules/mermaid, not jsDelivr)
# Plugin: jekyll-mermaid is OPTIONAL (not needed for GitHub Pages)
# Documentation: https://mermaid.js.org/
mermaid:
src: '/assets/vendor/mermaid/mermaid.min.js'
## Conversion
# Markdown Options https://jekyllrb.com/docs/configuration/markdown/
# https://github.com/github/jekyll-commonmark-ghpages
markdown: kramdown
# highlighter: rouge
# lsi: false
# excerpt_separator: "\n\n"
# incremental: false
# Markdown Processing https://jekyllrb.com/docs/configuration/markdown/
kramdown: # https://kramdown.gettalong.org/options.html
input: GFM
header_offset: 0
# hard_wrap: false
# auto_ids: true
# footnote_nr: 1
# entity_output: as_char
toc_levels: 1..6
# smart_quotes: lsquo,rsquo,ldquo,rdquo
# enable_coderay: false
# Collections: https://jekyllrb.com/docs/collections/
# Permalinks: https://jekyllrb.com/docs/permalinks/
collections_dir: &collections_dir pages
local_repo_path: [ *collections_dir, '/', *local_repo ]
# Collection metadata used by the sidebar's "collection" mode:
# title — heading shown above the collection tree (default: label)
# icon — Bootstrap Icons class for the heading
# sidebar — per-collection sidebar defaults, e.g.
# sidebar: { nav: collection, title: "Guides" }
# (page front matter still wins; see sidebar-config.html)
collections:
pages:
output: true
permalink: /:collection/:name/
posts:
output: true
permalink: /:collection/:year/:month/:day/:slug/
docs:
output: true
title: Documentation
icon: bi-journal-text
permalink: /:collection/:categories/:name/
quests:
output: true
permalink: /:collection/:categories/:name/
hobbies:
output: true
permalink: /:collection/:categories/:name/
notebooks:
output: true
title: Notebooks
icon: bi-journal-code
permalink: /:collection/:path/:name/
notes:
output: true
title: Notes
icon: bi-journal-richtext
permalink: /:collection/:path/:name/
quickstart:
output: true
title: Quick Start
icon: bi-rocket-takeoff
permalink: /:collection/:name/
about:
output: true
title: About
icon: bi-person-badge
permalink: /:collection/:categories/:name/
# Children's-book collection: each book is a folder of story "chapters"
# (numeric `chapter:` front matter) plus an index.md landing page
# (`layout: book`). Layouts: book.html + book-story.html; components:
# bookshelf / book-card / book-toc / book-nav / book-plate.
# Docs: /docs/features/book-collection/
books:
output: true
title: Books
icon: bi-book-half
permalink: /:collection/:path/
permalink: pretty
# pagination https://jekyllrb.com/docs/pagination/
paginate: 10
paginate_path: "/pages/:num/"
# Defaults https://jekyllrb.com/docs/configuration/front-matter-defaults/
defaults:
# ALL
# No sidebar nav here on purpose: root-level pages (landing README, 404)
# use layouts without the #bdSidebar panel, so a resolvable site-wide nav
# would put a dead toggle in their navbar. Collections opt in below.
-
scope:
path: ""
values:
layout: root
author_profile: false
read_time: true
comments: false # true
share: true
related: true
permalink: /:collection/:name/
# pages
-
scope:
path: pages
values:
layout: &pages default
author_profile: true
read_time: true
comments: # true
share: true
related: true
toc_sticky: true
sidebar:
nav: categories
permalink: /:path/:name/
# pages/_about
-
scope:
path: pages/_about
values:
layout: *pages
collection: about
share: true
related: true
sidebar:
nav: auto
# pages/_quickstart
-
scope:
path: pages/_quickstart
values:
layout: default
collection: quickstart
share: true
related: true
sidebar:
nav: auto
# pages/_posts
-
scope:
path: pages/_posts
values:
layout: article
post_type: standard
index: false
sidebar: true
author_profile: true
read_time: true
comments: true # blog posts show Giscus comments (override per-page with `comments: false`)
share: true
related: true
# permalink: /:collection/:name/
# pages/_docs
-
scope:
path: pages/_docs
values:
layout: *pages
# category: docs
author_profile: true
read_time: true
sidebar:
nav: auto
comments: # true
share: true
related: true
# permalink: /docs/:category/:name/
# pages/_notes
-
scope:
path: pages/_notes
type: notes
values:
layout: note
collection: notes
author_profile: true
read_time: true
comments: true
share: true
related: true
sidebar:
nav: auto
# pages/_notebooks
-
scope:
path: pages/_notebooks
type: notebooks
values:
layout: notebook
collection: notebooks
author_profile: true
read_time: true
comments: true
share: true
related: true
jupyter_metadata: true
sidebar:
nav: auto
# pages/_books — picture-book stories read cover-to-cover: no sidebar,
# no comments by default; index.md overrides layout to `book` per book.
-
scope:
path: pages/_books
type: books
values:
layout: book-story
sidebar: false
comments: false
share: true
author_profile: false
# fr/ — GENERATED translations (scripts/translate.rb). These are plain
# Jekyll pages (safe-mode friendly: no plugin needed) whose permalinks are
# written explicitly into each file; the scopes below mirror the key
# front-matter defaults of their English source trees.
-
scope:
path: fr
values:
layout: default
author_profile: true
read_time: true
share: true
related: true
toc_sticky: true
sidebar:
nav: categories
-
scope:
path: fr/posts
values:
layout: article
post_type: standard
index: false
sidebar: true
comments: true
-
scope:
path: fr/notes
values:
layout: note
comments: true
# Exclude from processing.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
# NOTE: When _config_dev.yml is layered on top (--config _config.yml,_config_dev.yml),
# the dev file MUST repeat this full list — Jekyll replaces, not merges, the exclude key.
exclude:
# ── Jekyll cache ─────────────────────────────────────────────────────────
- .sass-cache/
- .jekyll-cache/
# ── Obsidian vault working files ─────────────────────────────────────────
- .obsidian/
- "*.canvas"
- "*.excalidraw.md"
# ── IDE / editor config (dot-prefix dirs hidden by default; listed for clarity) ─
- .cursor/
- .devcontainer/
- .frontmatter/
- .github/
- .vscode/
# ── Ruby / Bundler ────────────────────────────────────────────────────────
- Gemfile
- Gemfile.lock
- gemfiles/
- jekyll-theme-zer0.gemspec
- lib/
- pkg/
- vendor/bundle/
- vendor/cache/
- vendor/gems/
- vendor/ruby/
# ── Node.js ───────────────────────────────────────────────────────────────
- node_modules/
- package.json
- package-lock.json
# ── Shell scripts and automation ──────────────────────────────────────────
- scripts/
- "*.sh"
# ── Docker configuration ──────────────────────────────────────────────────
- docker/
- docker-compose.yml
- docker-compose.test.yml
# ── Build / task runners ──────────────────────────────────────────────────
- Makefile
- Rakefile
# ── Project tooling metadata ──────────────────────────────────────────────
- AGENTS.md
- docs/
- frontmatter.json
- logs/
- templates/
- vendor-manifest.json
- "*.code-workspace"
# ── Submodules, tests, and authoring scaffolding ──────────────────────────
# examples/ holds self-contained demo sites, each with its own _config.yml
# and Gemfile. They are built independently (see examples/README.md), never
# as part of this site.
- examples/
- submodules/
- test/
- tests/
- MERMAID-*.md
- MERMAID-*/
- pages/_notes/_templates/
# Force-include — underscore-prefixed paths Jekyll would otherwise skip.
# _design-system/ is the git mirror of the Claude Design project (contract:
# [redacted]
# manifest, and specimen cards live URLs under /_design-system/ — linked from
# the /design/ hub page and consumable by prototypes ("link THIS one file").
include:
- _design-system
# Sass/SCSS
# Production default: minified output, no sourcemaps. main.css is render-blocking
# on every page, so we ship it compressed (~182KB expanded -> ~140KB minified)
# and skip the .css.map files. _config_dev.yml overrides this back to expanded +
# sourcemaps for local debugging.
sass:
sass_dir: _sass
style: compressed
sourcemap: never
# TODO: Fix bootstrap plugin
# load_paths:
# - /usr/local/bundle/gems/bootstrap-5.3.3/assets/stylesheets
## Style Settings -------------------------------------------------------------
# theme : "zer0-mistakes-jekyll"
# remote_theme : "bamr87/zer0-mistakes"
theme_skin : "air" # "air", "aqua", "dirt", "neon", "mint", "plum", "sunrise"
# SVG background layers (fffuel.co style) — gradient, pattern, noise per skin
theme_background:
enabled: true # Master toggle for SVG backgrounds
gradient_opacity: 0.6 # Hero/header gradient layer opacity
texture_opacity: 0.04 # Body noise texture overlay opacity
pattern_opacity: 0.08 # Surface/card pattern overlay opacity
blend_mode: overlay # CSS mix-blend-mode for all layers
# style : "default" # "default", "dark", "light", "solarized-dark", "solarized-light"
# remote_style : "bamr87/zer0-mistakes"
# NOTE: Hex codes MUST be quoted — unquoted `#007bff` is parsed as a YAML
# comment and the key resolves to null. These values feed
# [redacted]
theme_color:
main: "#007bff"
secondary: "#6c757d"
red: "#a11111"
yellow: "#ffe900"
teal: "#376986"
blue: "#007bff"
green: "#28a745"
purple: "#6f42c1"
pink: "#e83e8c"
orange: "#fd7e14"
brown: "#795548"
cyan: "#17a2b8"
indigo: "#6610f2"
lime: "#cddc39"
amber: "#ffc107"
deep_orange: "#ff5722"
deep_purple: "#673ab7"
light_blue: "#03a9f4"
light_green: "#8bc34a"
light_purple: "#9c27b0"
light_red: "#f44336"
light_yellow: "#ffeb3b"
light_teal: "#009688"
## Copyright Settings --------------------------------------------------------------
cr_year: 2024
cr_entity: *name
cr_lisense: "MIT"
## Sitemap Settings --------------------------------------------------------------
# sitemap_include: A list of file extensions that should be included in the sitemap. By default, HTML files and any files with sitemap: true in their front matter are included.
# sitemap_exclude: A list of files or directories that should be excluded from the sitemap.
sitemap_include: ["html", "xml"]
# [redacted]
We value your privacy
This website uses cookies and similar technologies to enhance your browsing experience, analyze traffic, and provide personalized content.
Learn more in our Privacy Policy.
Cookie Preferences
Customize your cookie preferences below. You can change these settings at any time by clicking the cookie preferences link in our footer.
Essential Cookies
Always Active
These cookies are necessary for the website to function properly. They enable core functionality such as navigation, security, and accessibility features.
Analytics Cookies
These cookies help us understand how visitors interact with our website by collecting anonymous information about page visits, time spent, and user behavior patterns.