Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.5.1] - 2026-04-06
Added
CANDOR.mddeclaring AI usage transparency for the project.
[1.5.0] - 2026-03-06
Added
- Configurable pagination parameters via
reader.paginationinconfig.yamlwithcolumnWidth,columnHeight,lineHeight,avgCharWidth, andsafetyMarginoptions.
Changed
- Breaking: Rewrote pagination algorithm from line-based to character-based for more accurate page breaks.
- CSS columns now allow content to break inside blocks (
break-inside: auto) for natural text flow. - Theme scale overrides (
ui.theme.overrides.font.scale) now affect pagination calculations.
Fixed
- Theme config path now correctly reads
ui.theme.presetinstead of top-leveltheme. - Reader mode no longer overflows or cuts off content at column boundaries.
- Blockquotes and lists split mid-content when needed instead of jumping entirely to next column.
- Body of Work page now appears on first deploy when using a custom slug.
[1.4.5] - 2026-03-05
Fixed
- Category names with spaces now display correctly in reader mode header instead of showing URL-encoded values like
%20. (#21)
[1.4.4] - 2026-02-28
Added
- SHOWCASE.md which also pushes it to the documentation at docs.ode.dimwit.me/showcase.
[1.4.3] - 2026-02-28
Changed
- Ode will now move from DeepanshKhurana/ode to DimwitLabs/ode. Please ensure you update your
docker-compose.ymlfor the new url which will be underghcr.io/dimwitlabs/ode:<tag>. This version functionally changes nothing except this information.v1.4.4is planned to be from the new url. In that case,ghcr.io/deepanshkhurana/ode:latestwill point tov1.4.3whileghcr.io/dimwitlabs/ode:latestwill continue to get updates.
[1.4.2] - 2026-02-27
Changed
- OG images now generate asynchronously in background after build completes, allowing site to start serving immediately.
Fixed
- Cache headers for dynamic content (
config.yaml,content/,generated/index/,feed.xml) in nginx and Vercel configs. - RSS feed now correctly handles date-only entries with local timezone.
- Sidebar piece count now reflects actual count from
pieces.json.
[1.4.1] - 2026-02-26
Added
- Configurable Body of Work page:
bodyOfWork.titleandbodyOfWork.slugfields inconfig.yaml. - Configurable Home link label via
ui.labels.homeinconfig.yaml.
Fixed
- 502 error page now correctly uses theme from
ui.theme.presetinstead of defaulting tojournal. - Close button label now correctly reads from
ui.labels.closeinstead ofui.close. - Deployment script now polls host filesystem for 502 page instead of waiting for container build.
[1.4.0] - 2026-02-26
Added
Metadata (#14)
- Social card preview system with OG image generation using
satoriand@resvg/resvg-js. - Pre-rendered meta pages for bots (WhatsApp, LinkedIn, Twitter, Facebook, etc.) with full
og:*andtwitter:*tags. Note that the tags work according to bot lists and would not be readily available on an online checker. However,curling the bots with aUser-Agente.g.curl -H "User-Agent: WhatsApp/2.0"...can be a good way to test. This works acrossnginxas well asVercel. Configurations for both are provided in the repository asnginx/andvercel.json. - Content-based meta descriptions: first 160 characters extracted from markdown content with formatting stripped.
- Reader URL bot support:
/reader/:collection?piece=:slugserves appropriate meta pages to bots. The page is selected to be the piece the reader is currently reading. - Custom
bodyOfWork.descriptionfield inconfig.yamlforbody-of-workpage social preview. nginxconfiguration templates innginx/directory with setup instructions.- OG images generated at 1200x630px with theme-specific styling.
502 Error Page for nginx (#19)
- Themed 502 error page generation with customizable text via
config.yaml'sredeployPagesection. - The theme respects all settings e.g.
defaultMode,lowercaseand overrides enabled inconfig.yaml. - 502 page served from persistent host location (survives container restarts).
- Configuration settings are available in the
nginx/directory's base template.
Here's what it looks like for my own site, fully customised. No more ugly 502 pages!
Changed
- Improved GitHub Actions deployment documentation in
WRITING.mdwith SSH key setup guide. (#18)
Fixed
- Numeric values in
config.yaml(e.g.,404) now handled correctly. (#17)
Removed
react-helmetdependency (using React 19 native meta tags).
[1.2.9] - 2026-02-22
Changed
- Moved auto-generated files to
public/generated/subdirectory for cleaner structure.
[1.2.8] - 2026-02-20
Fixed
- Duplicate meta tags in
<head>caused by hardcoded tags inindex.htmlconflicting with dynamically added tags fromLayout.jsxandreact-helmetinHeader.jsx.
[1.2.7] - 2026-02-17
Added
- Development workflow with
:developmentDocker tag for testing changes without affecting:latestusers. - Automatic
robots.txtgeneration during build process with sitemap URL fromconfig.yaml. (#12) - Support for
descriptionfield in piece frontmatter for RSS feed descriptions (with fallback to first line of content). (#11) - Routing support for
/feed/,/sitemap/,/robots, and/robots.txtin both nginx and Vercel configurations. (#12) - Version badge (v1.2.7) in documentation site navbar.
Changed
- RSS feed
<link rel="self">now correctly points to/feed.xmlinstead of/feed. (#11) - Footer styling restructured for better alignment on large displays - border now on article element with footer integrated into
HomepageViewercomponent. (#13) - Vercel rewrite rules optimized with specific routes ordered before catch-all pattern.
Fixed
- RSS feed validation errors: removed invalid
managingEditorfield (was not in email format). (#11) - RSS feed item structure:
<description>now appears before<content:encoded>per RSS 2.0 best practices. (#11) - Footer border extending beyond content on larger displays due to float-based alignment. (#13)
Removed
managingEditorfield from RSS feed generation (optional field causing validation warnings). (#11)
[1.2.5] - 2025-12-27
Added
- New landing page at ode.dimwit.me with links to live demo, documentation, and repository.
- Official documentation site powered by Docusaurus, featuring automated root markdown synchronization and search for easy access.
Changed
- Image galleries in the
README.mdandTHEMING.mdhave a slightly different layout now to make them better appear in the documentation.
[1.2.2] - 2025-12-01
Fixed
- Responsive horizontal margins now scale smoothly across existing intermediate breakpoints (xl, lg) to prevent excessively large margins on tablets and narrow desktop windows. (#3)
[1.2.1] - 2025-12-01
Changed
- Updated README.md's intro text to better answer "what is it?" first.
[1.2.0] - 2025-12-01
Added
- Dynamic theme engine with 10 built-in presets (
almanac,blueprint,comic,doodle,exploit,journal(default),manuscript,recipe,screenplay,sketch). - Theme configuration via
ui.theme.preset,ui.theme.overrides, andui.theme.defaultModeinconfig.yaml(fully backwards compatible; not having the sections does not break anything). - Support for local font files with automatic format detection.
- Font scaling system with proportional sizing using
--font-scaleCSS variable. - Comprehensive theming documentation in THEMING.md with screenshots of all presets.
- Theme presets automatically register from
src/assets/themes/directory. - New ETHOS.md documenting core principles and philosophy.
[1.1.2] - 2025-11-26
Added
- Defaults are now initialised if the public directory is empty or has any files missing from the required structure. Helpful links will directly appear on the UI and the app will not break.
- A build badge is added to the README to ensure Docker image status is always easy to find.
- New
pages.notFoundconfig option to specify a custom 404 page (defaults toobscured). - Exclusions in
exclude.pagesandexclude.piecesnow accept slugs without.mdextension.
[1.1.1] - 2025-11-26
Added
- New
config.yamlparameter to control Body of Work order. If your config does not have the parameter and you update the app, it will default todescending.
[1.1.0] - 2025-11-26
Added
- Major (breaking) change since the app now moves to a
docker-compose.yamlsetup fundamentally changing how to write content in it.README.mdwill have more context but you can now mount directories for content (piecesandpages) while using the public image to constantly rebuild the site on push or update. You are free to set this up yourself.config.yaml,intro.md, andfavicon.icocan also be mounted. - Documentation for setting up a content repository and automation is now also available in WRITING.md.
[1.0.3] - 2025-11-26
Added
- Feature: New
config.yamlparameter will let you configure number of RSS feed items
[1.0.2] - 2025-11-25
Added
- Feature: Gestures! The Reader mode now supports trackpad swipe and mobile swipe gestures.
[1.0.1] - 2025-11-24
Added
- Feature: Added sitemap generation script at the build process.
Changed
- Fix: Fixed an issue where URLs with / in the end would not strip to valid URLs.
[1.0.0] - 2025-11-23
Added
- Initial public release of Ode.
- Markdown-based content system for pieces and pages.
- Reader mode with keyboard navigation.
- Dark/Light mode with automatic theme switching.
- RSS feed generation for all pieces.
- Chronological "Body of Work" archive.
- Random piece discovery feature.
- Fully configurable site metadata and UI labels via
config.yaml. - Build-time generation for optimal performance.
- MIT License.