Changelog

v0.17.4 (2026-06-20)

  • Multi-Language (Site Configuration)

    • Before rendering, the entire config tree in everkm.yaml is deep-processed: the template global variable __config and config(key=...) both return final values for the current language (including nested objects and arrays).
    • Category 1 @i18n:<key>: continues to reference language bundles (__everkm/i18n/, theme and extend i18n files); when no language bundle is found, the original reference is preserved and a warning is logged.
    • Category 2 Translation Objects: scalar values in configuration can use a structure isomorphic to language bundles (_default + language code fields), useful for fields like Algolia index_name and external link url that should not be placed in language bundles.
    • Removed flat sibling key syntax (e.g., index_name.en, url.zh); please use translation objects instead.
    • folders.breadcrumbs title / url uses the same resolution rules as config.
  • Default Exclude private

    • Body rendering now strips content blocks tagged with #private by default; posts() and similar lists exclude articles with the private label in frontmatter by default.
    • During preview, set EVERKM_PRIVATE=1 to temporarily view private content; export always excludes it.

v0.17.3 (2026-06-17)

  • Multi-Language

    • LangBundle scanning scope expanded: *.i18n.md / *.i18n.yaml files within extend/templates and extend/dcard are merged with theme and __everkm/i18n bundles (low to high: theme -> extend/templates -> extend/dcard -> __everkm/i18n).
  • Directory Configuration

    • everkm.yaml#folders adds url_id_suffix (default true): when set to false, non-index article URLs become {slug}.html without appending -{id}; orthogonal to hash_scatter.
  • dCard

    • Cards now support a more concise syntax: write `dcard/card-name` on a standalone line in the body to insert the corresponding card, without needing a code block or configuration. For example, `dcard/download` directly displays a download block.

v0.17.2 (2026-06-15)

  • Site Extension Directory (Breaking)

    • Site-level templates, static assets, dCard cards, and HTML pages for overriding generated results are now unified under __everkm/extend/ (subdirectories: templates, assets, dcard, pages).
    • everkm-publish init <site-root> automatically creates the extend directory structure within that directory.
    • The following old paths are no longer supported; please migrate to the corresponding extend subdirectories:
      • __everkm/__theme -> extend/templates (and extend/assets)
      • __everkm/__assets, __assets under content directories -> extend/assets
      • __everkm/__public, __public under content directories -> extend/pages
      • __dcard under content directories -> extend/dcard
    • During preview, files in extend/assets take priority over theme-bundled assets; after export, HTML files in extend/pages override generated pages at the same path.
  • CLI (Breaking)

    • everkm-publish init: now initializes within an existing site root directory instead of automatically creating a subdirectory from the site name.
      • Usage changed from init <site-name> [--work-dir parent] to init <site-root>; you must create the directory first, e.g., mkdir my-site && everkm-publish init my-site.
      • An empty __everkm/everkm.yaml is also created during initialization for subsequent site configuration.
    • everkm-publish web: the static preview directory changed from --work-dir to a positional argument; usage is web <directory>, e.g., everkm-publish web ./dist.
    • When running serve, export, init, and other commands, startup logs now display the current everkm-publish version number for easy verification and troubleshooting.

