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.
This post documents specific technical differences from the original thread. The format is simple: we add an item when it is 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
We will add the following differences to the same post as we implement them in order to maintain a transparent and verifiable list of changes.