Tinderbox Forum

Course Planning Example (Video)

I’ve put together two videos showing how I use Tinderbox in my course planning. One video looks at my starter file, which I’ve saved as a favorite for repeated use in order to standardize data import. The other looks at this semester’s file after an OPML import and three days of work.


An important point: these videos are not instructional “how to” clips. Instead, they are a couple of brief tours of some of the ways I go about my business that demonstrate some useful tools in the app.


Commended, I was lucky to see a preview earlier and the videos (the linked page has two) should provide others here with ideas. The are lots of features of the app being used which are useful in all sorts of other contexts of work.

@bcrane Thanks for sharing this!

1 Like

Dear Brian, (if I may)
Thanks so much for these two videos! They are fantastic tools in getting my head around what Tinderbox can do as a course planning and management vehicle. I’ve also seen some of your other posts in this vein on this forum.

I saw on your website that you’d designed some grading rubrics, tracking attendance, and areas for recording in-class presentations.

These are all very pertinent to my own concerns. So thanks very much for opening my eyes to what I could also be doing. Indeed, I’d like to see more of this kind of process in depth.

I’m teaching a literature course next semester online for the first time. Although I’ve taught iterations of this course before, the management seems to be far more complex as we move online.

Would you mind sharing some of your other management tips and tricks? How did the making of rubrics go? It seemed challenging to set up. A video would be fantastic, but I realize time runs short for all of us, and really, any guidance beyond what you’ve already offered would be much appreciated.



I’m really glad the videos were helpful!

RE: rubrics, I don’t use those that are shown on the site anymore. When I built them, I was looking for a way to make digital commenting easy enough that I could keep a record of my comments for later in the term. For some reason though, I based the whole thing on a rubric system I didn’t use or feel comfortable with. So when I was done, I had an elaborate machine doing something other than what I needed.

However, I’m experimenting with a much simpler, non-rubric style comment system for the coming term. I think it’d be pretty easy to show what it looks like, so I’ll try to share a video of the idea soon.

RE: Attendance, I hate taking attendance but, for funding reasons, have to keep detailed record for the first third or so of each term. I do this with a pretty straight forward stamp that I’ll share in a post after this one.

And finally, good luck with your move online. Here it feels a bit like every prep task I touch balloons to twice its normal size before breaking apart into a half-dozen sub-tasks each ready to balloon in turn. So getting things ready has been daunting.

1 Like

For attendance records, I need the dates a student is absent and a tally of their missed classes. To do this, I turn on checkboxes in the outline view of my Students container and each day check off the students who are absent. I then select all notes in the container and apply my stamp.

The stamp is a straightforward if() statement:


The list of actions inside the curly brackets:

  • Add 1 to the absence tally
  • Add today’s date to a holding attribute
  • Add the date in the holding attribute to the end of a list of dates
  • Clear the check marks

The Action Code I use for this is:

$AbsenceDates=$AbsenceDates+$AbsenceTodayString.format(MM D);

$AbsenceTally is a number attribute; $AbsenceTodayString is a date attribute; $AbsenceDates is a set. The .format() sets the dates to read as Month name plus two-digit day.

For the first part of the semester I keep the $AbsenceTally and $AbsenceDates attributes in the key attributes of the student prototype so I can see them easily. Once I have filed the required attendance reports though, I remove them from the key attributes.

So the stamp as whole reads:

if($Checked==true){$AbsenceTally=$AbsenceTally+1;$AbsenceTodayString="today";$AbsenceDates=$AbsenceDates+$AbsenceTodayString.format(MM D);$Checked=;}

1 Like

Thank you! This is very helpful. I too have to do this kind of record keeping for attendance, so it’s a boon to have a system to actually do it properly.

And yes, I understand that you can put a lot of energy into building a rubric and then find out that it doesn’t really benefit the students very much. We’ve been slowly moving in the direction of rubrics and greater formality in grading as a university.

Good luck preparing for the fall.I don’t want to put any more pressure on you to produce further videos. I’m envisioning that you also have too much to do for your classes and too little time. But this gives me a good place to start from.

I’d initially envisioned Tinderbox as a place to design courses, but now it seems like a very good place to manage them as well.

So I set up my system for giving feedback over the weekend. I recorded myself as I did and when I was done cut things down as much as I could. The result is two videos that kind of invite you to watch over my shoulder as I do actual work. By the end of the sequence I have the form and export template I’m planning to use this term.

The first video involves me figuring out the attributes I need, populating suggested values, and setting up the prototype to create individual feedback forms. So some basic stuff.

In the second, I set up an export template, which involves creating some new attributes with tricky suggested values. A moment of high drama arrives when I have to troubleshoot some stamps.

The link to the videos is:


1 Like

