{files 'dir', base='app'} scans a directory and iterates its entries, one occurrence each, with five fields: path (the full path), file (the name), ext (the extension, empty for a directory), item (the entry relative to the scanned directory, the extension taken off a file - the name a page is addressed by) and dir (the part of item before its last slash).

base= says what the directory is relative to: app the application, data DATA/, pad the path as given; otherwise it is read from the file system root. Whatever the base, the directory must lie inside the applications, the engine or DATA - anything else is an error. A directory that is not there is an error under the strict check, an empty list without it.

recursive walks every subdirectory and lists the files below; mask and exclude keep or drop names by a shell pattern, onlyFiles and onlyDirs keep one kind, and names starting with a dot are left out unless includeHidden is given. . and .. never come along.

The entries come in the order the file system keeps them, which differs between machines: add sort='item' (any handling option works) when the order matters. The tag reads a group parameter of its own as well, but the handling option of that name takes it first, so it cannot be used. {dir} is the plain version - the names only.