• Welcome to the new COTI server. We've moved the Citizens to a new server. Please let us know in the COTI Website issue forum if you find any problems.
  • We, the systems administration staff, apologize for this unexpected outage of the boards. We have resolved the root cause of the problem and there should be no further disruptions.

Traveller ontology

In my day job I spend a fair bit of time working with the semantic web and open linked data. I've just received my T5 package and its abstract and modular nature immediately made me think of semantics.

Has anybody produced a traveller ontology?
 
Has anybody produced a traveller ontology?


None that I'm aware of. Traveller is ripe with encodings, T5 no different than the others, and robject was making some noise about providing more structured data around some of the information, but that's all the farther that any structured data has gone, let alone metadata.
 
I might start having a (long, leisurely) look at this, then.

Is there a preferred respository (github, sourceforge, ???) for Traveller software?
 
In my day job I spend a fair bit of time working with the semantic web and open linked data. I've just received my T5 package and its abstract and modular nature immediately made me think of semantics.

Has anybody produced a traveller ontology?

My problem is I've never understood what you would use an ontology for (i.e. how you would use it).

And this is despite my specialisation in data modelling, and forays into controlled vocabularies such as SBR and corporate business glossaries.
 
A Traveller 3d Party Publisher was, a few years ago, musing over a "re-visioning" of the Traveller Universe. He suggested the first step was to nail down the Facts that Defined the Setting (Keep that, and re-do everything else). This is the closest I've come to what I think of as an ontology for Traveller... a "specification" for the game concepts. Example: jump takes one week.
 
There is a new, small but growing github repository https://github.com/makhidkarun. Please come join us.

There's some interesting stuff in Makhidkarun, I might raid the word generation stuff for material I could use for world name generation in StarBase.

I put StarBase on GitHub as well, but as a separate repository as its a pretty hefty project in its own right and the Makhidkarun stuff is C while StarBase is in Python.

Simon Hibbs
 
There's some interesting stuff in Makhidkarun, I might raid the word generation stuff for material I could use for world name generation in StarBase.

I put StarBase on GitHub as well, but as a separate repository as its a pretty hefty project in its own right and the Makhidkarun stuff is C while StarBase is in Python.

Simon -

If you want to bind it into makhidkuran, you're very welcome to do so. PM me your github account, and I'll hook you up.

The reason you're seeing a lot of C up there is that what I've had in my "forever old" Missouri archives* and received permission to republish. When I create code these days, I'm typically doing it in python (although not that fancy Qt stuff you're doing) or Objective-C, and I expect we'll have more up there shortly.

Most programs shared in the past couple of years have been more "here's the finished product" rather than source - your StarBase being one of the few exceptions.

(*) Ironic that I have the Missouri Archives when I now live in Seattle, WA.
 
My problem is I've never understood what you would use an ontology for (i.e. how you would use it).

And this is despite my specialisation in data modelling, and forays into controlled vocabularies such as SBR and corporate business glossaries.

Here's my take. I come from a background of managing scientific data, where we use semantics to pin down what the data describes, what sort of tools and processes were used to collect it and under what sort of context (geography, social, administrative and what have you).

Background

First, a bit of context, for those reading who are not up on the wonderful world of semantics. (People who know all this stuff can skip to Traveller, below.)t Sematic descriptions allow you to describe things (web pages, buildings, people) using controlled vocabularies in a way that's amenable to machine processing. The standard model is called resource description framework (RDF) where you can make lots of simple statements about something in a <subject> <verb> <object> form, for example:

AustralianParliamentHouse hasLocation Canberra.
AustralianParliamentHouse type Building.
AustralianParliamentHouse openedOn "1988-05-09".

AustralianParliamentHouse, Canberra, Building, type, hasLocation and openedOn are all described by URIs, such as http://www.aph.gov.au/id/building, http://data.ga.gov.au/id/2601, http://www.ordnancesurvey.co.uk/osw...ndPlaces/v1.1/BuildingsAndPlaces.owl#Building, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.loa-cnr.it/ontologies/DUL.owl#hasLocation or http://www.ordnancesurvey.co.uk/osw...ndPlaces/v1.1/BuildingsAndPlaces.owl#openedOn Although these are URLs, they don't necessarily represent something that you can look up in a web browser (although they should, see Linked Open Data below).

