Garbage-collection after running a game interpreter may not be complete, or sufficient. Playing a Z-machine multiple times seems to leak away about 100Kb of memory on each iteration. Because plugins are garbage-collected, it is hard to see how the leak is from re-running the Nitfol plugin. But the effect seems more evident with this than any other plugins, which suggests a connection to the plugin. There may be a leak in Glk styles and hints code that is triggered by Nitfol. Or it may be something else. When running multiple games that use image resources, IFP cannot fully reset the state of Glk's cached resource maps. For the moment, you may see odd problems with image display (incorrect sizing, incorrect image) with legion. IFP may misuse several attributes of the Glk API. It certainly uses at least one internal Glk function that it would be better not to use. IFP is extremely sensitive to revisions or extensions to Glk. Because libifppi replicates every Glk function, any changes or additions to Glk means the same changes to IFP. URLs are not well integrated into the rest of IFP. Where multiple plugins appear able to run a file, IFP selects only the first found. The only HTTP request status codes handled are 200 (success) and 404 (document not found). In particular, HTTP redirections should be possible. FTP server status codes are not fully dissected or differentiated. The FTP response for where a file is absent is the same one as for where the file exists but there is no permission for the server to read it. The URL cache persists only as long as the main program is running. More useful would be to make the cache persistent across program runs, or even across all IFP clients. The internal workings of dup2 are unclear. Acceptor patterns may not be right for all of the game plugins. Acceptor patterns are limited; multiple patterns with AND and OR operations might be needed at some point. Chaining plugins are a real nuisance with the Linux dynamic loader. If it sees that a process has already loaded a particular file, checked by inode number, it will return the same handle to the shared object, and increment the object's reference. This is not useful for IFP, which requires separate address spaces for the static variables in multiple loaded instances. To solve this, IFP currently copies the entire library, then reloads it. The unarchiving plugin searches sequentially through the top level of the archive just unpacked, and plays only the first playable game file found. This is inflexible. Some IFP data structures are singly linked lists, and would be better as doubly linked lists. IFP resets various things inside of Glk without really knowing what it is doing. Glk seems to be able to withstand this, which is great. URL parsing may be wrong, either slightly or completely. There may be a better way to intercept malloc(), free(), and its cousins in a plugin than the way IFP currently does things. IFP sets up some signal handlers, mostly so it can delete temporary files when the application exits through something like SIGTERM or SIGINT. However, by the time it gets the chance to set the handlers, Glk has already called dibs on them. To try to cope, IFP saves the addresses that Glk put in the handlers, then installs its own. On receiving one of these signals, IFP will call the original handler before performing its own signal-handling dance. Is there a better way to handle this? The way in which the registered options data is passed forwards through chaining plugins might benefit from another look. The whole interpreter options area is incomplete, anyway. Is there any sense in a plugin that can dig games out of Apple II disk images? Or one that can find and run the game text part of a DOS exe IF game? IFP might handle the thorny issue of how to offer hooks for games programs to control things like saving and restoring games, restarting or quitting the current game. IFP does nothing to support the possibility of using threads to run multiple games simultaneously. Even in the presence of threads, IFP needs a way to be able to run multiple plugins at the same time, perhaps requiring a "session ID" extension to Glk. The Xglk library should be built with sound support, but it's not.