Atrament, an interactive fiction engine powered by Ink

As for me, Ink was an epiphany. The whole idea of separating game narrative and game presentation seemed so great to me. That’s when I decided to build my own game engine, which will use Ink as a scripting language. It took much longer than I expected…

I started building Atrament in 2017 as a tool for myself. However, after several refactorings, the result was still not satisfying. And only when I started to actually build games with it, the puzzle clicked, and in late 2023, Atrament 1.0 was quietly announced. Since then, it has come a long way, and the latest version of Atrament, 2.3.1, was released in October 2025 - thanks to IFTF support.

Briefly speaking, Atrament is a game engine (primarily for choice-based games), which uses Ink as a scripting language, and HTML+CSS+JS as a presentation layer.

What features does it provide out of the box?

  • nicely looking web user interface;
  • special Ink tags to control game flow and presentation;
  • custom markup: blocks, tables, headers, info boxes, progress bars, and so on;
  • interactive UI elements: buttons and inputs;
  • customizable interface elements: toolbar and overlays;
  • multimedia support: images, sounds, music, and video;
  • configurable state management: autosaves, checkpoints, saved games;
  • customizable CSS styles, color themes, and fonts;
  • built-in debugger to watch/edit variables, run Ink functions, etc.

The Atrament project can be exported as a:

  • single HTML file, similar to Inky web export or Twine;
  • web application (actually, it’s a PWA, so it can be installed from the browser)
  • standalone executable for Windows, Linux, and macOS.

Full documentation with a quick start how-to is available here: https://atrament.ink/

To see what game made with Atrament can look like, see “The Coiled Crown” gamebook adaptation. The full source code of the Atrament project is available at GitHub.

A screenshot from a game:

The development goes on, and there will be more features in the engine. Stay tuned!

19 Likes

This looks really nice! A lot of people love Ink so this is a great way to format a story, especially for mobile with all kinds of (literal) bells and whistles. Love the modals, sound and music (eventually) support, and progress bars and stat sheets.

I still haven’t gotten around to actually using Atrament for a finished project yet (I usually use a custom front end of some sort), but it’s getting more and more inevitable at this point, I think. I do keep recommending it to people asking about slightly-expanded UI options, though. Thanks for all the hard work!

EDIT: if you’re taking feature requests, one really helpful feature would be the ability to make the app automatically select a choice at random, instead of showing them to the player.

I recently stumbled upon Atrament when you starred me on GitHub. I was surprised that I had never heard of it on this forum but it was being discussed on Discord. I was eagerly waiting for this announcement post. :grinning_face_with_smiling_eyes: Well done!

We recently were made aware how difficult it was to surface new engine development on this forum, so glad things are now getting attention; thanks @dfabulich !

2 Likes

I have a couple of games in development with Ink / Atrament, and I highly recommended it!

5 Likes

This looks fantastic—exactly the sort of thing I wish we’d had when we started Loose Ends! Glad to see it’s officially released now!

2 Likes

Yes, feature requests are always welcome. A lot of features implemented this year were a feature requests initially.

Here’s the major feature roadmap for the next year:

  • automated testing tool (similar to ChoiceScript’s randomtest)
  • custom scene renderers (for example, a scrollable map like in “Sorcery!”)
  • multi-layer images, image composition;
  • images with clickable areas;
  • on-screen notifications;
  • improved debugging with undo/redo;
  • desktop UI layout (currently Atrament is mobile-first and uses the same UI on all platforms)
4 Likes

Ooh, this is exactly what I want for my next project! :smiling_face:

Ink tags support substitution since 1.1.1 (2022), they are called dynamic tags:

3 Likes

Thanks, that’s great to know!

It’s honestly just freaking weird because I googled for that more than once and I only came across an old feature request but never found that it was already a thing. I feel like this is starting to become a pattern in this thread, with me overlooking Ink-related stuff. :sweat_smile:

1 Like

That’s why I mentioned Ink dynamic tags in the Atrament documentation too: Introduction to Ink | Atrament

Dynamic tags are used, for example, to make choices unclickable depending on condition.

2 Likes

Atrament 2.4.0 is out! Notable new features:

  • HTML templates, for those who need very custom HTML markup
  • Layered images with clickable areas
  • Automatic choice (with timeout, random or predefined)

Full changelog is here. Documentation is also updated.

4 Likes

Atrament 2.4.1 is out, with a dozen of minor bug fixes - read changelog for more details.

4 Likes