v0.17.1 (2026-06-14)

  • Multi-Language

    • Site configuration and breadcrumb text support @i18n:<key> references, automatically replaced with the corresponding translation for the current language.
    • During local preview, you can switch languages via the URL parameter ?_lang or the __lang cookie to instantly view configuration text in different languages.
    • You can place *.i18n.yaml language bundles in the project's __everkm/i18n/ directory to override theme translations; changes to language bundles take effect automatically during preview without restarting.
  • Page Rendering

    • Preview and export behavior is more consistent: if a theme does not provide a Tera template (e.g., some themes' index.html), the theme's built-in JS rendering is used automatically, and both article pages and home pages display correctly.
  • Export and Preview

    • Fixed an issue where some sites would stall indefinitely under default export concurrency and fail to complete static export; this commonly occurred when using JS-rendered dCard cards (e.g., list-type dcard/items) in body text or macro references.
    • Default concurrency now completes export normally; generally no need to reduce EVERKM_EXPORT_WORKERS as a workaround.
  • Navigation and Internal Links ([[...]])

    • The from_file parameter of navigation functions nav_indicator / nav_path / nav_tree, when wrapped with [[...]], now resolves target articles using the same rules as body internal links (title, slug, path, etc.); plain string syntax is unchanged.
    • Internal links are resolved to site URLs during preview and export; when a link points to a non-existent or ambiguous target (e.g., multiple documents with the same title), it immediately reports the error and identifies the problematic link, instead of showing an incomprehensible message at the end of export.
    • Matching internal links by title or slug now ignores case (e.g., [[faq]] matches the title "FAQ"); duplicate slugs trigger an ambiguity warning.
    • If a title may be duplicated across directories, use an explicit path instead, e.g., [[./faq/]] or [[/section/doc/file]].
    • New everkm-publish lint scans all internal links in body text and lists unresolvable or ambiguous links by line number, useful for pre-publish self-checks.
    • In aNote publishing scenarios, internal link resolution rules are consistent with the CLI tool.
  • Error Messages

    • When a page fails to publish due to link issues, the error message now specifies the page URL, source Markdown file, the specific link address, and suggested fixes for quick identification.

v0.17.0 (2026-06-13)

  • Export and Preview

    • Static export and local preview are significantly faster for large sites; list filtering and tag/category queries are also more stable with large datasets.
    • Preview enables lazy image loading (lazy_img) by default; local image processing and caching are optimized, reducing IO when repeatedly previewing the same media.
    • Export concurrency is controlled by --export-workers (alias --export-jobs), defaulting to the number of CPU cores.
  • Indexing and Startup

    • Content index is cached at {work_dir}/__everkm/cache/everkm-publish.db, with automatic migration on startup; manual db-migrate is no longer needed.
    • If the index structure is incompatible after a version upgrade, it is automatically rebuilt (the first startup may be slightly slower, which is normal).
    • Directory configuration folders is aligned with legacy DirConfig behavior; path/slug/title lookup continues the case-insensitive semantics from v0.16.15.
  • Theme Installation

    • Remote installation aligns with the ekmp-themes official catalog; a CDN fallback is attempted when the primary source fails.
    • Supports {author}/{theme-name}@version expressions and local .zip package installation.
    • The default theme directory for scaffolding changed from youlog to everkm/youlog (only affects init for new sites).
  • Markdown and Page Behavior

    • Breaking change: curly-brace macros such as {{everkm::include(...)}} and {{everkm::toc(...)}} have been removed; please use fenced blocks like ```macro/include and ```macro/toc instead.
    • During preview and publishing, if the first h1 in the body duplicates the page title, it is automatically hidden to avoid showing the title twice.
    • dCard card rendering is aligned with v0.16.15; extended attributes, exclude_tags, and other behaviors are more consistent after the scraper upgrade.
    • In book/navigation templates, context passing is more complete when nav_tree and similar functions indirectly pull lists, reducing secondary rendering warnings.
  • Templates and CLI

    • Breaking change: the article date field in Tera templates renamed from post.date to post.created_at (second-level timestamp).
    • The CLI subcommand create has been renamed to init.
    • The preview server adds a /__everkm/ navigation page for browsing built-in APIs and debugging endpoints.
  • aNote Resources

    • When exporting a static site from aNote, anote://assets/... links are materialized to dist/assets/media.
    • Markdown internal links and img/a paths in HTML are handled consistently.

v0.16.15 (2026-04-11)

  • Path and Reference Resolution: locating pages by content virtual path, slug, or article title is now case-insensitive, regardless of the actual case of filenames in the repository.
  • Directory URLs: paths ending with / (including the site root /) are uniformly resolved as "directory default pages", covering common conventions: index.md, slug of index, and cases like foo/foo.md where the folder name matches the md file name.
  • Markdown Internal Links: internal links that specify a directory address with a trailing / are resolved as directory pages with correct links; handling of relative paths, .md suffix, attachments, and other non-body resources is also more consistent and predictable in several edge cases.

v0.16.14 (2026-04-08)

Fixes

  • During directory configuration merging, subdirectory index.yaml files without breadcrumbs no longer override and clear breadcrumbs already merged from ancestors (e.g., root directory); consistent with template and other field behavior.
  • During directory configuration merging, non-empty breadcrumbs in each level's index.yaml are appended to the ancestor chain (inheriting from root and each parent level), instead of being entirely replaced by the next level which would lose root configuration.
  • find_by_path("/") correctly resolves the content root directory home page; for directory-level lookup, pages with the filename index are also treated as directory index pages, in addition to slug=index.

Additions / Improvements

  • PostItem adds is_index_filename() and is_dir_index_post() for breadcrumb and path lookup reuse.
  • Page breadcrumbs: "Home" is no longer automatically inserted at the chain start; middle layers are entirely generated from each level's index.yaml and directory index posts (dir_index, resolve_breadcrumbs_middle) -- levels with an index post always have an entry (non-empty YAML takes priority, otherwise the level's index post is used); the chain end is the current page; if a home page entry is needed, declare it in the breadcrumbs of the posts root index.yaml.
  • For .../index directory index pages, a different slug can be specified for internal reference without affecting the final generated filename index.html.

