(For full details about Starkits, see https://www.equi4.com/starkit.html)
A Starkit contains a small standard header, followed by binary data:

(the actual header is slightly different, this is a simplified version)
The Tclkit runtime is very similar, in this case the (large) header contains executable code:

(in both cases, the OS starts from the start of the while, while Metakit always reads from the end to locate its data)
A Starpack combines both of the above into a single file. It has the same executable header as Tclkit, with all data from both Metakit databases merged into one:

The startup sequence of a Starkit can be visualized as:

The Metakit database contains the equivalent of a directory tree, here is an example:

The following info was taken from http://mini.net/tcl/3463
There is an emerging standard for the internal directory structure of a scripted document. This standard is based on the experience gained from building a variety of Starkits and Starpacks.
The toplevel directory would contain
doc/ contains any documentation
lib/ comtains any libraries
main.tcl contains the starkit startup scriptThe toplevel main.tcl gets called on startup. It typically contains a line like the following
package require starkit
starkit::startup
package require app-appnameThe starkit::topdir variable can be used in your application when locating other directories within the starkit. It was also used to extend the auto_path variable with the lib directory.
Note also that the application code lives in the package app-appname , where appname is your application name. This package lives in the directory lib/app-appname. Inside this directory, you will need a pkgIndex.tcl file similar to the following (where $appVersion is the version of your application).
package ifneeded app-appname $appVersion [list source [file join $dir appname.tcl]]
and appname.tcl will need to contain a line similar to the following
package provide app-appname $appVersion
So, to summarise, a minimal scripted document will need
appname.vfs/main.tcl
appname.vfs/lib/app-appname/pkgIndex.tcl
appname.vfs/lib/app-appname/appname.tclThe rationale for separating the application code into a separate package is that it will make it easier to modularise code and combine starkits.
For example, the wikit scripted document [1] contains the following structure
wikit.vfs/main.tcl
wikit.vfs/doc/wikidoc.tkd
wikit.vfs/lib/app-wikit
wikit.vfs/lib/autoscroll
wikit.vfs/lib/cgi
wikit.vfs/lib/gbutton
wikit.vfs/lib/wikitNote the following:
OLDER NOTES
Here are some bits I will need to clean up and consolidate:
Some raw thoughts on what seems to be needed: