LazyAuthor is designed to make writing both traditional books and interactive stories simple.
Whether you're creating a novel, a branching adventure, a visual novel, or a gamebook, this guide will walk you through every step of the process.
- Interactive stories with branching choices
- Variable-driven narratives
- Visual novel style experiences
- Traditional ebooks
- EPUB exports
- Multimedia-enhanced stories
- Open lazyauthor.lindocode.com and create a free account.
- On the Select screen, choose your format:
- Interactive Story — branching fiction with choices, variables, and conditions.
- Book — standard ebook with chapters, a table of contents, and cover art.
- Your work saves automatically as you type. Switch modes at any time via the account menu → Change mode.
The story editor is a three-column layout: Scene list (left) · Scene editor (centre) · Meta panel (right).
| Action | How |
|---|---|
| Add scene | Click + in the scene list header |
| Select scene | Click any scene in the list |
| Rename scene | Edit the title field at the top of the scene editor |
| Delete scene | Click × next to the scene in the list |
| Set start scene | Click ▶ next to any scene — the reader always begins here |
Start scene — exactly one scene is marked as the start. It is shown with a ▶ indicator. Readers begin here when they open the exported EPUB.
Deleted scene cleanup — when a scene is deleted, all choices pointing to it and all inputNextSceneId references are automatically removed from other scenes.
Each scene has one of three types, set in the Scene type section.
The standard scene type. Has a narrative body and an optional choices panel. Readers read the text then pick a choice to proceed.
Captures a value from the reader and stores it in a variable.
- Switching to Player Input preserves existing choices. They are removed only once you select a Next scene after submit.
- Full configuration in Player Input Scenes.
Marks a branch as complete. No choices are shown; the story ends at this scene for any path that reaches it.
- Switching to Ending when choices exist shows a confirmation prompt before clearing them.
The large textarea holds the scene's prose.
Variable interpolation — insert {{variableName}} anywhere in the body to display the current value at read time.
| Syntax | Effect |
|---|---|
{{name}} |
Display current value |
{{score + 5}} |
Display value + 5 (read-only, does not mutate) |
{{score++}} |
Display value + 1 (read-only) |
{{score--}} |
Display value − 1 (read-only) |
{{score * 2}} |
Display value × 2 (read-only) |
{{score / 2}} |
Display value ÷ 2 (read-only) |
Media markers — when media is attached, control its position in the narrative with inline markers:
| Marker | Inserts |
|---|---|
[image] |
First attached image |
[image2], [image3] … |
Subsequent images |
[audio] |
Audio player |
[video] |
Video player |
[break] |
Scene break divider (uses theme divider symbol) |
If no markers are used, media is appended after the body text.
The Choices collapsible section appears on Narrative scenes only.
Adding a choice
- Type the choice text in the input field.
- Select the target scene from the dropdown.
- Press Enter or click Add.
Editing a choice — click into any existing choice row to change its text or target scene inline.
Deleting a choice — click × on the choice row.
Each choice links to exactly one target scene. Add as many choices as needed. Choices render as buttons in the order they appear.
Effects run when the reader selects a choice, mutating one or more variables before the next scene loads.
Adding an effect
- Expand a choice row.
- Click + Effect.
- Select a variable, an operation, and a value.
Operations
| Operation | Result |
|---|---|
set |
Assigns value directly to the variable |
add |
variable = variable + value |
subtract |
variable = variable − value |
multiply |
variable = variable × value |
Multiple effects can be stacked on a single choice and run in order.
A condition gates a choice — it is only shown to the reader if the condition evaluates to true at runtime.
Setting a condition
- Expand a choice row.
- Click Set condition.
- Select a variable, an operator, and a comparison value.
Operators
| Operator | Meaning |
|---|---|
eq |
Equal to |
ne |
Not equal to |
gt |
Greater than |
gte |
Greater than or equal to |
lt |
Less than |
lte |
Less than or equal to |
One condition is supported per choice. To combine multiple conditions, chain scenes: gate scene A with condition 1, then gate a choice inside it with condition 2.
Removing a condition — click Remove condition inside the choice row.
Variables are named values that persist across scenes. Open the Variables panel via the toolbar button (shows a count badge when variables exist).
Variable fields
| Field | Description |
|---|---|
| Name | Identifier used in {{name}} templates and condition/effect selectors. No spaces. |
| Label | Human-readable name shown in the editor UI. |
| Type | text or number. Numbers enable arithmetic operations and numeric comparisons. |
| Default value | Assigned when the story starts. |
Variable lifecycle
- Initialised to their default values when a reader starts the story.
- Effects on choices mutate values during play.
{{name}}in narrative bodies and input prompts reads the current value.- Deleting a variable automatically removes all effects and conditions that reference it across every scene.
An input scene pauses the reader, shows a prompt, and stores their response in a variable.
Core fields
| Field | Description |
|---|---|
| Prompt | Text displayed above the input field (e.g. "What is your name?") |
| Store in variable | The variable that receives the reader's response |
| Next scene after submit | Where the reader goes after a valid submission. Selecting this clears any existing choices on the scene. |
Input type — controls the HTML input rendered to the reader:
| Type | Use case |
|---|---|
text (default) |
Any string |
number |
Numeric input only |
password |
Hidden characters (e.g. a code word or PIN) |
Validation — optional. Reject wrong answers and retry or redirect.
| Setting | Description |
|---|---|
| Match type | exact — must match exactly; contains — must include the value; regex — must match the regular expression |
| Correct answer | Expected value. Leave blank to accept any input. |
| Case-sensitive | Capitalisation must match when enabled |
| Error message | Shown to the reader on a wrong answer |
| On wrong answer → scene | Redirect on failure (default: stay and retry) |
| Max attempts | Tries before redirecting to the fail scene (0 = unlimited) |
Time limit — optional countdown in seconds.
| Setting | Description |
|---|---|
| Countdown (seconds) | 0 = disabled |
| On timeout → scene | Redirect when time runs out |
Submission limit — optional cap on total submissions across the session.
| Setting | Description |
|---|---|
| Max submissions | 0 = unlimited |
| On limit reached → scene | Redirect when the limit is hit |
Managed in the Media collapsible section of each scene.
Images
- Upload one or more images (PNG, JPG, WebP, GIF).
- Stored in Supabase Storage and referenced by URL.
- Placed inline with
[image],[image2],[image3]markers, or appended automatically. - Remove by clicking × on the thumbnail.
Audio
- Single audio file per scene (MP3, OGG, WAV).
- Options: Autoplay, Loop, Hide controls (audio runs but no player UI is shown).
- Placed with
[audio]marker.
Video
- Single video file per scene (MP4, WebM).
- Placed with
[video]marker.
All media is tied to the story's ID. Deleting the story or loading a new one cleans up orphaned files in Supabase Storage.
Edited in the Meta panel on the right side of the editor.
| Field | Description |
|---|---|
| Title | Story title — used in the EPUB manifest and cover page |
| Author | Author name — written to EPUB metadata |
| Language | BCP-47 language code (e.g. en, fr, zu) |
| Cover image | Displayed on the EPUB cover page |
Open via the Theme toolbar button. Controls the visual presentation of the exported EPUB.
Body typography
| Setting | Options / Example |
|---|---|
| Font family | CSS font-family string, e.g. Georgia, serif |
| Font size | 1em, 16px |
| Line height | 1.9, 28px |
| Text alignment | Left / Justify |
| Body padding | 1.5em 2em |
| Text indent | 1.2em |
| Text colour | Any CSS colour |
Title / h1
| Setting | Options |
|---|---|
| Title size | CSS size |
| Title style | Normal / Italic |
| Title weight | Normal / Bold |
| Title alignment | Left / Centre |
| Letter spacing | CSS value |
| Decoration | None / Rules (horizontal rules above and below) |
Choice buttons
| Setting | Options |
|---|---|
| Style | Outline / Filled |
| Colour | CSS colour |
| Border radius | Pill / Rounded / Square |
Input form (Player Input scenes)
| Setting | Options |
|---|---|
| Field style | Line (underline only) / Box (full border) |
| Colour | CSS colour |
| Submit button style | Outline / Filled |
| Submit radius | Pill / Rounded / Square |
Images
| Setting | Options |
|---|---|
| Max width | 100%, 480px |
| Alignment | Left / Centre / Right |
Section divider
| Setting | Description |
|---|---|
| Symbol | Characters shown between sections, e.g. * * *, —, ✦ |
| Colour | CSS colour |
Click Preview in the scene editor header to toggle a live read-only view of the current scene. The preview renders:
- Narrative body with
{{variable}}expressions interpolated using default values. - Choices as styled buttons with the active theme applied.
- Media in its inline marker position.
- Conditions evaluated against default variable values (a conditioned choice is hidden if the default does not satisfy it).
Click Edit to return to the editor.
Export EPUB
- Click Export EPUB in the toolbar.
- The EPUB 3 file is built entirely in the browser — no server upload, no waiting.
- Output: cover page · all scenes rendered with the active theme · embedded JavaScript runtime for branching navigation · all media embedded.
- Compatible with Lazy Reader and any EPUB 3 reader that supports scripted EPUBs.
Import EPUB
- Account menu → Import EPUB.
- Parses an existing
.epubfile and maps its content to scenes. - Replaces the current story (confirmation required if the story has content).
- Import warnings (unsupported features, skipped content) appear in a dismissible banner.
The book editor is a three-column layout: Chapter list (left) · Chapter editor (centre) · Meta panel (right).
| Action | How |
|---|---|
| Add chapter | Click + Add chapter at the bottom of the chapter list |
| Select chapter | Click any chapter row |
| Rename chapter | Edit the title field at the top of the chapter editor |
| Delete chapter | Hover a row → click × (only available when more than one chapter exists) |
| Reorder | Hover a row → click ▲ or ▼ |
Chapter numbering — numbers are computed from position. The chapterStartAt meta field controls which index receives number 1, useful for books with a prologue or unnumbered front matter.
- Title field — the chapter title, used in the body heading and the auto-generated table of contents.
- Edit / Preview toggle — switch between the prose editor and the chapter preview.
- Narrative textarea — the chapter body in plain text with inline marker support.
Inline markers
| Marker | Inserts |
|---|---|
[image] |
First attached image |
[image2], [image3] … |
Additional images |
[break] |
Scene break divider (uses theme divider symbol) |
If no markers are used, images are appended after the body text.
- Upload images from the chapter editor (PNG, JPG, WebP, GIF).
- Multiple images can be attached per chapter.
- Stored in Supabase Storage and embedded in the exported EPUB.
- Remove via × on the thumbnail.
- Control placement with
[image]markers in the body.
Edited in the Meta panel on the right side of the editor.
| Field | Description |
|---|---|
| Title | Book title — used in the EPUB manifest and cover page |
| Author | Author name — written to EPUB metadata |
| Description | Short synopsis, written to the EPUB description field |
| Language | BCP-47 language code |
| Cover image | Displayed on the EPUB cover page |
| Chapter start at | 0-based index of the first numbered chapter. Set to 1 to make index 0 a prologue (unnumbered), with index 1 becoming Chapter 1. |
Open via the Theme toolbar button.
Body typography
| Setting | Options / Example |
|---|---|
| Font family | Georgia, serif |
| Font size | 1em |
| Line height | 1.9 |
| Text colour | CSS colour |
| Body margin | 1.5em 1.8em |
| Text alignment | Left / Justify |
| Text indent | 1.2em |
Chapter number label
| Setting | Options |
|---|---|
| Visible | Show / hide the "Chapter N" label above the title |
| Colour | CSS colour |
| Letter spacing | CSS value |
Decorative rules around title
| Setting | Options |
|---|---|
| Show rules | Enable / disable horizontal rules above and below the title |
| Rule colour | CSS colour |
| Rule width | CSS width, e.g. 40% |
Chapter title (h1)
| Setting | Options |
|---|---|
| Title size | CSS size |
| Title style | Normal / Italic |
| Title weight | Normal / Bold |
| Letter spacing | CSS value |
Scene break divider
| Setting | Description |
|---|---|
| Symbol | Characters between sections, e.g. * * * |
| Colour | CSS colour |
Table of contents page
| Setting | Description |
|---|---|
| TOC title colour | Colour of the "Contents" heading |
| TOC title letter spacing | CSS letter-spacing |
| TOC entry dot colour | Colour of the leader dots |
Click Preview in the chapter editor header to see an iframe rendering of the chapter exactly as it will appear in the EPUB — chapter number, decorative rules, title, body text, images, and dividers all rendered with the active theme.
Click Edit to return.
Export EPUB
- Click Export EPUB in the toolbar.
- Built in the browser — no server upload.
- Output: cover page · auto-generated table of contents · all chapters with the active theme · embedded images.
- Compatible with Kindle (via Calibre), Apple Books, Kobo, and any standard EPUB 3 reader.
Import EPUB
- Account menu → Import EPUB.
- Content is mapped to chapters automatically.
- Replaces the current book (confirmation required if the book has content).
Import .docx
- Account menu → Import .docx.
- Imports a Microsoft Word document, splitting content into chapters based on heading structure.
- Replaces the current book (confirmation required).
LazyAuthor uses a two-layer persistence strategy so your work is never lost.
| Layer | Behaviour |
|---|---|
| localStorage | Written immediately on every change. Provides instant load on the next visit even without internet. |
| Database cloud | Written 1.5 seconds after the last change (debounced). Cloud copy is authoritative — it overwrites localStorage on load if a newer cloud version exists. |
Sync status indicator in the toolbar:
| Status | Meaning |
|---|---|
Saving… |
A debounced write is pending or in progress |
Saved |
Cloud and local are in sync |
Save failed |
A database write error occurred (shown in red). Local copy is still intact. |
Story and book data are stored independently. Switching formats does not affect the other format's data.
Accessed via the email address button in the top-right of the toolbar.
| Action | Description |
|---|---|
| Change mode | Return to the mode selection screen |
| Import EPUB | Replace current story/book from an .epub file |
| Import .docx | (Book editor only) Replace current book from a Word document |
| Sign out | End the session |
| Delete account | Permanently deletes the account, all story/book data, and all uploaded media from database. This cannot be undone. |