v0.16.13 (2026-04-08)

  • Add a separator line at the beginning of footnote definitions.
  • Fix: site root index.yaml no longer incorrectly generates URL path segments.
  • Pages with the filename index now have their slug forced to index.

v0.16.12 (2026-03-18)

  • Add CLI parameter --lazy-img to enable lazy loading for body images during export.
  • Footnotes are now uniformly rendered at the end of the body text.

v0.16.11 (2026-03-13)

  • Fix the index.html url_path calculation issue. Removed as_channel; slug=index now uniformly determines url_path.
  • Enhanced breadcrumbs resolution capabilities.
  • Added /__everkm/posts endpoint for an overview of all pages.
  • Filter out .md files starting with __ from parsing.
  • DirConfig supports the variable $THIS_DIR.

v0.16.10 (2026-03-12)

  • Optimized assets public fallback priority.
  • Optimized MIME type detection.
  • Added request log output for everkm-publish web.

v0.16.9 (2026-03-11)

  • hash_scatter can now be used as an alias for hash_storage in directory configuration.
  • Index pages under each directory generate index.html, with links based on the directory; when not separately configured in index.yaml, the index page is automatically treated as a channel page.
  • When breadcrumbs are not configured in index.yaml, they are automatically generated from the current page's URL path: the index page for each directory level appears in the breadcrumbs.
  • When no post record is found for a URL, instead of returning a 404 directly, the request path is passed to the template engine to attempt rendering.
  • Directory configuration adds a query option, passed to query_string during rendering.
  • Added nav_tree function.
  • Added lang function.

v0.16.8 (2025-12-09)

  • Fixed extended attribute support for blockquote and codeblock blocks.

v0.16.7 (2025-11-23)

  • Renamed uno to permalink.
  • posts list adds order_by and order_direction parameters.

v0.16.6 (2025-11-20)

  • Optimized dcard asset injection method.
  • Added dcard rendering via JS.

v0.16.5 (2025-11-14)

  • Fixed nginx redirect map parameter conversion error.
  • Fixed Vercel redirect parameter conversion error.

v0.16.4 (2025-11-11)

Fixes

  • Fixed issue where undefined properties of template objects were converted to null.
  • Fixed issue where template search by suffix required a complete filename.

Improvements

  • posts list now excludes the current document by default.
  • The as parameter of everkm::include() can now be omitted and is inferred from the file extension.

v0.16.3 (2025-11-08)

  • Fixed breadcrumb deduplication issue when no links are present.

v0.16.2 (2025-11-03)

  • Fixed Vercel configuration export issue.
  • Fixed query string conversion issue.

v0.16.1 (2025-11-02)

Additions

  • Content auto-lint and fix functionality (--auto-fix-on-update).
  • dCard force-render switch (--ignore-dcard-errors).
  • JS template rendering (SSR) support.
  • Article list returns prev/next IDs.
  • Support for fetching article details by ID (post_detail).
  • External resource references automatically append timestamps.

Fixes

  • Fixed rendering deadlock issue.
  • Fixed dcard parameter passing.
  • Fixed dcard invocation.

Changes

  • Deprecated the behavior of obtaining the title from the first h1 in the body.
  • hash_storage is now disabled by default.
  • Switched metadata field date to updated_at.

v0.16.0 (2025-10-24)

Additions

  • Directory-level configuration DirConfig (index.yaml), supporting multi-level merge inheritance.
  • Automatic breadcrumb navigation injection.
  • URL redirect export (supporting nginx and Vercel).
  • hash_storage path fallback: long slugs are automatically mapped to short paths.
  • Directory configuration supports query query parameters.
  • --title-selector parameter: customize how article titles are selected.
  • --with-extend-md-meta parameter: export extended Markdown metadata.

