# Emanote 1.4 released

**URL:** <https://discourse.haskell.org/t/emanote-1-4-released/12777>\
**Category:** Announcements\
**Created:** [August 19, 2025, 2:02am UTC](https://discourse.haskell.org/t/emanote-1-4-released/12777 "2025-08-19T02:02:11Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![srid](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/srid/32/5514_2.png) [@srid](https://discourse.haskell.org/u/srid)\
**Post date:** [August 19, 2025, 2:02am UTC](https://discourse.haskell.org/t/emanote-1-4-released/12777/1 "2025-08-19T02:02:11Z")

</div>

It’s been nearly 2 years since I last released [Emanote](https://emanote.srid.ca/), and I’m happy to announce [version 1.4](https://github.com/srid/emanote/discussions/604).

> [Emanote](https://github.com/srid/emanote) enables you to **create beautiful websites** – such as _personal webpage_, _blog_, _wiki_, _Zettelkasten_, _notebook_, _knowledge-base_, _documentation_, etc. from future-proof **plain-text notes** and arbitrary data – with live preview that updates in real-time. It aims to be next-gen [neuron](https://neuron.zettel.page/) with powerful features.

Think of it is as a static-site generator (but with live preview!) for your Markdown notes à la Obsidian.

Here’s what’s been added in this release, over the 2 years. You can try it out using Nix or Docker.

**Notable features**

- LLM optimized **single-file Markdown export** ([#598](https://github.com/srid/emanote/pull/598))
- Obsidian-style **callouts** ([#466](https://github.com/srid/emanote/pull/466))
- **TOC sidebar** ([#504](https://github.com/srid/emanote/pull/504))
- Native support for **combining multiple notebooks**
  - Resolve ambiguities based on closer common ancestor ([#498](https://github.com/srid/emanote/pull/498))
  - Support for folder “index.md” notes ([#512](https://github.com/srid/emanote/pull/512))
    - Instead of “foo/qux.md”, you can now create “foo/qux/index.md”

  - Layers can be mounted in sub-directories, enabling composition of distinct notebooks ([#523](https://github.com/srid/emanote/pull/523))

**Other improvements**

- Add query syntax for listing folgezetten children & parents ([#476](https://github.com/srid/emanote/pull/476))
- `emanote run --no-ws` option to disable WebSocket monitoring. This is useful for using Emanote to serve the HTML site directly on the internet, without needing to statically generate it.
- Allow specifying custom page title in sidebar ([#488](https://github.com/srid/emanote/pull/488))
- Allow specifying `lang` attribute for HTML page in YAML config ([#485](https://github.com/srid/emanote/pull/485))
- KaTeX support ([#489](https://github.com/srid/emanote/pull/489))
- Lua filters: filter paths will now be looked up in all layers now.
- Live server now uses Tailwind 3 ([#503](https://github.com/srid/emanote/pull/503))
- Enable auto identifier for org files ([#502](https://github.com/srid/emanote/pull/502))
- Support date metadata from the filename when it begins with YYYY-MM-DD ([#552](https://github.com/srid/emanote/pull/552)).
- Daily notes automatically get a hierarchical tag.
- HTML
  - Support for `<kbd>` rendering [Handle simple inline raw html by TristanCacqueray · Pull Request #8 · srid/heist-extra · GitHub](https://github.com/srid/heist-extra/pull/8)
  - prevent the external link icon from wrapping ([#528](https://github.com/srid/emanote/pull/528))
  - [live server] Update Tailwind CDN to 3.4.16

- Update ema (2.7.2)
- Nix flake module
  - Add link checker based on `html-proofer`
  - Replace `baseUrl` and `prettyUrls` with `extraConfig`

- **BACKWARDS INCOMPTABILE** changes
  - Removed `ema:homeUrl` (use `baseUrl` instead)
  - `feed.siteUrl` is now `page.siteUrl`
  - A new HTML template layout “default” (unifies and) replaces both “book” and “note” layout. ([#483](https://github.com/srid/emanote/pull/483))
    - Sidebar tree is now computed from the folgezettel graph, which is a superset of the folder hierarchy. The index page’s tree inherits the same.
    - The semantics of `folder-folgezettel` is now applied in inverse (see docs)

  - Add anchor links to headings ([#500](https://github.com/srid/emanote/pull/500))

**Bug fixes**

- Emanote no longer crashes when run on an empty directory ([#487](https://github.com/srid/emanote/issues/487))
- Stork search fixes
  - Fix empty stork index generation when using more than 1 layer ([#493](https://github.com/srid/emanote/issues/493))
  - Stork search index is now uses note path from their associated layer ([#495](https://github.com/srid/emanote/pull/495))

**Performance improvements**

- Browser-side performance improvement using `idiomorph` ([#567](https://github.com/srid/emanote/pull/567))
- Fix memory leak and performance gradation overtime in the browser due to Tailwind when using live server ([#569](https://github.com/srid/emanote/pull/569))

---

<div class="post-metadata">

**Author:** ![bolt12](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/bolt12/32/2293_2.png) [@bolt12](https://discourse.haskell.org/u/bolt12)\
**Post date:** [August 19, 2025, 10:12am UTC](https://discourse.haskell.org/t/emanote-1-4-released/12777/2 "2025-08-19T10:12:38Z")

</div>

Thanks! I use this for my personal journal and I like it very much! 🙂

I noticed that `–no-ws` seems like a handy flag, but is not documented in the `–help` output, in fact I get an error if I try to use it.

---

<div class="post-metadata">

**Author:** ![srid](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/srid/32/5514_2.png) [@srid](https://discourse.haskell.org/u/srid)\
**Post date:** [August 19, 2025, 11:50am UTC](https://discourse.haskell.org/t/emanote-1-4-released/12777/3 "2025-08-19T11:50:19Z")

</div>

@bolt12`–no-ws` is only mentioned in the help output of `run` subcommand:

```haskell
$ nix --accept-flake-config run github:srid/emanote -- run --help
Usage: emanote run [-h|--host HOST] [-p|--port PORT] [--no-ws]

  Run the live server

Available options:
  -h,--host HOST Host to bind to
  -p,--port PORT Port to bind to
  --no-ws Disable websocket
  -h,--help Show this help text

```

> get an error if I try to use it.

Hmm, could you file a bug report? It works for me here:

```haskell
$ nix --accept-flake-config run github:srid/emanote -- run --no-ws
[Info#ema] Launching Ema under: /Users/srid/Library/CloudStorage/ProtonDrive-user@proton.me-folder/Notes
[..]

```

---

<div class="post-metadata">

**Author:** ![bolt12](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/bolt12/32/2293_2.png) [@bolt12](https://discourse.haskell.org/u/bolt12)\
**Post date:** [August 19, 2025, 1:14pm UTC](https://discourse.haskell.org/t/emanote-1-4-released/12777/4 "2025-08-19T13:14:58Z")

</div>

Thanks I missed that!