A wonderful pair of videos again, nicely showing emergent formalisation. To me the video has all the more impact for not just being a walk through the final form but rather the (mis-(steps) en route. It was really useful to hear you talk through your thought process about the (user) attributes you needed and how their choice was affected by the outcomes that needed to rest on that info.

In projects, I find the “one attribute or several?” question pop-up quite often, requiring the above process of thinking which best supports the end goal. Of course Tinderbox is very flexible and you can easily do over if you get it wrong. But, with repetition and practice I find I’m getting better with my first choice being right.

Reminded by currently using a large research doc I originally made 2+ years ago, I’ll give a shout out for adding info in the User attribute Description boxes. The temptation is to just say what they do - but in most cases thoughtful naming with make that self-evident. As important to capture for the long term is the ‘why’, which is often to hold a particular strand or sub-strand of information as metadata for use in analysis at the end. The latter can be harder to remember when returning to the document. The Descriptions are also useful for stub documents, i.e. multi-re-use, of for demos where the document is completely new to the user.

Thanks for these videos. :slight_smile:


Should you need to use those area strength weaknesses stripped of their sort values, e.g. in some report, here’s a stamp with code you could adapt to use in a larger bit of code:

$MyString=$gAreaStrength.at(0).replace("^\w+\. ","");

The .at(0) just uses the first value of the target Set attribute - if you wanted them all you’d need to iterate the list of value using a n .each(){} operator and concatenate the extracted terms. The replace regex is a balance of flexibiliy vs. sufficient precision. Starting from the start of the string it matches one of more word values (you could use [0-9A-Za-Z] if you prefer, then a literal period character (i. a full stop) and a single space. that bit gets deleted. Thus “1b. Comprehension” becomes “Comprehension”. If you run this on an each loop and concatenate the source values will still retain their starting order.

So in the video… you would have used this in the template

<p>Assignment Name: ^value(gAssignmentName.replace("^\w+\. ",""))^</p>

Note how ^value()^ can contain an action code expression—in this case reading an attribute’s value and performing chained operations on in. I’ve left out the .at(0) from above as it is clear that although $gAssignmentName is a Set-type (i.e. list-based) it is only holding a single value.

1 Like

Thanks again! This was very helpful. I like the way you’ve shown us the use of controlled vocabulary (very helpful for grading!). It’s certainly good to self-document things, I find that I forget my own intentions over the course of days, and one would ideally like to re-use materials like this. I think I can see quite easily now how you might go from this stage to setting up multiple assignments, rubrics and final grades. Thank you!

The Display Expression conundrum solved… The issue is regardless of whether you precompile the expression to a string (i.e. here, the value of $MyString) or not, in code like a stamp you have to remember that $DisplayExpression is an Action-type attribute i.e. a String that holds one or more complete action expression(s). IOW:


Unwittingly, in both cases, you were doing this:


…and Tinderbox was getting confused. So the correct solutions were:

$DisplayExpression='$LastName+", "+$PreferredName';

Note we need two different quote types here. We use single quotes as the overall string enquoting method as the code within uses double quotes. Or, and better (why—see below):

$MyString=$LastName+", "+$PreferredName;

Note in line two the quotes. This is saying make the value of $DisplayExpression the literal text ‘$MyString’ and not the value of that string. The actual value of the $MyString attribute is then read when the Display Expression is used. It’s simpler that all that text makes it sound, once you get the principle.

Why might the second form be better? As the number of students grow, so to the number of Display Expressions being evaluated on the fly. The the combo of the number of notes and the complexity of the Display Expression can slow things down. Unlikely in this instance, but a point to bear in mind if planning to use Display Expressions at scale (e.g. via prototypes). In the second method the Display Expression simple reads a string, no on-the-fly calculation is needed.

Edit: a tip when debugging Display Expression or Hover Expression code set via an action. Look at the code box on the relevant Inspector. If the code looks wrong you’ve probably hit some variant of the above mistake.

1 Like

With templates, it is a good idea to start the template in the /Templates/ container or manually set the ‘HTML Template’ prototype before adding any text. Why? The prototype optimises the note against normal affordances for text entry that work against you when writing HTML code (or other code), e.g. turning straight quotes to curly quotes, auto-detecting URLS (these are not then Tinderbox links being RDF only), etc. The prototype also sets a monospace font that is helpful when writing code as it makes space (or lack thereof) more evident.

Another advantage of creating templates in the /Templates/ container is they are then automatically added to the list of available templates in any such pop-up lists saving you typing the values (and possibly mistyping the name).

When using ^value()^ you should use the $-prefix for the attribute’s name, i.e. ^value($SomeAttribute)^ ^value(SomeAttribute)^. The fact the latter works is Tinderbox making a correct guess you meant the value of attribute ‘SomeAttribute’ and not the literal string ‘SomeAttribute’.

1 Like

@mwra I’ve just learned so much from your posts. And some of it for stuff I would never have known to look up on my own. Because mostly things were “working”.

Thank you!

1 Like

You are too kind. In return, I think (hope!) the observation will make more sense to the forum as a whole given their reference to your wonderful videos. Not cutting the missteps and confusions is a really powerful9and brave) approach. It certainly helps elucidate the incremental formalisation going on.

Watching you elegantly fix the attribute values list to a desired sort order (via a prefix) was interesting, though note that if >9 items in the sequence use zero-padded numbers. These value are strings and so sorted lexically (1, 10, 9) and not numerically (1, 9, 10) as might be assumed, thus 01 through 99 rather than 1-99 gives us a desired sort (01, 09, 10). Obviously in >99, you’d use 001, etc. These things tend to only be obvious once you know!
I am left wondering (after the post above) if you are using Sets where a String would suffice and be more useful. If an attribute has one value in each note, it can be a String. However, taken in the context of wanting a fixed vocabulary—or initial list proposed values—this choice can get confusing, especially for longer term users. Suggested values are

List and Set attributes alone support multiple values. Note though, it is also harder to search/act on individual values, e.g. you can’t use a regex-based .contains() on a list value. Thus if you don’t need a list-based type, a String offers you more (analytical) power in the long term.

Another think that came out nicely in this series of videos is use of attributes to hold discrete strands of metadata. ‘Just’ having full-text search of $Text is fine for finding things but less work after the annotation state. Once you start to do export or quantitative/qualitative work, user attributes really come into my own (the one I have open has over 60, and Yes, they all have a purpose). One trick I’ve acquired is using Booleans as a form of stored query. So we may have and attribute with values X, Y, Z, etc.s and constantly filtering out the notes with, say, a Y value can get tedious. Setting a $HasY boolean for those notes can save a lot of time. However, such tweaks are definitely a mid/late stage incremental tweak. I try not to add attribute before the fact unless I absolutely know they will be used—some are easily predicted ahead of time, others need to emerge as a need.