Improvements

  • Directory configuration merging: subdirectories inherit and override parent directory configuration.
  • Page metadata parsing: uses built-in metadata parser.

v0.15.1 (2025-09-06)

  • Added __theme_name global variable in templates, representing the current theme name.

v0.15.0 (2025-09-06)

Additions

  • __everkm/pages directory supports supplementary pages independent of templates.
  • --with-url-map parameter exports a URL mapping file.
  • --with-publish-map parameter exports a publish page log.
  • Export nginx-compatible url_map file.
  • file_meta subcommand to read metadata of a single file.
  • --template-path parameter exports template paths.
  • Support for exporting publish_map output.
  • Added template asset injection functionality.

Improvements

  • Unified interface definitions.
  • Fixed frontend directory fallback.

v0.14.2 (2025-07-12)

  • Refined theme_dir acquisition logic.
  • Modified asset copying and fallback rules in theme-dev mode.

v0.14.1 (2025-06-25)

Additions

  • --config parameter to specify the configuration file path.
  • --theme-dev parameter to enable theme development mode.
  • Global variable __everkm_publish_version (current tool version).
  • Global variable __theme_version (current theme version).
  • Support for relative URL calculation during export.
  • asset_base_url() function.

Improvements

  • Symlinks can be used during export.
  • Exit immediately on error instead of continuing.

v0.14.0 (2025-06-20)

Additions

  • posts function adds exclude_tags parameter to exclude articles by tag.
  • Title fallback strategy: when no title is defined in metadata, the first h1 in the body is automatically used as the title.
  • Internal links now prioritize searching by slug.
  • __env_is_preview global variable to indicate whether the current environment is a preview.
  • Support for watching multiple directories.
  • Assets directory auto-fallback.

Fixes

  • Fixed internal link resolution issues.
  • Fixed sorting issues.
  • Fixed missing theme version numbers.
  • Avoided title promotion (edge cases when obtaining the title from the body h1).

v0.13.7 (2025-04-30)

  • Fixed issue where anchors were ignored when determining relative links.

v0.13.6 (2025-04-30)

Changes

  • Removed OpenSSL dependency.
  • Sitemap configuration rules changed: multiple rules now select one match instead of merging.
  • Glob matching rules adjusted: * matches only one path segment, ** matches multiple directory levels.

Additions

  • theme install --force option to force overwrite theme installation.
  • Display installed version numbers.

Fixes

  • Mapping templates no longer allow relative paths.
  • Fixed test cases to accommodate new configuration priority.

v0.13.5 (2025-04-26)

Additions

  • nav_tree function for generating navigation trees.
  • dir_tree directory configuration option.
  • LinkItem data structure.

Fixes

  • Fixed breadcrumb detection.
  • Fixed alias path lookup.
  • Fixed path lookup issues.
  • Fixed base_url issue.
  • Fixed duplicate TOC heading keywords.
  • Fixed anchor ignoring during navigation parsing.
  • Fixed copying when assets directory does not exist.

Improvements

  • base_url adds url parameter, automatically converting addresses starting with ~/ to base_prefix.
  • Optimized link comparison method.
  • Added directory exclusion functionality.
  • Added link crawl source log output.

v0.13.4 (2025-04-12)

  • Fixed style loss issue when exporting pages.

v0.13.3 (2025-04-08)

  • Fixed dcard data and scripts prioritizing reading from __dcard.
  • Fixed dcard parsing errors.
  • Optimized log output.

v0.13.2 (2025-04-03)

  • Fixed file copy deletion error.

v0.13.1 (2025-04-02)

  • Fixed directory issues.
  • Fixed variable renaming.
  • Adjusted print output.

v0.13.0 (2025-04-02)

Major Changes

The content directory is now the top-level directory, and all everkm-publish related configurations are unified under the __everkm directory.

Renamed Functions

  1. post_exist -> has_post
  2. media_local -> media_remote
  3. src -> media
  4. local_cfg -> config
  5. local_cfg_exist -> has_config
  6. get_random -> random
  7. get_env -> env
  8. assets -> asset
  9. ds -> data
  10. md_html -> md_to_html
  11. markdown_html -> markdown_to_html

Directory Structure Changes

  • Moved content from under the content directory to the top level; post is promoted one level up and flattened.
  • All everkm-related files are placed under the __everkm directory.

Additions

  1. regex_replace filter.
  2. Global variable __host.