<a href="https://github.com/skosch/Crimson">Crimson</a> is useful for experimenting with the new approach, because it’s free and defines few of the features it could support. Here are the features defined in its latest version:

           | r | i | b | bi | sb si |
    |------+---+---+---+----+-------|
    | c2sc | ✓ | ✓ | ✓ |    |       |
    | kern | ✓ | ✓ | ✓ | ✓  | ✓     |
    | liga |   |   |   | ✓  |       |
    | onum | ✓ | ✓ |   | ✓  |       |
    | ordn | ✓ |   |   |    |       |
    | pnum | ✓ | ✓ |   | ✓  | ✓     |
    | smcp | ✓ | ✓ | ✓ |    |       |
    | zero | ✓ |   |   |    |       |

**Ligatures**

It’s most surprising that `liga` is defined only in the bold italic face, so let’s fix that first.

Here’s Crimson before we add the feature:

    \documentclass{article}
    \usepackage{fontspec}
    \setmainfont{Crimson}
    \begin{document}
    The five baffled officials flew off.

    \textit{The five baffled officials flew off.}
    \end{document}

[![output of example][1]][1]

Now here’s the fix:

    \documentclass{article}
    \usepackage{fontspec}
    \directlua{
    fonts.handlers.otf.addfeature {
	    name = "liga",
	    {
	        type = "ligature",
	        data = {
		        ['f_f'] = { "f", "f" },
		        ['f_i'] = { "f", "i" },
		        ['f_f_i'] = { "f", "f", "i" },
		        ['f_l'] = { "f", "l" },
		        ['f_f_l'] = { "f", "f", "l" },
		        ['T_h'] = { "T", "h" },
	        }
	    },
	    "some ligatures"
      }
    }
    \setmainfont{Crimson}
    \begin{document}
    The five baffled officials flew off.

    \textit{The five baffled officials flew off.}
    \end{document}

[![output of second example][2]][2]

In `['f_i'] = { "f", "i" }`, `['f_i']` is the glyph name of the ligature, and `{ "f", "i" }` are the letters to be ligatured. So if your font calls the ligature “fi” rather than “f_i”, you should write `['fi'] = { "f", "i" }`.

**Stylistic Alternates**

Crimson has some alternate glyphs which cry out for a `calt` or `salt` feature. I haven’t yet figured out how `calt` works, even with feature files, so let’s do something easier, using `salt` to get a long-tailed Q:

    \documentclass{article}
    \usepackage{fontspec}
    \directlua{
    fonts.handlers.otf.addfeature {
        name = "salt",
        {
            type = "alternate",
            data = {
                Q = "Q.alt01",
            }
        },
        "long-tailed Q"
      }
    }
    \setmainfont{Crimson}
    \begin{document}
    Question

    \addfontfeature{RawFeature=+salt}
    Question
    \end{document}

[![output of alternates example][3]][3]

**Superiors**

Here I’ve found the principle, or part of it, but it’s probably better not applied to Crimson, because superiors 4–9 and 0 are designed to sit higher than superiors 1–3, as is especially noticeable in note 10 below:

    \documentclass{article}
    \usepackage{fontspec,realscripts}
    % see Ulrike’s answer at tex.stackexchange.com/a/235302/7883
    \renewcommand\footnotemarkfont{\addfontfeature{RawFeature={+sups}}}
    \renewcommand\fakesuperscript[1]{#1}
    \usepackage[paperwidth=180pt,paperheight=150pt,margin=12pt]{geometry}
    \directlua{
    fonts.handlers.otf.addfeature {
        name = "sups",
        {
            type = "substitution",
            data = {
                one = "¹",
                two = "²",
                three = "³",
                four = "⁴",
                five = "⁵",
                six = "⁶",
                seven = "⁷",
                eight = "⁸",
                nine = "⁹",
                zero = "⁰",
            }
        },
        "footnote figures"
      }
    }
    \setmainfont{Crimson}
    \begin{document}
    There\footnote{Note.} are\footnote{Note.} far\footnote{Note.}
    too\footnote{Note.} many\footnote{Note.}  footnotes\footnote{Note.}
    in\footnote{Note.} this\footnote{Note.}  little\footnote{Note.}
    sentence.\footnote{Note.}
    \end{document}

[![sample of sups feature][4]][4]

Unfortunately, this solution fails if you’ve selected any but the default numbers, say, old-style numbers. I don’t know how to get around that problem: adding a line such as `one.onum = "¹"` produces errors.

**CAVEAT**

I don’t really understand what I’ve done, and there may be better ways (which I’d be glad to learn about), but at least things are more or less working.


  [1]: https://i.sstatic.net/KHF6z.png
  [2]: https://i.sstatic.net/kO7ra.png
  [3]: https://i.sstatic.net/tLyEf.png
  [4]: https://i.sstatic.net/Yj8hu.png