Note: Answers to many questions could be found in Reference’s links; they include a lot of info not in the docs.
Inform 7 10.1.2 (current, 2022-08-31)
- Docs for I7 10.1 and IDE (integrated development environment)
- Compiler and tools docs/literate source
- Release notes detail changes and bugfixes
- 10.1 announcement thread
- I7 github repo (has useful links to its individual components)
- Bug tracker (requires Atlassian account)
Installation
@Juhana’s Borogove lets you edit and run I7 online without installing anything (10.1, 9.3/6M62, or 8.5/6G60). Borogove snippets allows sharing code examples.
10.1.2 packages for Mac OS, Windows, or Linux (as RPM, .deb, or flatpak (Linux IDE installation notes). They include the IDEs; the zipped source code archives there do not.
Building I7 from source (no IDE)
Version History
Previous releases were named by their build numbers; 10.1 introduced a new version number scheme with retroactive application:
| Build | Version | Released |
|---|---|---|
| 6G60 | 8.5 | Dec 2010 |
| 6L02 | 9.1 | May 2014 |
| 6L38 | 9.2 | Aug 2014 |
| 6M62 | 9.3 | Dec 2015 |
| 10.1 | Aug 2022 |
9.1/6L02 included substantial language changes; 10.1 included substantial implementation changes, though its language changes were modest. Many links here are labeled with the I7 version as of which they were current; beware that some details may be outdated. For most, it’s minor. A few have a significant amount of out-of-date info, but still-relevant parts too valuable to miss.
Documentation and Resources for 9.3/6M62
Development
The next release will be 11.0. No schedule has been announced. 9.3 is no longer supported; further releases of 10.X are not anticipated. Proposals for development are at Inform Evolution.
Learning
Tutorials
Start here!
- Allison Parrish’s I7 Concepts and Strategies (9.3/6M62)
- Drew Cook’s Inform Basics (10.1)
Manuals/Books
- The Inform 7 Handbook by Jim Aikin; I7 Handbook PDF (10.1)
- Ron Newcomb’s I7 Programmer’s Manual (6G60). Written for experienced programmers but parts are useful to any author
- @aaronius’ book, Creating Interactive Fiction with Inform 7 (6E72). B&N sells an epub of Creating Interactive Fiction for the Nook; it is otherwise out-of-print: PDFs you may see online are bootlegs
Reference
Writing with Inform read-through and commentary (9.3/6M62)
Deep dives by @drpeterbatesuk
- Spatial and other relations between objects & Spatial relations addendum
- Action / Grammar Token reference
- Action Patterns
- Scope and visibility & Scope and visibility II
- Definite/indefinite articles & improper/proper, singular/plural names in object creation
- How backdrops work
I7 Reference Manual (unofficial); discussion of I7 Reference Manual
The turn sequence and action-processing rules in detail
Times, Turns, and Tenses: details on counting occurrences of actions and the past tense in conditionals
- Chronological records
- Chronological record maintenance details
- Reporting and changing state - #11 by otistdog
Room description’s activities and rules (used by look-ing)
The "Rewrite The Parser in Inform 7" Project (6G60). Many details have changed since this was written, but Ron Newcomb’s Original Parser extension’s documentation remains an invaluable resource.
Line break behavior; see also Nathanael’s Cookbook
WI 27.14: what’s permissible in I6 inclusions (10.1)
@emshort’s rules flowchart (PDF) (5U92) illustrating the turn sequence
I7 Windows IDE with the NVDA screenreader
Compilation produces a Project Index, customized for your game and viewable in the IDE. In some ways, it’s the closest thing to an official reference manual, including many details not in the docs. Its Phrasebook Index section (Phrases, Lexicon, Relations, Verbs) is good to check (along with the docs’ General Index) when you half-remember something and are hunting for the right term to look up.
The literate source describes in detail how I7 parses your story; this Syntax.preform documentation PDF (6L02) offers a condensed account. One can also see what irregular verbs and plurals I7 handles (and how) within.
When to use which action rulebooks?
Don’t just put everything in Instead rules. Countless examples in the docs seem to endorse it… examples focused on things other than best practices for creating actions. Implementation may be more perfunctory than exemplary for elements that aren’t an example’s point. The seeming ease and convenience is a trap. If you implement everything in Instead rules, your story will become an incomprehensible mess as it grows beyond example length. See guidelines for rules about actions and:
- The perils of INSTEAD
- Message for failed actions - #4 by Zed
- Verb confusion- trying to feed my animals - #10 by Draconis
- Understanding understand and instead
Built-in Extensions
All use authorial modesty, thus don’t appear in the version command’s output. They can be browsed within the IDE: see “Contents” in any compiled game.
Basic Inform is new in 10.1. With it, one can use Inform, the language, without the IF-specific bits. See A Guide to Kits. A to begin phrase is required for your main code (to begin has no special significance outside of the Basic-only case).
To modify and extend I7’s World Model and built-in actions, it’s crucial to understand them. The Standard Rules are the authority here and are (mostly) highly readable, especially the Actions section.
The docs don’t list all of the built-in actions and commands; newcomers often get tripped up by a “new” command’s conflict with an existing command. See Actions > Commands in the Project Index for the whole list.
@otistdog 's Standard Rules Actions reference (9.3/6M62) has details on the actions, with charts of:
Directions (and their abbreviations) are not conventional commands. If a player enters one, it becomes the noun in a going action. oops / o, again / g, and undo are other parser special cases (they don’t correspond to actions).
Useful threads/posts
- The first thing you need to understand about Inform is
- Most common 'mistakes' and 'crutches' for those starting out with inform 7?
- The hidden secrets of Inform 7
- Command-line Inform 7: how to use ni, inform6, and cBlorb by CLI for 9.3/6M62 (has details on projects’ directory/file structure)
- Performance Best Practices (there are some expensive things to avoid, but there’s no substitute for profiling to see where your game is spending its time)
- Good coding style in Inform 7
- Limits on command length
- The Bubbling Beaker awards: novel, powerful, occasionally even useful techniques
- Rulebooks are a bit like switch statements... and yet different and Subroutine-ish things
- Side-effects from printing texts
Testing and Quality Assurance
- Checklist for authors of IF and Inform 7 IF in particular
- One tester's game polish tips for parser authors
Elsewhere
Ryan Veeder
Playing
Popular desktop applications supporting I7 games include:
- Lectrote
- Gargoyle
- Spatterlight (Mac OS)
List of glulx/.gblorb interpreters; see also Glulx and Z-machine below.
Extensions
The Windows IDE supports easy installation of extensions from the offical Inform Public Library. It’s broken in 10.1’s Mac OS and Linux IDEs, but you can install extensions manually: see Where to find Inform 7 Extensions.
The Friends of I7 Extensions is the most comprehensive source (the Public Library is based on its contents c. 10.1’s release).
- Docs for the Friends of I7 Extensions
- Counterfeit Monkey’s Extensions: many unique extensions, many others modified from their originals
- Glulx/Glk extensions ecosystem
The Technical Development > Inform Extensions category is for discussion of (existing, published) extensions.
Extension Writing Guides
Select games/examples with Source Code available
- @zarf’s Advent Window
- Games from 2022– tagged I7 source available on IFDB are mostly 10.1.
9.3/6M62
- Alex Proudfoot’s I7 Standard Examples ports, including @emshort’s Bronze
- @mathbrush 's Never Gives Up Her Dead
- Chin Kee Yong’s The Weight of a Soul
- Victor Gijsbers’ Kerkerkruip
- Ryan Veeder Expo for Good IF Event 1: Beautiful Source Code
- Cragne Manor by divers hands
- @emshort’s Counterfeit Monkey: especially valuable as an example of optimization in service of a large game; older Counterfeit Monkey source prior to optimization and reorganization
Earlier
- Slouching Towards Bedlam (6L02)
- @Juhana’s Sparkle (6L02)
- @Draconis’ Scroll Thief, Scroll Thief Bitbucket repo (6G60)
- @zarf’s Hadean Lands (6G60)
- @aaronius’ Blue Lacuna (5Z71)
How to Organize/Structure Your Project
There’s no one answer. Have multiple answers!
- Splitting the story into multiple files
- I7 Code Organization and Efficiency
- @Juhana’s Structuring I7 Code
- Ryan Veeder’s How to Write the Way I Write in I7
- Effective structuring and layout of code - Inform 7
See games with available source code above for examples.
Infrastructure
Inform 6
I7 compiles to I6 which is compiled to your choice of Glulx or Z-code (v8 only). I7’s standard library is built upon kits of I6 code. (The I6 standard library isn’t involved.)
The current version is I6 6.44. I7 10.1 comes with 6.41.
The Inform 6 Designer’s Manual (DM4) was last revised in 2001, prior to I6’s Glulx support. Some essential supplemental docs:
Much more at [I6] The list of Inform 6 documentation
While the docs stress that you shouldn’t need to concern yourself with what lies beneath…
- modifying or interacting with the I6 layer is the only choice for some things; many extensions do so
- some I7 behaviors are best understood as artifacts of I6 representations
- consulting the I7 compiler’s I6 output can be invaluable in troubleshooting
Glulx
Interpreters
- Glulxe (reference implementation) – C
- Glulxe debugger (when built with
VM_DEBUGGER) - profile-analyze.py for profiling (when built with
VM_PROFILING)
- Glulxe debugger (when built with
- Git (name predates the other git) – C
- Quixe – Javascript
Glulx Reference
- Glulx spec, Glulx spec in markdown
- Glulx Inform Technical Reference, Glulx Inform Technical Reference in markdown
- The local variable mess
- Glulx’s unusual features
Glulx Utilities
- Compile glulx binary to C (glulxtoc)
- Compile C to Glulx assemply
- Blaze Alan Marshall’s mrifk Glulx reverse compiler and disassembler
Glulx assemblers
- Gren Drake’s glulx-assemble
- zzo38’s glasm
- Glazer
Glk
Glulx I/O is via the Glk API. Glulx terps need a Glk library, e.g.
- CheapGlk (no windows, no status line, just input and output streams, primarily of interest for testing and development; invoke terp with the
-ucommand-line flag for UTF-8)) – C - GlkTerm (for use in a terminal; supports multiple windows); GlkTermw (supports characters beyond Latin1) – C
- GlkOte (Quixe/Lectrote) – Javascript
- cheap-glkote (ElseIFPlayer’s variant) – Javascript
- RemGlk (I/O via JSON objects; supports multiple windows, most Glk events) – C
- CocoaGlk (Mac IDE) – C
- Miniglk (default when compiling to C; built into I7) – C
- GlkOte-term – Javascript
Glk can’t fully support Z-machine’s text color options… without the (non-standard) Gargoyle Glk extensions included in:
- GarGlk (Gargoyle) – C++
- WindowsGlk (Windows IDE) – C++
- Async Glk (Parchment) – Typescript
- RemGlk-rs (Emglken) – Rust
- Chimara (GTK3 widget used by Linux IDE) – C
- Spatterlight’s Glk – C
The display the boxed quotation phrase exists to use a specific Z-machine feature; its use isn’t recommended for Glulx.
More Glk implementations on the IF Archive
Differences between Javascript & C Glk APIs
Glk via network
- Remote-IF Websockets or AJAX to RemGlk
- glknode HTTP API to CheapGlk
- glulxe-httpd HTTP API to CheapGlk; support for sessions & transcripts, see langworth.com
To put UI in a front-end process while a back-end process run a game, RemGlk is an obvious choice for the back-end (as in Parchment).
Glk Reference
Old, but still of interest:
- The Game Author’s Guide to Glulx Inform
- Brief Glk via Grokking Glk
- Gull: an introduction to Glulx Inform
Z-code
Some of countless Z-code interpreters:
- Frotz – C
- Bocfel (Gargoyle/Parchment/Spatterlight; Glk-based; Bocfel’s useful debugging options) – C
- Fizmo – C
- ZVM (Lectrote) – Javascript
- Gluzma – Glulx assembly
- Zig – I6
- JSZM (700 lines) – Javascript
With Zig or Gluzma, one could run a Z-code game within a Glulx game.
The Spatterlight, Gargoyle, and Lectrote apps, and iplayif.com / Parchment use Glk for I/O even with Z-code, so display the boxed quotation won’t match true Z-Machine appearance/behavior (the Z-machine quote box problem). Lectrote also doesn’t support all Z-machine text color options.
Z-code Reference
- Z-machine 1.1 standard, annotated
- The Z-Machine Standard 1.2 (draft) | Dannii’s IF Pages
- Z-machine spec errata
- Z-machine standard: unclear aspects/ambiguities
- Michael Ko’s Internal Secrets of Infocom Games
- Jeff Nyman’s Zifmia: Z-machine terp tests
- Tara McGrew’s Z-machine version comparison chart
Z-code Utilities
- ztools includes the zcode disassembler txd
- Allen Garvin’s ztool, most of ztools ported to Python
- Unz: unpack Z-machine file info
- reform: reverse compile Z-code to I6
- Chris Spiegel’s ZDevtools (zcode assembler/disassembler)
- ZLR debugger
Publication
The Web
Per WI Ch. 25: Releasing, release with a website uses a web template to create an index.html page with links to the game file or other included digital assets; release with an interpreter uses an interpreter template to make a play.html page that can run your game within a web browser. (Both cases rely on other files that are also written to the Release directory.)
Web templates
I7 includes the default Standard template and the straight-from-2005 Classic template. Styled is another.
Interpreter Templates
10.1 includes Quixe 2.2.1 and a broken version of Parchment. For an up-to-date Quixe or a functional Parchment, make a Templates directory under your project’s Materials directory. Inside it, unpack either or both of:
If you release with an interpreter I7 defaults to Quixe when compiling to Glulx, or Parchment for Z-code. You may specify release with a "Parchment" interpreter when compiling to Glulx. (Quixe is for Glulx only.)
release with an interpreter implies release with a website. play.html is provided by the web template.
Quixe’s Glulx terp is quixe.js; “Quixe” often means the terp, not the template.
Prior to 2025.1, Parchment used ZVM and quixe.js. Thereafter, it uses Git, Glulxe, and Bocfel compiled to Wasm by Emglken. Async Glk is the front end; RemGlk-rs intermediates between it and the terp. “Parchment” often means the large project powering iplayif.com, not the template.
Bisquixe
@Mathbrush 's Bisquixe, a modified Quixe template plus I7 extension (for 9.3/6M62 or 10.1), allows easy changes to text formatting/style during play and hyperlink support. See Fake Twine.
- Web styling with Bisquixe for new Inform authors (who don't know CSS or web stuff)
- Beginner's Guide to Styling Inform Releases with Bisquixe
Vorple
Vorple is an interpreter template/extension combo that allows ongoing interaction between a running game and author-created Javascript in the browser, unlocking enormous potential. Jack Welch’s re: Dragon (source available) is an example of an extensively customized UI in Vorple.
Cover Images
If you release along with cover art, put Cover.jpg or Cover.png in your materials directory. Inform automatically copies this to Small Cover.jpg (or png) in Release; this is what is displayed on index.html and play.html; it links to the original. If you provide your own Small Cover, it’s ignored. You can overwrite Small Cover in Release (every single time) if you like.
Alternatives
If your game has file or figure assets, play.html as generated by release with an interpreter won’t be able to find them. Either of these are preferable:
- @Zarf’s ifsitegen.py is a command-line script that acts on a Z-code, Glulx, or blorb file; results are similar to releasing with Quixe (except it uses ZVM for Z-code)
- IPlayIF’s sitegen is online and uses Parchment: upload a game file; it creates and downloads a browser-playable game as a single HTML file
Hosting
Some free ways to publish a game on the web:
If your game file can be directly downloaded from the web, you can submit its URL to iplayif.com and record the URL of the IPlayIF page you’re redirected to: if your game remains available at the original URL, anyone can use that IPlayIF URL to play your game online. Or you could could construct the URL: it’shttps://iplayif.com/?story= plus the URL-encoded URL of the game file.
This can’t work if access is encumbered by, e.g., a CAPTCHA or required login. If you upload your game to the IF Archive you’ll end up with a suitable URL for this purpose: many IFDB pages’ Play online buttons do this.
Stand-alone application
Lectrote is Quixe (and other terps) within Electron, roughly. It derived from @Zarf needing cross-platform stand-alone apps for Hadean Lands. It can be the basis for a “bound game”; see trying to make standalone game w/ Lectrote.
One can also compile Inform into C that can compile into a standalone executable.
Utilities
- I7 source highlighter
- RegTest – regression testing for IF running on any interpreter either built with RemGlk or using plain simple input and output streams for I/O (like dfrotz from Frotz or anything built with CheapGlk)
- RegTest bash completion script
- RegTest-HTML – RegTest-compatible framework for GlkOte-based terps
- @Natrium729’s I7 Text Extractor – extracts strings from I7 source (for ease of proofreading)
- Jacques Frechet’s glulx-strings online – extracts all strings from glulx, zcode, or several other formats (accepts blorbs)
- glulx-strings source (node and Python versions)
Blorbs
blorb is a standard for bundling game assets into a single file for distribution. Inform creates one when you build for release.
Blorb utilities
- blorbtool – Python; blorbtool online
- inblorb (I7 10.1) – C
- Bamboozle (TUI) – C
- IFTools – C#
- cBlorb (I7 9.3) – C
- snavig – Rust
Editor plugins
Emacs
I7 in translation
- Manifesto for the translation of I7 (PDF) (6G60) by Graham Nelson
- Greek (10.1) by Konstantinos Sitistas
- Spanish (10.1) by Sebastian Arg (see centro de documentación I7)
- Italian (6M62) by Massimo Stella, maintained by Leonardo Boselli
- French (6L38) by Nathanaël Marion
- Swedish (6G60) by Felix Larsson
- German (6G60) by Team GerX
How to Not Lose This Post
This post is pinned to its category. By default, Discourse unpins a thread when you reach the bottom; this can be turned off in Interface under Preferences in your Profile. Or you can bookmark it: the bookmark icon is at the bottom of the post (you may have to select a … icon to see it). To see your bookmarks, select your profile icon in the upper right, then select the bookmark icon there. If you do lose the post, search the forum for “documentation and resources” or visit while logged out.
This ain’t over
Documentary and resourceful goodness continues in the I7 Docs and Resources Annex below.

