The Best of Both Worlds: making hypertext for both Tinderbox and Storyspace

Tinderbox and Storyspace are different, and serve completely different purposes. Although they share a common file format, as we have seen in my documents containing Ovid’s Metamorphoses Book 1, creating a document in one doesn’t mean that it is necessarily that usable in the other. This article rises to the challenge of creating a single document – with just one copy of the content – which delivers parallel text to both Storyspace and Tinderbox 7 users.

My starting point was the last two versions of this document, one using included text to work well in Storyspace, the other using new Composite notes to work well in Tinderbox.

From those, I wanted to produce one document which would use just one copy of the text and pictures, but offer the reader a choice as to how they are presented. Initially I wondered if it would be possible to determine which app the document was running, but there doesn’t seem to be an accessible attribute for that. In any case, I am strongly in favour of user choice, so would prefer to give the user control over how the text and pictures are presented to them.

My intention is to provide two modes of progression from the title page: one to take Storyspace users through to the chain of included text writing spaces, the other to take Tinderbox users through to the nested chain of Composite notes.

I opened the latter in Tinderbox 7, created a note which was to become the container for the Composite notes, and moved them into that. I then created another note to contain the Storyspace writing spaces, selected those in the Storyspace version of the document, copied and pasted them into their container.


The result is much neater, with all the structured notes tucked away inside their two containers. I also added a note to act as a toggle, to control a user attribute in the me note, $ShowIncludes. When true, this would direct the reader through the Storyspace writing spaces relying on included text; when false, the user would enter the container named tinderbox and be offered the Composite notes there.


Inside the storyspace container, the layout of writing spaces is identical to that in the Storyspace-only version. Each includes text from the individual notes in the Composites within the tinderbox container. That required me to edit the references for these writing spaces to use their new paths, which was a surprisingly quick and simple task.

At the top are the hide/show buttons for the English and Latin versions of the text, which only make sense here, for Storyspace users.


Inside the tinderbox container, everything looks the same as it had been in the Tinderbox-only version. Thankfully when you move notes like this, all the links are properly updated, so there was nothing to be changed in here.


The painting Gallery remained the same, with its text links from and to Composite notes. The problem here is that the return link from each painting goes back to the Composite note in the tinderbox container. I had originally hoped that I would be able to place a condition on that, using the $ShowIncludes attribute of the me note. That would have disabled the link back to the Tinderbox version when the reader was in Storyspace mode.

When working with links, I have edited the document in Storyspace, which contains more extensive support for link surgery such as guards, and where the function of those links is also more critical.

The best solution for the return links from paintings was thus to provide two text links, one to the referring note for those following the Composite path in Tinderbox, the other to the referring writing space for those following the included text in Storyspace. This has built-in forgiveness: if a reader clicks on the wrong link, they can immediately return to the painting and use the correct one.


While the document was open in Storyspace, I took the opportunity of checking all the links. This showed that, almost certainly the result of operator error, I had doubled up many of the default links taking the reader through the Storyspace version, so I deleted those duplicates.


I also had to set up the most important links of all, the Sharks guarded on the value of the $ShowIncludes attribute leading on from the title. Unfortunately both lead to a writing space / note named Invocation, although those are in different containers. Adding the guard in Storyspace was straightforward.


Where link destinations have the same name, it is simplest to add and guard the links one at a time.

At the end of this process, the document worked as expected whether opened in Storyspace or Tinderbox, according to the setting of the $ShowIncludes attribute chosen by the user. However, my Storyspace options for showing Latin and English text were not working correctly, with the English text always appearing no matter what the setting.


It transpired that, somewhere in the process of combining the content from the two documents, the prototype for the parallel text writing spaces had gained an OnVisit action which kept changing this setting. This highlights the importance, when working with content from different documents, of checking these hidden details. As soon as I had corrected that prototype, the reader’s choice functioned properly again.

The overall size of the document has increased only very slightly. It seems to work well in Storyspace and Storyspace Reader 3.3, and Tinderbox 7.0.1, and it is here for you to download and try for yourself: Ovid Metamorphoses Book 1 for Tinderbox and Storyspace

Having worked with it for some hours now, I can see that the whole is greater than the sum of its parts. For users with both apps, they can add notes and commentary to the Tinderbox Composite notes, for example when studying the text. Opening it in Storyspace still allows them the benefit of uncluttered parallel text which they can configure as they wish. I think the end result is well worth the slight greater effort.