Tumble is an implementation of the Tumblr parser/compiler/renderer, with keyword substitutions suitable to my needs on my story website. The idea is that the database side will produce an object consisting of the title of a series block:Series Must be found within a block:toc It must contain the special tag {titles} as a child tag. This will be rendered if this is a series page. block:Subseries Must be found within a block:toc It must contain the special tag {titles} as a child tag. This will be rendered for any subseries of the main series. This will recurse to a maximum depth of four. Users can use clever CSS to make this look awesome. There may be settings in the database that prevent subseries recursion deliberately. block:Story Has two meanings, based on context. If it is found in the *document* (i.e. *not* within a , it is treated at a story block, and will only be rendered if this is a story page. If it is found in a *series* or *subseries* block, it's contents are rendered during the rendering of a series or subseries for each story found. block:Next Valid only in a block:story Will render if there is a "next" story in the parent series. block:Prev Valid only in a block:story Will render if there is a "previous" story in the parent series. block:Title Will render if there is a title in the current context block:Blurb Will render if there is a blurb. block:Excerpt Will render if there is an excerpt Variables: Title The title in the current context. Body The body of the story. Only available in top-level block:story. SeriesTitle The title of the series in the current context. MainSeriesTitle The title of the top-level series for the current page. AuthorsName Blurb Valid in a series or series/story Excerpt Valid in a series or series/story URL Context-sensitive. In a Story, refers to the URL used to access that story. In a Next or Prev, refers to the URL of the next or previous story, respectively. SeriesURL MainSeriesURL AuthorsURL # {block:Series}{URL}{Title}{Contents}{/block:Series} # > Handle these first {block:IfSeries} {Title} {Description} {block:TableOfContents} {block:Story}{URL}{Title}{/block:Story} {/block:TableOfContents} {/block:IfSeries} The important trick here is that the TableOfContents will be recursed wherever the {Contents} block is seen, up to a maximum depth of four. {block:IfStory} {Title} {Body} {block:Next}{URL}{Title}{/block:Next} {block:Prev}{URL}{Title}{/block:Prev} {Pubdate} {block:IfLicense}{License}{/block:IfLicense} {Copyright} {block:/IfStory}