A CLI tool to find, install, and publish extensions for interactive fiction authoring systems:
- TADS 3
- TADS 2
- Inform (7 and later)
- Inform 6
- Dialog
- Hugo
- ZIL
Written in Rust for platform independence, using Clap for the CLI interface.
brew install toerob/pif/pifOr tap first for shorter upgrade commands later:
brew tap toerob/pif
brew install pifcurl --proto '=https' --tlsv1.2 -LsSf https://github.com/toerob/pif/releases/latest/download/pif-installer.sh | shDownload the latest pif-x86_64-pc-windows-msvc.zip from the releases page, extract it, and place pif.exe somewhere on your PATH.
pif [OPTIONS] <COMMAND>
Commands:
info Show information about an extension
update Fetch the latest extension registry
install Install an extension
list List available extensions
search Search extensions by name and description
tags List all available tags
config Manage pif configuration
publish Publish an extension to the registry (interactive, opens a PR)
registry Manage the local installation registry
help Print this message or the help of the given subcommand(s)
Options:
-s, --system <SYSTEM> [default: auto] [possible values: auto, all, tads3, tads2, dialog, inform, inform6, hugo, zil, unknown]
--color <COLOR> [default: auto] [possible values: always, auto, never]
-v, --verbose <VERBOSE> Verbosity level 1-3 [default: 2]
Update the registry:
pif update
List extensions (auto-detects the IF system from the current directory):
pif list
| Filter | Flag | Match |
|---|---|---|
| Name | -k / --keyword |
fuzzy |
| Author | -a / --author |
fuzzy |
| Tag | -t / --tag |
exact |
| System | -s / --system |
exact |
pif list -k cartographer
pif list -a tomas
pif list -t puzzle
pif list -s tads3
Additional options: --sort-property (name/author/date), --ordering-direction (ascending/descending), --presentation (newline/comma).
Search by name and description (substring match), with the same filters as list:
pif search map
pif search "conversation system" -s tads3
pif search parser -a graham
pif search puzzle -t puzzle
| Filter | Flag | Match |
|---|---|---|
| Author | -a / --author |
fuzzy |
| Keyword | -k / --keyword |
fuzzy |
| Tag | -t / --tag |
exact |
| System | -s / --system |
exact |
Show details about one or more extensions, including versions, dependencies and where they are installed:
pif info t3cartographer
pif info dice -a "susan davis"
pif info -a "susan davis"
pif info -t puzzle
| Filter | Flag | Match |
|---|---|---|
| Author | -a / --author |
fuzzy |
| Keyword | -k / --keyword |
fuzzy |
| Tag | -t / --tag |
exact |
| System | -s / --system |
exact |
If no name is given, all extensions matching the filters are shown.
List all available tags:
pif tags
pif tags -s inform
Install one or more extensions (exact name or id match required):
pif install t3cartographer
pif install t3cartographer conspace
Install a specific version (colon-separated):
pif install t3cartographer:1.0.0
Install to a specific directory:
pif install t3cartographer -d libs/
Default installation directories:
| System | Default | Auto-detected by |
|---|---|---|
| Inform | macOS: ~/Library/Inform/Extensions/{Author}/ · Linux: ~/Inform/Extensions/{Author}/ · Windows: My Documents\Inform\Extensions\{Author}\ |
.inform directory |
| TADS 3 | Current directory (./) |
.t3m makefile |
| TADS 2 | Current directory (./) |
— (use --system tads2) |
| Inform 6 | Current directory (./) |
.inf file |
| Dialog | Current directory (./) |
.dg file |
| Hugo | Current directory (./) |
.hug file |
| ZIL | Current directory (./) |
.zil file |
Inform extensions follow the Inform IDE's expected structure automatically. For other systems, use -d to point at your project's library folder.
No --system flag needed — pif detects the system from the extension's registry entry.
When a TADS 3 makefile (.t3m) is detected in the current directory, pif install will automatically add the required -lib / -source entries to it.
PIF stores its configuration in a YAML file (auto-created on first run). See CONFIG.md for the full reference.
Quick examples:
# Display the full config file with syntax highlighting
pif config show
# Override where extensions are installed
pif config dir set tads3 ~/projects/tads3/lib
pif config dir reset tads3
# Restrict the default view to specific systems
pif config systems set tads3 inform inform6
pif config systems add hugo # add to existing list
pif config systems remove inform6 # remove one entry
# Pin which versions are shown/installed for a system (prefix match)
pif config versions set inform i10 i11.0
pif config versions add inform i12
pif config versions remove inform i10
pif config versions reset informPublish your extension to the registry (interactive, opens a PR):
pif publish
pif publish /path/to/extension
PIF keeps a local SQLite registry of where extensions have been installed on your machine, including the installed version.
pif registry list # show all recorded installations
pif registry remove <name> # remove a registry entry by name
pif registry remove <name> --path <path> # restrict to a specific path
pif registry clean # remove entries whose paths no longer exist
The registry is a directory tree hosted in a git repository:
registry/
tads3/
{namespace}/
{package-id}/
package.yaml
releases/
v1.0.0.yaml
vSNAPSHOT.yaml ← always treated as latest
inform/
{namespace}/
{package-id}/
package.yaml
releases/
v2-i10.1.yaml ← Inform branch suffix
v2.3.1.yaml
A release file named vSNAPSHOT.yaml (or SNAPSHOT.yaml) is always shown as the latest version, regardless of sort order. Use it for a rolling/development build that tracks the current HEAD of a repository.
package.yaml describes the extension:
schema-version: 1
id: t3cartographer
name: t3cartographer
author: Tomas Öberg
description: Generates a map from TADS 3 source code (SVG, HTML, DOT, ASCII output).
tags:
- mapping
- tads3releases/v1.0.0.yaml describes a specific release:
schema-version: 1
date: '2024-01-15'
source:
url: https://github.com/toerob/t3cartographer.git
format: git
branch: main
build:
exports:
- type: lib
path: t3cartographer/cartographer.tlThe source.format field can be git, zip, or a raw file extension (e.g. h, t, i7x).
For Inform releases, the filename suffix -i{branch} (e.g. v2-i10.1.yaml) identifies which Inform release branch the file targets.
The easiest way to submit an extension is pif publish, which walks you through the prompts, commits to a branch, and opens a GitHub compare URL for the PR.
Work in progress. No warranties — use at your own risk.
Copyright 2026 Tomas Öberg