Creating and Managing Characters

Posted by Chris Rosser on Sun 08 June 2014
Hello! This site is archived and no longer maintained. For Chris' main site go to

Characters are fundamental to our stories and our world so naturally I want to manage them within the world-building application. Conveniently, I've already started to model my characters as part of the tools I created to add new stories to the world.

So far, when I create a story, the tool prompts me to enter some pertinent information about the protagonist and the antagonist; the principle character around which the central conflict of the story takes place. That information is story-centric; it's about what motivates the character in the story and how they change as a result of its events.

That's great for writing the basis of character-driven fiction (something our editors and critics say we are supposed to be doing). However, there's also a tonne of other information we need to develop and manage to flesh out our characters, namely descriptions of their looks, temperament and their biographies. This information isn't story specific (although I will admit the events in the story can change and influence these details); it's character specific so I wan't to separate that kind of information and keep it with the world.

To me this makes sense because it reduces repetition. The character's world file can be re-used across multiple stories, say for example a trilogy, and any changes that occur to a character as a result of one story can be captured and referenced later when needed. For authors writing multi-volume epics spanning considerable periods of time and space, tracking every change and event that effects a characters reduces the likelihood of continuity errors, something the plagues even some of the biggest names in fantasy fiction. There's no disrespect intended here, by the way, Raymond E. Feist is one of my favourite authors. I just want to highlight that even seasoned authors with professional editors at their disposal make these kinds of errors.

So what exactly do I want to capture?

As noted, against each character's index I record the following story-centric information:

  • The character's epiphany
  • The character's motivation
  • Their alignment to the protagonist or the antagonist

I also want to record the following in the character's world file:

  • Biography
  • Physical characteristics
  • Mental characteristics

This information is a staple of fiction writing and related endeavours like table-top gaming. What a writer chooses to record against each element is a matter of personal preference; we can be as detailed as we want, we can tier information based on how important or minor a character is and we can tailor information to suit genre. I'll talk about how I'll implement it in the system but first I'll address each element in turn.

Biography: This is where we'll write a narrative about our character's life with much or as little detail as we want. For my part, I generally like to follow the structure set out by what you typically find in an encyclopaedia i.e. summarising the important stages of a character's life starting with their early life and childhood. Read a biographic article on Wikipedia and you'll get the idea.

Physical characteristics: This is where we record our character's physical appearance such as their height, build, hair colour and style, eye colour etc etc. Again we can be as detailed as we want. This information is more tabular or quantitative that the narrative content of the character's biography.

Mental characteristics: This is where we record our character's inner qualities such as their emotions, motivations, communication skills. Again this information is more suited to a quantitative format rather than the narrative format I'll adopt for the biography.

At some point, I may include other information such as matrix of the character's relationships with other characters, places and organisations. This will likely be a separate file.

Character Template

As with most elements of the application, I will rely on templates and characters are no exception. At time of writing, I have a character template sitting inside the application's _tools/template folder. This folder contains the file; which doesn't have much in it yet apart from the dynamic title.

This folder gets duplicated when a new character is created by either the create_story tool (which creates our story's protagonist and antagonist) and the create_character tool (which creates a new character in the world). The character template is copied into the characters folders and renamed to the character's slug.

NOTE: All character related functions now sit in the inc/characters.php file so they can be shared between multiple tools. This little bit of code refactoring goes a long way to reduce clutter and duplication.

Because the folder is copied and renamed, it's trivial to add more files to our template and they'll be carried across each time we create a new character. That means we're going to create two new files physical.json and psychology.json but first I'm going to expand the rather bland file.

Character Biography

At present this file looks like this:

# { character name } #

## Biography ##

NOTE**: { character name } is a twig-inspired variable which I use as a marker for a simple find and replace function as a precursor to using actual twig templates when I refactor the code into a proper application.

So far it makes for a pretty boring template so I want to add a bit more structure like this:

# {character name } Biography #

## Summary ##

{ character name } is/was...

### Early Life and Childhood ###

{ character name } was born in *character's birth date* in *character's birth location* to *character's parents*.

### Significant Event / Stage of Life ###

layout: postWrite about a significant event of stage of the character's life here.

### Significant Event / Stage of Life ###

layout: postWrite about a significant event of stage of the character's life here.

### Significant Event / Stage of Life ###
layout: postWrite about a significant event of stage of the character's life here.

Physical Characteristics

Our first new file is physical.json (I may change the name later) which is where I'll record my character's physical appearance. Note the change of file extension from markdown (md) to json; this is because we're dealing with more traditional key-value paired data rather than something as fluid as a narrative summary of our character's life.

While it would be possible to record this data in markdown as a table, tables are one of elements where markdown really struggles. MultiMarkdown and Pandoc's Markdown dialect go a considerable way to overcome this limitation but it's still not great. Besides, having this data in a format that's easy to parse into an array or object for reuse will be useful as the application evolves.

    "name": "The character's name",
    "description": "A one paragraph description of the character's physical appearance",
    "image":"filename of your character's image",
    "father": "",
    "mother": "",
    "date-of-birth": "",
    "place-of-birth": "",
    "age": "",
    "height": "The character's height",
    "weight": "The character's weight",
    "build": "The character's build",
    "complexion": "The character's complexion",
    "marks": "Distinguishing marks and features",
    "state-of-health": "",

Most of this should be self-explanatory.

Mental Characteristics

The next new file is psychology.json which I'll use to store information about the character's mental and emotional characteristics. This will be a json file, as with physical.json, again to take advantage of the ease of which we can parse data directly into PHP.


    "name": "The character's name",
    "character-flaw": "",
    "self-perception": "",
    "outlook": "is the character an optimist or pessimist",
    "extrovert-introvert": "",
    "intelligence": "",
    "religion": "",
    "religiosity": "",
    "darkest-secret": "",
    "biggest-regret": "",
    "greatest-achievement": "",
    "biggest-failure": "",


Editing these files

I could write a command line tool that guides my through the process of adding text to these files. This would make sense to avoid errors to the json syntax, however the process of going through each question would be tedious. Instead I'd rather edit them by hand using my text editor of choice. That said, it might make sense to prompt for information where it relates to other stored information. For example, the character's place of birth and their parents.

What's Next

I fully expect character management to evolve with the application, particularly as I start to link it to other information like locations and organisations.

Next I plan to start developing the locations module, this will be the largest module in the application and so I will develop it in stages. Not only do I want to store information about realms, cities, towns and villages, but I want to be able to generate a lot of the statistical information according to predefined rules based on historical models.

Wow you read this far! This site is archived and no longer maintained. For Chris' main site go to