The point behind all this is that (a) you can describe pretty much anything, (b) you can be precise about what you are descibing (for example, hasLocation means what http://www.loa-cnr.it/ontologies/DUL.owl#hasLocation says it does, not what http://www.something.com/fred.owl#hasLocation says) (c) it's extensible because you can always add more and (d) and you have data in a form that can be loaded into a machine processor for use.

Ontologies

Ontologies tie all the vocabularies together by saying how the various bits of description fit together. For example, "if an animal has four legs, a trunk and is grey then it is an elephant". The result looks a lot like the sort of class hierarchies people are familiar with from object-oriented programming with some differences:

Being part of a class is non-restrictive (for the most part, an onology may say that if something is an elephant, then it is not a toaster). You can keep adding stuff.

Generally, an OO class is defined first and then the information about it is filled out (i.e. "an elephant must have four legs, a trunk and the colour grey). Ontologies can work in the other direction (i.e. "this has four legs, a trunk and the colour grey so it's an elephant).

Linked Open Data

The URLs that describe things don't have to resolve down to a web server that returns information on the URL. But it's now commonly accepted that they should in the sense that if I put http://data.ga.gov.au/id/2601 into a web browser, I should get back information about it and links to other things that help describe it. This way a person or a machine can always go and find out more. For example, if I wanted to refer to a metre, and used http://www.opengis.net/def/uom/OGC/1.0/metre then I could look it up and find out what it means.

As a really nice example, the UK Ordnance Survey has its data in this form at http://data.ordnancesurvey.co.uk

A note: This can generate a bit of a maze. "Semantic" is a bit of a misnomer since all semantic defintions do is refer to other semantic defintions. From the point of view of someone actually using the information to do something, the way the software handles it is what actually gives meaning to all the information. But, anyway.

Traveller

So why do this for Traveller?

My main thought is that it would provide a mechanism for tying the various resources that are available for traveller and making them importable and interoperable. The semantic approach gives a number of advantages:

  • It's interoperable in the sense that any common exchange format is (or could be ...).
  • It's extensible. Individual campaigns and groups can extend the base ontologies and add descriptive information without breaking things. (Software would need to simply pass on things not relevant to the particular application.)
  • It's linkable to resources available in the real world. Although I foresee some problems with mixing the real and the imaginary.
  • It's searchable. Repositories of resources, such as atlases, characters, ship plans and so on can be searched for things which meet certain criteria, even if they're not explicitly stated.
  • Library data and the like can be linked in a way amenable to software as well as humans.

The downside is what is shown in this post. I've just spent ages explaining semantics in the abstract and have a tiny bit at the end about how this would be useful for Traveller. Semantic forms are difficult to manage and need good software to help ease users over what is otherwise an incomprehensible tangle of gibberish.

Hope this answers your question.
 
A Traveller 3d Party Publisher was, a few years ago, musing over a "re-visioning" of the Traveller Universe. He suggested the first step was to nail down the Facts that Defined the Setting (Keep that, and re-do everything else). This is the closest I've come to what I think of as an ontology for Traveller... a "specification" for the game concepts. Example: jump takes one week.

I was thinking along more basic lines:

A character has 6 characteristics labelled C1-C6. A character has a sophont template that, by default, lists these senses. C1 is used for these purposes, C2 for these, ...

A ship has a displacement, a power plant, ...

My underlying aim (as elaborated in the big screed above) was to make things like ship classes and descriptions or NPCs readily locatable and importable into settings.
 
Perfect, thank you.

Given the above, Traveller has a number of ready-made vocabulary structures:
- UPP (plus skill list)
- UWP
- HG USP (and associated ship description)
- MT ship description (works for vehicles too)

On top of this, I think you'll find something like _Heaven and Earth_ (or _World Builder_?) has a complete structure for a star system.

Can anyone think of any more?

BTW, I'm currently grappling with a Resource Discovery (i.e. library card catalogue) database for all the Traveller magazine articles. I think I now have the structure correct (it's based off Dublin Core plus AGLS) and am working on the input forms and output reports. The thing that's going to take the time is typing in all that data, although I'm hoping I can cheat here and there (like grab the TOCs from the Trav Bibliography site).

(A Traveller player in Bungendore? Seriously?! In the new development, presumably? Where were you when I was in Canberra? ;-)
 
Can anyone think of any more?

The QREBS system in T5 is one that looks fairly obvious. Incidentally, QREBS should probably be extended with Uniqueness (similar but parallel to the fame score) and Aesthetics (Flux) attributes.

(A Traveller player in Bungendore? Seriously?! In the new development, presumably? Where were you when I was in Canberra? ;-)

Actually in the older part of town. I've been there for 16 years or so but I've been mostly engaged in the rearing of offspring, fighting fires, finishing off the family PhDs and other time-wasting rubbish. My kids are of an age where a little light refereeing seems to be in order.
 
Enjoying those nice frosty -4 degress, I guess? Your maximums have been our minimums. Although I confess to being surprised - Brisbane occasionally gets cold! (Well, cold enough for a jumper or light coat, anyway - it reminds me of Doug Berry's stories of tourists on 'Frisco's cable cars...)
 
Simon -

If you want to bind it into makhidkuran, you're very welcome to do so. PM me your github account, and I'll hook you up.

On github I'm: simon-hibbs

Is there a standard way in github I can link from Starbase to Makhidkarun, like an "If you like this, you might also like..." link?

One thing I'd like to do is modify the world generation rules scripts so that if they are run as standalone scripts they produce an output file. That way the same script can be used either as a StarBase rules file, or just to produce text or perhaps HTML output. That might make them more generally useful and interesting.

The reason you're seeing a lot of C up there is that what I've had in my "forever old" Missouri archives* and received permission to republish. When I create code these days, I'm typically doing it in python (although not that fancy Qt stuff you're doing) or Objective-C, and I expect we'll have more up there shortly.

The world generation scripts don't import anything from Qt so I should be able to make them independently usable with just a standard Python install. If I build them as windows binaries using Py2exe as I do with StarBase, you won't even need that.

I'll see what I can do this afternoon. Work is a bit slack as I'm counting down to leaving this job in a few weeks.

Most programs shared in the past couple of years have been more "here's the finished product" rather than source - your StarBase being one of the few exceptions.

Yep, having the source shared from github, but the windows executable currently just shared from my dropbox isn't ideal. I've seen several projects that use github to share the source, but google code to share the pre-built executable. That's pretty kludgy though. I'd like to have a fourum for it as well, maybe on Yahoogroups, but then things would be even more fragmented.

What I really need is a single home page for StarBase that acts as a hub for the project, to tie things together.

Simon Hibbs
 
Last edited:
Is there a standard way in github I can link from Starbase to Makhidkarun, like an "If you like this, you might also like..." link?

Not that I know of, sorry...

One thing I'd like to do is modify the world generation rules scripts so that if they are run as standalone scripts they produce an output file. That way the same script can be used either as a StarBase rules file, or just to produce text or perhaps HTML output. That might make them more generally useful and interesting.

Cool!

The world generation scripts don't import anything from Qt so I should be able to make them independently usable with just a standard Python install. If I build them as windows binaries using Py2exe as I do with StarBase, you won't even need that.

I'll see what I can do this afternoon. Work is a bit slack as I'm counting down to leaving this job in a few weeks.

Heh - no rush. I've been meaning to start on something similar for a while, read through your code, and decided to take a start at making some simple libraries for traveller, specifically the T5 rulesets, so I'm starting up a little python library at https://github.com/makhidkarun/t5 that I'm aiming to use within a little web app for showing trade information.

BTW: I've added you as an "owner" to the organization makhidkarun, so you can create new repositories under there and add in as you like. If you're interested in collaborating in the t5 libraries as I get them further alone, that'd be awesome too.

For documentation, I'd recommend taking a look at ReadTheDocs as a possible option. There's also the possibility of using GitHub Pages - which makes for very simple, statically defined documents (often in Markdown) that github does the hosting for free for you.
 
Rules of engagement

I'm more interested in this than I should be, so here goes.

To begin with, my interest in a Traveller ontology was driven by my own interest in tools for running a campaign and access to stuff that has already been developed. I'm naturally interested in exchange formats so that data can be made available online and transferred between software packages. Plus a certain level of "if I wanted to develop software for Traveller, this is how I would do it."

So, to make this worthwhile, I'm interested in developing an RDF-based exchange format that can be used to:

  • Store information online in a form that can be readily imported into semi-existing software (by which I mean software extended to read the data).
  • Export/import data between software
  • Generate human-orientated representations of the data
  • Allow user- and campaign-based extensions.

Obviously, the best use of all this would be for people to naturally want to use what's been developed for their own purposes. To do this, I'd like to take a consensus-based approach, with input from users such as heckj, simonh, robject and Hyphen, if they're interested (although not restricted to them alone). With several iterations of the following:

  • A broad discussion on the approach to a particular area (for example, how something like a class of ships might be handled)
  • A search for the current state-of-the-art, if necessary. In a lot of cases, this just means pulling stuff out of the T5 core rules. However, where there's existing software it makes sense to look at how it models things.
  • The development and documentation of a trial ontology for that area. This would be put into the makhidkarun github repository.
  • A comment period, say a month, so that people can look at it and see whether they like it.
  • The development and documentation of an updated ontology.
  • Wash, rinse, repeat. Until there's a general consensus that things are about right. TODO If a consensus can't be reached, then there needs to be some way of resolving things. I would think that, broadly, if you contribute, you get a vote as to whether something works or whether it needs to be scrapped; no glorious leaders.

This model is loosely based on the procedures of the Open Geospatial Consortium
fine producers of massive, incomprehensible standards.

My suggestion is that this thread gets used as the forum for these discussions. I'll kick off by doing a post about some of the higher-level considerations in the near future.

The other issue that I need to address is that I'm essentially strip-mining the T5 rules. Ethically, let alone legally, I should get the blessing of Grandfather.

Comments? Complaints? Issues?
 
Open data interchange formats are a Good Thing, so I'm definitely interested.

For Starbase I've tried to make it as easy as possible to access the data in other tools. Hence the world data is stored in a CSV file that can be opened directly in a spreadsheet, custom world attribute descriptions are just text files, world data reports can be cut-and-pasted directly into a word processor, maps can be saved as PNG files and the standard document export format is PDF. You can essentially take a StarBase project without the application and get at all of the data in it without needing any special tools.

However I have not yet seriously addressed data interchange with other applications. I have written a SEC file importer script for StarBase and do intend to integrate it into the UI at some point, and I should really do a SEC file export filter as well.

So that's the current, or legacy situation. The SEC file format isn't going anywhere, but it has serious limitations. We could really do with something better and at this point an extended SEC format with embedded XML elements looks like a practical approach (though I'm not a great fan of XML).

I'm not familiar with RDF though, other than 'drive by' encounters with it on forums and web sites. What would a world description look like in RDF? My understanding is that RDF is not itself a file format, but that it is a meta-format and the actual data gets serialised in XML or Notation3 (which to my eyes looks a bit like JSON if you squint a little). As a lowly coder I understand the advantages of XML and JSON and know how to handle those, but I'd have no idea what to do with RDF. I suppose it's a kind of super-DTD that describes what the encoded elements mean?

Simon Hibbs
 
What would a world description look like in RDF?

Here goes:

#
@prefix dcterms: <http://purl.org/dc/terms/>
@prefix t5: <http://data.travellerrpg.com/ontolgies/t5.owl#> .
@prefix t5w: <http://data.travellerrpg.com/ontolgies/t5world.owl#> .

# Note that the URIs are just things I've made up. What the URI scheme is
# and how it can be used for traveller generally and specific campaigns needs
# to be the subject of ... some discussion
<http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/regina>
# Basic stuff
rdf:type t5:World;
rdf:type t5w:AgriculturalWorld; # Also implies t5:World, but anyway
dcterms:title "Regina"; # Use Dublin Core terms to make this generally findable
t5:UPP "A788899-C"; # Note this can be derived from other stuff
# See below for system information
t5w:system <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina>;
t5w:parent <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/assiniboia>;
t5w:orbit 4^^xsd:int;
# References linked open data descriptions of these things
t5w:starport <http://data.travellerrpg.com/id/world/starport/class-a>;
t5w:diameter <http://data.travellerrpg.com/id/world/diameter/7000mi>;
t5w:atmosphere <http://data.travellerrpg.com/id/world/almosphere/dense>
# And more and more ...
...
# Descriptive info
t5:description "Homeworld of Archduke Norris ...";
t5:history <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/regina/description/history>;
# Campaign-specific stuff, added by a user
t5:campaignSetting <http://www.charvolant.org/traveller/DougsCampaign>
<http://www.charvolant.org/traveller/DougsCampaign#location> <http://www.charvolant.org/traveller/DougsCampaign/Vellia>.

# System information
<http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/regina>
rdf:type t5w:StarSystem;
dcterms:title "Regina";
t5w:subsector <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina>;
t5w:primary <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/star/lusor>;
t5w:companion <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/star/speck>;
t5w:farCompanion <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/star/darria>;
t5w:gasGiant <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/assiniboia>;
...

<http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/star/lusor>
rdf:type t5w:Star;
dcterms:title "Lusor";
t5w:system <http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina>;
t5w:spectralClass <http://data.travellerrpg.com/id/star/spectral/F7-V>;
t5w:habitableZone 3^^xsd:int;
t5w:habitableZone 4^^xsd:int;
...

# Some linked data.
<http://data.travellerrpg.com/id/star/spectral/F7-V>
rdf:type t5w:SpectralClass;
dcterms:title "F7-V";
# Actual links to real astronomical information. This doesn't make much sense at the moment and needs thought but is there for illustration
rdfs:subClassOf <http://eurovotech.org/objects-structure.owl#SpectralClassF>;
rdfs:subClassOf <http://eurovotech.org/objects-structure.owl#LuminosityClassV>;
# More information
dcterms:references <https://en.wikipedia.org/wiki/Spectral_class#Class_F>;
dcterms:references <https://en.wikipedia.org/wiki/Stellar_luminosity>.

# Metadata about the data
# Putting dc:creator into the spectral classifcation means you're talking about the originator of the idea, not the person who wrote it down.
<http://data.travellerrpg.com/id/star/spectral/F7-V.rdf>
dc:creator "Doug Palmer";
dc:created "2013-05-21T10:10:10+10:00"^^xsd:dateTime;


That was a bit long but I wanted to give an idea of how things related and how you could introduce external information and personal add-ons.

My understanding is that RDF is not itself a file format, but that it is a meta-format and the actual data gets serialised in XML or Notation3 (which to my eyes looks a bit like JSON if you squint a little). As a lowly coder I understand the advantages of XML and JSON and know how to handle those, but I'd have no idea what to do with RDF. I suppose it's a kind of super-DTD that describes what the encoded elements mean?

My take is that things represented by RDF represent a giant (but partial) deductive database. The database part means that what's stored is a graph of relationships between things (similar to an OO object graph). The deductive part means that a reasoner can run across the graph and, with the aid of an ontology, deduce stuff about what's been gathered. The ontology describes what the encoded elements mean and how they relate to each other. The XML, N3, JSN3 (a JSONy version) are all exchange formats for shipping the data between databases.

The database may be some temporary, in-memory thing run by a referee that just gathered stuff off the web and which runs on the referee's PC for the duration of a playing session but I find it helps to think of it as a database.
 
Last edited by a moderator:
First Steps

Here's a few thoughts for how to structure things:

Classes

I'm inclined to use owl classes for only the most structural things: characters, worlds, equipment and so on. It would be possible to classify things such as agricultural worlds and so on by classes but I'm included to treat them more as instances of a concept hierarchy.

Oh yuk, that sounded too postmodern for comfort. I'll give a concrete example.

It's possible to include an owl class that describes an agricultural world: Atmosphere 4-9, Hydrographics 4-8, Population 5-7. At that point, a reasoner would classify anything that was an agricultural world with that class, even though it's not explicitly stated. In this case, a world description would have something along the lines of

Code:
<http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/regina> a <http://data.travellerrpg.com/ontolgies/t5world.owl#AgriculturalWorld>

An alternative model is to have a set of resources (URLs) that are classifiers. They can then be added to a world description along the lines of

Code:
<http://data.travellerrpg.com/atlas/sector/spinward/subsector/regina/system/regina/world/regina> <http://data.travellerrpg.com/ontolgies/t5world.owl#worldClassifier> <http://data.travellerrpg.com/id/world/classfier/agricultural>

This alternative model is how SKOS http://www.w3.org/2004/02/skos/ works, which is designed for things like taxonomies, thesaurii and the like. It's downside is that you don't get direct access to the reasoning available from using classes. However, it's readily extensible and allows referees to decide to ignore the letter of the rules.

Templates

The other possible use of classes is to do things like give a race to a character or a class to a ship. So you would end up with something like

Code:
<http://www.charavolant.org/traveller/player/Doug/characrer/Fred> a <http://data.travellerrpg.com/ontolgies/t5character.owl#Human>

or

Code:
<http://www.charvolant.org/traveller/ship/ClearAirTurbulence> a <http://data.travellerrpg.com/ontolgies/t5ship.owl#Scout>

I'm really not keen on this approach, because it tends to over-specify things. Eg. Humans have four limbs, except for Shorty over there who got his legs blown off in the war. Similarly, a long-lived ship will undergo numerous changes and may not fit the definition of, say, a Scout any more.

However, there needs to be some way of saying "this X is a Y" to which I want to add "except for the bits I say are different". To do this, I propose templates: descriptions of things that can be describe the general case, which can be overridden by an actual instance. Eg. Fred, above, is a copy of the standard human template, expressed as something like:

Code:
<http://www.charvolant.org/traveller/player/Doug/characrer/Fred> a <http://data.travellerrpg.com/ontolgies/t5.owl#sophontTemplate> <http://data.travellerrpg.com/sophont/Human>.

Deducable Stuff

Things like UPPs are constructs built from more basic information. They're for display, rather than information. I'd like to leave these things out, in the expectation that a half-way decent piece of software can build them on the fly.

URIs

Still working on this. The general pattern I want to follow is something like:

http://data.travellerrpg.com/<type>/<id>/<type>/<id> and so on, so type might be something like "sophont" and id might be something like "Human". A sequence of type/id pairs indicates some sort of containment (eg. sector - subsector - system - world).

I'm using http://data.travellerrpg.com as an example, but it should be obvious that I expect to set up something, somewhere that will actually deliver data on request.

Some things are not really namable in URIs. For example, there may be multiple characters called Fred floating about the place. A source of unique IDs that can be used to identify a specific Fred will be needed.

Individual campaigns need their own URIs. For purely local stuff, stored on a referee's computer, they could be the "other" URI, the URN, with a structure like: urn:x-traveller:character:Fred but it would be helpful to set up some sort of way of allowing campaigns to set up their own information sources.

Ontology Structure

Ontologies import one another in a horribly tentacular way. There's no good reason for not modularising the ontology and general good practice makes an ontology inherit from an "upper ontology" that describes the more abstract parts of what's going on.

What I have in mind is something like:

Code:
                       v-- Worlds  <-----\
RPG <-- Traveller <-- Characters  <- Campaign
                       ^-- Robots <-----/
                       ^-- ...etc ...

So the top onotology just encodes things common to RPGs: the concept of a character (and an NPC), an attribute, a player, a games master, etc.

The Traveller ontology describes the top-level concepts of Traveller: chatacters, worlds, etc. and some specialisation of the RPG ontolgy (eg. the preferred term for a games master is "referee"). I don't know if this is possible, but the idea of this ontology is to describe the relationships between things and leave the detail to:

The Worlds, Characters, etc. ontologies describe those things in detail.

A campaign ontology is a home-brew ontology that describes anything that some bright spark wants to add.

Questions, Comments, Complaints?

Have at it!

Once this is relatively stable, I'll start documenting things.
 
Back
Top