Ulysses App Review & Impressions

32 thoughts
last posted April 1, 2015, 10:05 p.m.
get stream as: markdown or atom

Looking for an editor to use within the context of Making a Book-Making Machine. Thought I'd give the demo version of Ulysses (Mac OS version) a spin.

Don't bother with the promo video on that site unless you like montages of people typing — that's literally all it is.


The demo gives you 10 hours to try out all the features so hopefully I can get this review done in that time today, in between everything else.


On startup it asks you how you prefer your Markdown italics & bold (asterisks or underscores). I found that kind of a strange design decision.


It pops up with a kind of tutorial in the form of a "sample project", probably the best way to do a tutorial. I don't mind this; I put in the time to complete a similar tutorial in Scrivener and found it well worth my while.


I must say I love Ulysses' bright blue text cursor. It's not block-style but it is nice and thick.

edit: It appears that this is the "iOS" style cursor, you can select the normal OS X black thin-line cursor in the preferences.


Ulysses "sheets" are somewhat analogous to "documents" within Scrivener — chunks of text that can be rearranged.

Unlike Scrivener, sheets cannot be in nested groups or folders. Only flat ordering is supported.


Nice touch in the editor: highlighting text displays invisible characters (spaces, line breaks, etc)


Ulysses is somewhat opaque about how your writing is actually stored, so here's what it looks like after a few minutes.

  • Ulysses definitely Markdown-like, but it is not just a plain text editor with Markdown highlighting.
  • It appears to use its own internal file format.
  • By default your "files" are not saved anywhere you can see on your file system. They're either stored within the app itself (details unknown) or on your iCloud drive.

Ulysses "projects" are called "Groups" (a group is a collection of "sheets")


An alternative to native "groups" is using "external folders" as groups.

In External Folders, you can edit classic text and markdown files from anywhere on your Mac. As an example, you can point Ulysses to a folder on Dropbox, and have its contents behave just like native groups and sheets.

In this mode, you can't use attachments or images.


Now I've reached a part of the tutorial that says to try previewing a PDF export — but PDF doesn't seem to be available as an option. Weird.



Oh well, hit reopen.


Upon reopening, went to open my first "group" I'd created outside the intro/tutorial.


