← Selected work

Open-source desktop app · Formerly Lexora

Taleno

A Markdown workspace for moving between reading, writing, and source without losing the thread of a document.

Tauri 2 · Rust · SolidJS · Milkdown

Why another writing tool?

A document is not always something you are actively typing. Sometimes you want to read it through; sometimes you want to get an idea down; sometimes a list or a block of syntax needs a precise correction. Those are different tasks, even when the file is the same.

With Taleno, I want a writing space that respects those shifts in attention. The starting point is an ordinary Markdown file — something you can keep, open elsewhere, and continue working on without an account.

Three modes, three intentions

I split the interface by what you are trying to do, not by file type. Writing is the default. The same document state carries the content and its unsaved changes while the display mode changes.

  • Reading: a read-only surface for following the text without accidentally changing it.
  • Writing: in-place WYSIWYG editing, so the draft and its formatting stay together.
  • Code: Markdown source with line synchronization, for inspecting and adjusting the underlying syntax.

Start with the document, then choose the stack

Milkdown and ProseMirror provide the editing foundation; SolidJS handles the surrounding interface and state. The design decision record favors fine-grained updates for this interaction-heavy workspace, while acknowledging a smaller ecosystem and extra integration work.

Rust handles the file operations inside a Tauri desktop shell. Saving uses a temporary file beside the destination before replacing it, rather than writing directly over the document. That choice also has a cost: the application needs permission to write in the containing directory, not only to the file.

The hard part is staying consistent

Three views are only useful if switching between them remains predictable. I care more about preserving the document and your place in it than about adding another impressive-looking mode button.

There is also a rendering trade-off: editing uses Milkdown’s Markdown pipeline, while rendering and export use Rust’s pulldown-cmark. That makes Markdown edge cases something to check deliberately. Using a library does not make consistency automatic.

What exists, and what I want to keep asking

The public project includes local Markdown files, workspace tabs, search, diagrams, math, and HTML export. These are the foundations of a working writing environment, not evidence that every writing habit has been accounted for.

The question I want to keep testing is simple: after switching views, can you carry on with the sentence you were thinking about? That is a more useful direction for this product than a longer feature list.

Explore the details