NLO vs Chirpy: Diff Log
An objective list of differences between the NLO theme and the original jekyll-theme-chirpy. The post is updated as the migration progresses and the topic develops.
NLO vs Chirpy: Diff Log
This post documents the specific technical differences from the original theme. Each item is added once implemented and verified.
Checklist of differences
- Personal statistics GitHub contribution graph (home + sidebar) with auto-update via workflow
- Local admin panel for content editing, based on
jekyll-admin, with UI fork inside the project - Quick login to the local admin panel via a separate button in the sidebar (dev only)
- Extended sidebar branding: different avatars for light/dark + choice of frame style
- Multilingual mode in
langwith language switcher and flags in the sidebar - Short locale URL prefixes (
/ru/,/fr/) instead of long ones (/ru-RU/,/fr-FR/) - Content filtering by post language (
language/langin front matter)
1) Personal statistics of GitHub contributions
What’s added:
- Display GitHub contribution chart in two places: on the main page and in the sidebar.
- Separate SVGs for light and dark themes.
Where is it configured:
_config.yml->nlo.github_chart.- Keys:
home_imagehome_image_darksidebar_imagesidebar_image_dark
How it updates automatically:
- Workflow:
.github/workflows/update-githubchart.yml - Scheduled launch:
0 3 * * *(daily) and manually afterworkflow_dispatch. - Generation:
tools/generate-githubchart.sh - When changes are made, the following files are committed:
assets/img/githubchart.svgassets/img/githubchart-sidebar.svgassets/img/githubchart-dark.svgassets/img/githubchart-sidebar-dark.svg
2) Local admin panel (for development only)
What is it based on:
- Basic editing functionality: gem
jekyll-admin. - The UI will be forked inside the repository into the
admin/folder for customization for NLO.
How does this work:
- Plugin
_plugins/jekyll-admin-fork.rbmounts:/admin-> local UI fromadmin//_api-> API fromJekyllAdmin::Server
- Custom interface files:
admin/index.htmladmin/nlo-admin.cssadmin/nlo-admin.js
Local launch:
1
bash tools/run.sh --admin
URL:
1
http://127.0.0.1:4000/admin
Why not in production:
- The admin function is intended for the local development circuit.
- The gem
jekyll-adminis connected as a development dependency (Gemfile, group:development). - A public production site should remain only a content layer without an open editor/API loop.
3) Sidebar and editor UX improvements
What’s added:
sidebaradded a prominentADMINbutton in the bottom navigation block (only shown indevelopment).- The avatar block in the sidebar has been increased by ~30% for better visual balance.
- For the avatar, separate sources are used for light and dark themes:
nlo.branding.avatar_lightnlo.branding.avatar_dark
- The avatar frame setting is included in the config (
nlo.branding.avatar_frame) and supports styles:rounddiscord
- In a dark theme, the avatar frame is darkened to match the overall tone of the interface.
What has been changed in the admin panel:
- The settings
GitHub Chart PaletteandAvatar Frameare built into theConfigurationpage as normal items. - Both settings blocks are displayed in one line on the desktop (two columns), and on narrow screens they are folded into one column.
- A tooltip explanation has been added for the
authorfield:- if you specify a key from
_data/authors.yml, the author is displayed as a link to the profile; - if the key is not found, the value
authoris displayed as plain text.
- if you specify a key from
4) Multilingual and language switch
What’s added:
langin_config.ymlnow supports multiple languages separated by commas:- example:
lang: en, ru-RU, fr-FR
- example:
- If one language is specified, the language selector is not displayed.
- If multiple languages are specified:
- up to 3 languages flags are displayed;
- if the quantity is larger, the compact
selectis automatically displayed.
- The selector signature is localized (
Site version) via locale files. - Flags are stored locally in
assets/img/flags/. - In
titleflags show the human-readable name of the language (rather than technical code likeru-RU).
Technically:
- Language normalization and active language selection are included in
_includes/lang.html. - The selector UI is implemented in
_includes/lang-switch.htmland is built as the first item in the sidebar navigation (visually asHOME). - Added soft transparency (
opacity: 0.7) and active language highlighting (hover/active ->opacity: 1) to flags.
5) Language URLs and content visibility
What’s changed in the URL:
- Language switching now uses short prefixes:
http://127.0.0.1:4000/ru/http://127.0.0.1:4000/fr/
- For localized home pages, short permalinks are specified:
ru-RU/index.md->/ru/fr-FR/index.md->/fr/
- The language detector in
_includes/lang.htmlnow understands both the full locale code and the short prefix alias.
What’s changed in the content:
- Added
languagein front matter to posts (for examplelanguage: en,language: ru-RU). - Posts are shown only for the current interface language.
- Posts without
language/langare considereddefault_langcontent (backwards compatible).
Where filtering works:
- Home (
home) - Archives (
archives) - Lists of categories/tags (
categories,tags) - Pages of a specific category/tag
- Sidebar: latest updates and trending tags
- Related posts inside the article
What’s next
New differences land in this post as we implement them, keeping the list transparent and verifiable.
This post is licensed under CC BY 4.0 by the author.