Ink Story Template

Choices

Customize how choices appear and behave for your readers.

Keyboard Hints

On devices with keyboards, choices display number hints (1, 2, 3…) so readers can select them by pressing keys. You can control this behavior:

# CHOICE_NUMBERS: auto

Aliases: # CHOICE_NUMBERS, # CHOICE_NUMBERING, # KEYBOARD_HINTS

Value Behavior
auto Show hints on keyboard devices only (default)
on Always show hints (regardless of device type)
off Never show hints

Tip: Readers can override this setting in the Settings menu under “Accessibility” → “Choice Number Hints”. If you’re testing and don’t see the expected behavior, click “Reset to Defaults” in the Settings menu. This will restore your # CHOICE_NUMBERS: tag setting as the active preference.

Tone Indicators

Show small icons next to choices to hint at their tone or consequences—like whether a response is flirty, aggressive, or risky.

Setup

Add this tag to the top of your main .ink file to enable tone indicators globally (readers can override this in settings):

# TONE_INDICATORS: on

Aliases: # SHOW_TONES

Value Behavior
on Tone indicators enabled by default, readers can opt-out in settings
off Tone indicators enabled but readers have to opt-in in settings

Then at the top of your main .ink file, define your custom choice tags and associated icons:

# TONE: flirty 🔥
# TONE: shy 💜
# TONE: bold ⚡
# TONE: danger warning

The format is # TONE: label icon where:

  • label is the tag name you’ll use on choices
  • icon is an emoji or a Material Icon name (like favorite, warning, star)

Accessibility note: Tone indicator labels are read aloud by screen readers. Choose descriptive names like “warning”, “flirty”, “serious” rather than abstract icon names like “star_border”.

Tagging Choices

+ Lean in closer # flirty

In choices with brackets, add tone tags inside or before the brackets:

+ [Lean in closer # flirty]
+ #shy [Step back nervously]
+ [Go all in # bold # danger]

Important: Tags after the closing bracket won’t work. In Ink, anything after ] becomes part of the result text (what appears after clicking), not the choice itself. Tags follow the same rule.

// ✗ Does NOT work (tag applies to result, not choice):
+ [Some choice] #flirty

// ✓ Works (tag before brackets):
+ #flirty [Some choice]

// ✓ Works (tag inside brackets):
+ [Some choice # flirty]
+ [# flirty Some choice]

How Icons Display

By default, the first icon appears before the choice text. Additional icons trail after:

🔥 Tell them how you feel ⚡💜

To force all icons to appear after the text instead, add this to your story header:

# TONE_TRAILING

Aliases: # TRAILING_TONES

Reader Control

When tone indicators are enabled, readers can toggle them off in the Settings menu if they prefer to choose blind.

Tag Effect
# TONE_INDICATORS: on Enabled and visible by default
# TONE_INDICATORS: off Enabled but hidden by default (reader can turn on)
# TONE_TRAILING All icons appear after the choice text

Example

# TONE_INDICATORS: on
# TONE: flirty 🔥
# TONE: shy 💜
# TONE: end_romance 💔

=== romance_scene ===
How do you respond?

+ [Lean in and whisper # flirty]
  -> flirty_response
+ [Blush and look away # shy]
  -> shy_response  
+ [We should just be friends # end_romance]
  -> friendship_path
+ [Say nothing]
  -> silent_response

Disabled Choices

Show a choice that readers can see but can’t select. Useful for showing locked options or requirements not yet met.

+ [Enter the castle # UNCLICKABLE]
+ [Take the forest path]

The disabled choice appears greyed out and can’t be clicked.

Aliases: # UNCLICKABLE, # DISABLED, # DISABLE

Tip: Combine with conditional text to explain why:

+ {has_key} [Enter the castle]
+ {not has_key} [Enter the castle (need key) # DISABLED]

Found a bug or have a feature idea?
Open an issue on GitHub, or use the feedback forms: Bug report · Feature request