(I should note I'm using a late-2013 rMBP with 16GB RAM)


OK it seems to be working normally again... for now.


OK, I think I figured out the PDF export option above.

Which leads me to: The "Quick Export" popup is actually an interesting case study in sub-optimal design.


Thoughts on the above UI:

  • Did you know you can click on the word "Text" to switch to other types of export? Neither did I!
  • All those little blue buttons...I'm not sure what exactly they do, and in order to find out I have to sit over them for a frustratingly long time waiting for the "tool tips" to appear.

You know what would have been nice here? A full-blown dialog box which actually makes optimal use of my laptop screen, makes each function clear, and maybe comes with keyboard shortcuts of its own.

Instead, the design direction seems to have been (in this and many other cases) to ape the iOS version of the app to try and keep them identical.


I have to say that, for simple projects, Ulysses' quick export functionality is far superior to Scrivener's excessively fussy "Compile".

You can export any sheet (or group) as a PDF, HTML (snippet or standalone document) ePub or Markdown.


Sad to say, Ulysses has no concept of YAML metadata for Markdown files.

If you include it in your sheets, Ulysses will not know what to do with it. For example, the sheet "preview" will not recognize the title — here's a screenshot:

Also, the built-in previewer for HTML, PDF, etc, does not recognize YAML at all.

In fact there's no support at all, anywhere, for the most common kinds of metadata (title, author, date, etc), either per-sheet or per-project. This seems like a glaring omission for an app that purports to fulfill all the needs of novelists and bloggers and journalists.


I'm not yet sure what I think of Ulysses keeping everything I write inside its own little black box.

Actually I think it's silly.


So far I've found several things that prevent me from using Ulysses with the system I've developed for getting print-quality PDFs out of my Markdown:

  • No support for most metadata
  • No one-step way to export a group of sheets as a collection of files vs. one big file. (I could click and export each one separately but that would be far too tedious.)

Going into this review, I actually thought that list would be longer. Still, those two are enough that I'd have to either abandon Ulysses or scrap my system.

These are actually a concern for future-proofing as well. Should I invest time in using Ulysses and later decide to switch away from it, I would only be able to export my sheets as one long combined file per group. If my post-Ulysses world requires individual files then I would have a lot more work to do.


That's a real shame because Ulysses' actual text editing environment itself is the best I've ever used for prose.

  • Visually, the design defaults for various formats (bold/italic, links, block quotes, etc) are great
  • The shortcuts for footnotes and images are wonderful
  • Simple and easy-to-remember hotkeys for the most common editor tools (toggling side panes, opening previews, navigating headings)

Nice touch in the HTML conversion: If you put an image on a line by itself, Ulysses converts this to an HTML5 <figure> (along with a <figcaption> if you entered a caption) which is awesome. (This is one of those things that PHP MarkdownExtra still gets wrong.)


Minor Significant Markdown parsing issue: like nearly every other Markdown editor, Ulysses does not correctly interpret the "two trailing space" rule for manual line breaks.

Here is an example:

The original Markdown spec says you should be able to create a manual line break (i.e., without ending the current block or paragraph) by ending a line with two spaces.

In the example above, you can see the two trailing spaces but the block quotation syntax highlighting does not carry through to any of the lines after the first one.


Most Markdown editors get the two-trailing-space rule wrong in their syntax highlighting, but get it right when actually exporting to HTML. Ulysses gets it wrong everywhere.

[EDIT: @UlyssesApp tweeted to explain that their app does manual line breaks with SHIFT+Enter, which exports as <br> in HTML and two trailing spaces in Markdown.]

The correct HTML result for the above snippet is:

<p>This is a block quote<br />
that should<br />
continue to<br />
the next<br />

Ulysses generates the following incorrect HTML:

<p>This is a block quote </p>

<p>that should </p>

<p>continue to </p>

<p>the next </p>


App crashed for the third time today. Seems to happen most often when switching projects.


Image management: If you drag and drop an image into a Ulysses document, you're not simply creating a link to that image. Ulysses keeps its own copy of the image and includes it in any future exports. You can move or delete the original with no effect on your document.

(The exception is if your document is living under "External Folders", however — you are merely creating a Markdown link in that case.)


Another image management idiosyncracy that is far from being clear or obvious:

  1. If you drag an image into your document (again, excluding "External Folders" documents here), Ulysses keeps its own copy of that image for use in previews, etc.
  2. But you can also specify a URL for that image. What happens then?
  3. If you don't add a URL to an image:
    • HTML previews and exports use Ulysses' copy of the image. When exporting, Ulysses will save its own copy of the image file alongside the HTML file.
    • Markdown previews and exports will refer to a generic local copy of the image. When exporting, Ulysses will save its own copy of the image file alongside the HTML file.
    • PDF previews and exports will embed Ulysses' copy of the image.
  4. If you do specify a URL for the image:
    • HTML previews and exports will use the image located at the URL. Ulysses will not save a copy of the image alongside HTML files when exporting.
    • Ditto for markdown previews and exports.
    • PDF previews and exports will still use Ulysses' local copy of the image.



I was curious about how to create my own styles for PDF, HTML and ePub exports. I finally found a reference, Styles in Ulysses III, linked in the footer of the "download new styles" section of Ulysses' website.


The dev team is very active on twitter so scrolling through their tweets is a good way to find out what other users are asking for.

Big things on their todo list seem to be:

  • iPhone version
  • Dropbox sync
  • Internationalization (for iPad)
  • Docx import/export
  • Support for Tables

Commonly requested features that they are still not committing to any time soon:

  • Collapsible groups
  • Goal support for "external files"

At this point, I find the app frustratingly close to perfect.

I don't mind the iCloud storage, though I'd mind it far less if I could export a group of sheets as individual files.

If it had YAML or some other metadata support I'd buy it now.

The editing environment itself, as I've said, is the best I've ever used for prose.

But absent the YAML support it doesn't really help me. I'd just end up implementing a bunch of complicated workarounds to compensate.


Support for YAML is probably a long way off but it could go several ways:

  1. Hardly Nothing: Just strip YAML headers in document previews (just like Marked)
  2. Minimal: Implement syntax highlighting for YAML headers along with stripping YAML in document previews
  3. Nice: Implement basic metadata (say title, date, and author) per-sheet and per-group, in an "internal" Ulysses format, and optional inclusion of this metadata as YAML when exporting to Markdown. Plus #1 and #2 for use in external files.
  4. Really nice: In addition to #3, allow users to define their own custom fields. To preserve some simplicity, these need only support strings of text and could be the same for all projects.