I'm the designer of Tinderbox, a tool for visualizing, analyzing, and sharing your notes. It’s published by Eastgate.

So, for a while there during the campaign it seemed very iffy. But in the end, discipline and being on the right side of the issues prevailed. Yes, Elizabeth Warren won!

Oh, and that guy Obama too.

That was Paul Krugman at 2AM on the morning after the election, and he was right. She’ll be a fine senator. The campaign was a tremendous effort, and I was shaking in my boots right to the end. But back in July I wrapped up a house party that was descending into maudlin strategic wrangling with an impromptu claim that it looked really close at the moment but by election day we’d be ten points ahead. It was eight. In Malden, we went from an 1800 vote margin in the special election to a 6200 vote margin in this one.

But, man, was it hard to help these people.

Back in February, I started sending out offers of assistance. Need a web site? Need collaborative writing tools? Need something written? Need lunch? I was your guy. And I got a few friendly emails, but nobody gave me work.

I think that Tinderbox would be a terrific tool for field organizers. I offered copies — as many as you need. Training? You got it. Want it non-disclosed to be sure I’m not a snake-oil charlatan? Fine.

Not a nibble.

Starting in June, we had “leadership” meetings in a pizzeria to plan the campaign for our 50,000-person city. I was asked to design a four-sentence handout for the city’s July 4 celebration. We went through something like four drafts. At the last minute, one volunteer decided to replace all the copy with pabulum and threatened to quit and start a rival organization. Great.

I begged the campaign’s new media director for work of any sort. Crickets. In July, I launched a miniature campaign inside the campaign, calling in favors from colleagues and politically-connected former employees, just to get the new media director to respond to my email. She was encouraging in lots of directions, and never wrote back.

The logo you see above? I photoshopped it. I asked everyone, all the time, for the campaign graphic standards. What’s the font? What are the PMS colors? No one knew, or knew anyone who knew. That’s 100,000 impressions right there, and mine is a very niche blog. I tried to convince someone to do blogger outreach. I tried to convince someone to let me do blogger outreach, inside or outside the campaign. No answer.

I begged the North Shore Field Director for work. “Knock on doors, make phone calls.” But I’m lousy at canvassing, and I have a terrible time hearing the phone, and I’m rather good at a bunch of other things. I begged the 20-something who was running Volunteers for the summer.

“I’m too busy,” she told me.

“I can manage, I can organize, I can screen your emails.” I told her. “I can write training documents so you don’t have to spend 40 minutes with every new volunteer. Let me help you.” She told me to make phone calls.

This was a recurrent theme. Linda came in for phone bank training, went home, and wrote a manual for new phone bank people. I don’t think anyone got around to using it. Lots of people have special skills or talents – lawyers can litigate and negotiate, writers can write, programmers can code, chefs can cook, and people who happen to have a van or a pickup can haul stuff. We never found out who could help and how; the field organizers were being evaluated on doors knocked and phone calls made, and pumping those numbers for this week was what mattered.

In July, I asked that leadership meeting, “How many volunteers will we need on November 6?” We didn’t have an answer then, nobody seems to have thought about it until October, and then we found ourselves scrambling to get bodies to cover the bare necessities at the polls.

This was an extraordinarily well funded campaign, but until the end we never had sufficient collateral. We hoarded bumper stickers. Getting a lawn sign was a mark of great favor with headquarters. We printed our own brochures on or own ink jet printers.

And, in all this time, I never saw Elizabeth, never heard her stump speech. I never saw Mindy Myers, the campaign manager. I tried to get information on speeches for the Malden For Warren web site, and was told by the Volunteer Coordinator that they were secret, lest Republicans show up.

Some of this is a matter of local politics: the Malden Democrats still inhabit a world where the big social issue is getting the Irish and Italian immigrants into the mainstream of society. The big events have dinner at 5:30 and lots of walkers and guys singing Irish songs. The city has changed; we still have lots of new immigrants, but they’re from China and South Asia and Eastern Europe and Haiti, and we have lots of young folks too, but working the St. Patrick’s Day crowd is the way it’s always been done. (Someday soon, someone will push gently on the Malden Democratic City Committee and it will simply fall over.)

Some of the problem was management by metric. It was clear that the field organizers knew that they were always being evaluated, and so we were always knocking doors and placing phone calls. The main Web site collected volunteer emails for months, but nobody seems to have done anything with those names, or knew who might know about them, and nobody cared because getting more volunteers for the campaign wouldn’t improve their numbers for the week.

And some of it was just timidity. Whatever you can say about Elizabeth Warren, she’s not a timid woman, but her messaging was often very timid indeed. The constantly iterated claim that “She’ll work for you” was just about indistinguishable from her opponent’s slogan, “He’s for us.” The early campaign focused on “She’ll fix what’s broken in Washington,” which (a) is false in the event, as there’s nothing she can do about the tea party in the House, and (b) is in any case a Republican talking point. In a working class city in the grip of a nasty recession, we were instructed to pitch people on Warren as a “fighter for the middle class,” not reflecting on whether our audience saw themselves as part of the middle class.

It was a ton of work. It was painful. If I were starting over, I think I’d work entirely outside the campaign. Almost everything I got done, everything that worked, I simply did it and asked permission later. All the internal campaigning, the long memos and proposals and drafts and meetings, was almost entirely wasted.

And it was much, much too close.

Still, we won. And the country will be safer and better.

Aug 12 6 2012


Mark Anderson recently pulled the release dates from the Tinderbox release notes, put them into a Tinderbox timeline view, and then “gussied them up” in Timeline 3D.

That’s a bunch of releases.

Novelist Mike Brown is using Tinderbox to plan his next book and revise his last.

What I've been absorbed in the last week is the learning of Tinderbox. I heard about this "personal content assistant" software trolling my favorite writing software Scrivener's forums, and Tinderbox sounded like it could do much to quiet the nag within me that always compares what I’ve done with what I had planned to do, whether it is a new novel or the rewrite of one already completed.


So in a deep funk, several weeks ago I was prodded by an inner certainty to learn Tinderbox.  How much can I learn about Tinderbox?  I don’t know. Yet,  I am hooked. The brilliant concept of throwing notes at a wall, contemplating them, seeing what sticks, what links, leaving the mind free, has let me break through--I think, I hope--my unwillingness to re-imagine Dust/Hidden Children/Hidden Laughter in a way that brings out everything it was meant to be, and which allows me to feel that I've grown.

But She’s A Girl explores Crafted Software, with an emphasis on the craft qualities of Vim and Tinderbox.

Mark argues that software engineers who care about crafting good tools should build software to assist people in doing the hard things in life (like making sense of information rather than just collecting it, planning, and thinking); that is reliable enough to allow the user to trust it; and that is occasionally capable of inspiring “delight”. An important part of this (as the quote above states) is not trying to solve everyone’s problem or to be all things to all people. In later essays in the series he suggests that users should expect to have to learn, and that software should “embrace personality and style”. This describes precisely the qualities I value in the software that I love the most.

But She’s A Girl describes her achievements file. It’s in Tinderbox, of course.

If you’re anything like me, when the time comes to update your CV or convince those above you that you do actually do some stuff, your mind goes frighteningly blank. “I know”, you think to yourself, “that I’ve done something this year, but what was it?”. Even if you do manage to remember a few things, you have to rummage around in your hard drive or filing cabinet to retrieve the details of that talk you gave or that cool thing you did. I’ve had this problem for a long time and vaguely thought I should do something about it. This weekend, I finally did it: I made an ‘achievements file’.

Just finished a miserable three day programming marathon, the sort of disaster that makes you question your compiler, your sanity, and whether mankind was intended to program. The explanation was a simple error – but one I’ve never made before.

I’m in the middle of a big project, refactoring the core of Tinderbox and moving it to a new platform. For the most part, this has gone swimmingly, and I think I’ll hit my August 1 milestone in June. Since I’m moving and testing things object by object, I occasionally need to make temporary test jigs and placeholder objects that do very little (or nothing) except stand where the real object would be.

I once went to a dress rehearsal in Göteborg. At one point, a fellow came on stage and explained that, tomorrow night, the King would say a few words, and so he stood in for the King and this would help prevent dancers from crashing into the Sovereign. These objects are just like that.

So, I have this complex family of objects called ExportElements that are made by the ExportElementParser. But I don’t have an ExportElementParser yet, or any actual ExportElements. But I’ve got things that expect to receive an ExportElement, and some of those can be tested without having an actual working ExportElements to give them. So I write up a little class that pretends to be an ExportElement, and if you need to use the test objects, you can

#include "ExportElementStub.h"

All this is canonical, by-the-book, test driven development. I wrote the dummy object weeks ago, used it in a few places, forgot all about it.

Last Friday, it was time to hook up ExportElementParser, the factory that makes various kinds of ExportElements. They come in about 28 flavors. I was expecting it to be tricky. It went better than I hoped. There were snags — file system issues, some old syntax questions, a few references to things that weren’t implemented yet and had to be patched up with their own imaginary objects. But soon it compiled. And the tests ran.

So, now it was time to test the whole thing. Crash! That’s not too bad: things had been going too well, it was time for a problem. So, I broke things down into smaller steps. They worked – and then Crash! So, I went back a bit. It still crashed! All sorts of things would crash occasionally. It looked like a corrupt heap. I did diagnostics. I did tests. It didn’t make sense.

At one point, I refactored code from ExportElementParser, where it crashed, to my test class, where it didn’t. That felt like a compiler error. Restart the machine: no help.

At one point, I fixed a crash by changing sequence of declarations in the .h file. That’s Twilight Zone stuff. I was getting very unhappy with LLVM, with XCode, with the world. My Mirra Chair broke. I spilled coffee on my notes. I lost a lot of sleep.

And then, Monday noon, I saw it:

#include "ExportElementStub.h"

The Parser was still using the fantasy version of ExportElement , while everything else was using the real version. And since the different versions have different sizes and layouts in memory, the parser would corrupt the heap every time it touched an ExportElement . Yet, the objects were legitimate objects — not the droids you’re looking for, but droids — and so all the wonderful safety netting of the modern OS was pretty much disarmed. “Don’t know why you’re doing that, fella,” says Mac OS X, “but it’s a free country!”

Moral: if your #include files are inconsistent, you’re going to be in a very bad place. Somehow, in — can it be? — 25 or 30 years of programming in C-style languages, I’ve never made this mistake before. I can’t imagine why not: I make all the other mistakes. Yikes.

May 12 25 2012


On returning from Hamburg, I started a big new project.

The Tinderbox code base is ten years from release 1.0.2. It’s in remarkably good shape, but it’s time for a thorough shakeout. We’ve got technical debt to pay up, and we’ve got new things to do and we’ve got a bunch of new ideas to build out, and everything will work better if the foundation is more solid.

I think this will lead to several new tools, and several new platforms. Exciting times.

Tinderbox 5.11.1 overview in Tinderbox

The first step — I did most of this on the plane from Hamburg — was literally to take stock. What, exactly, is Tinderbox? Each note in this Tinderbox map is a Tinderbox class file, generated by importing a directory listing into Tinderbox and using Explode. Most represent a single class, though a few (like CeresMapDrawingPolicy) represent a half dozen cooperating objects and a handful, like ExportElements or AgentActionExtras, represent 25 or 50 small classes. Adornments represent functional clusters like “XML handling,” “Agents” or “Graphic primitives.”

After sorting out lots of baggage we plan to leave behind, we’ve got about 350 of these objects and object clusters. We’re jettisoning hundreds of framework classes in this leap, too, though these aren’t shown on the map. And as we leave them behind, I think that the world pretty much leaves behind PowerPlant, the MacOS framework that became a classic in many senses. A tip of the hat, then, to Greg Dow and John Daub and MWRon and a bunch of other people I’m forgetting now for the foundation of the software on which we all depended for so much, for so long.

It wasn’t paradise, but it was home.

We draw a lot of boxes and arrows in computer science and information architecture. European computer science is especially fond of them. And of course they're central to the Tinderbox map view.

But should we rely on boxes? How about some curves?

Boxes and Arrows

I tried to get some interest in foliated, art nouveau maps at IVICA a few years ago. I’ve not seen much uptake, but perhaps that was too much to expect; making this happen will take a lot of work and would probably be a risky platform for a doctoral dissertation. (It sure could put someone one the map, though!)

I’m not entirely happy with this sketch. In fact, I’m not happy at all. The curves aren’t right, and we need other ways to represent anti-links and contingent links. How do we represent typed links without too much clutter? And this does nothing to help matters when you have lots of tangled links, which I think is something we ought to encourage.

But there’s a lot of low-hanging fruit to be plucked around here.

I have a bunch of research topics gathering dust. Most would be suitable for a dissertation or thesis. All should be publishable.

When I was a graduate student, I used to spend hours looking for ideas that might generate a publishable scientific discovery. Everywhere one turned, either someone had been there before or you needed a ton of new equipment.

Now, I’ve got ideas lying all over the office. That was chemistry and this is the margins of computer science and the humanities. Perhaps I was completely clueless back then, perhaps everyone else has always seen these topics lying around.

Anyone interested? What’s the best things to do with them?

I’ve got an elementary headache with XCode 4.

Suppose I sit down and say, “Get me the files for CeresMapDrawingPolicy!” Back in the old days of XCode 3, this was easy enough:

  1. Select the project at the top of the group tree
  2. Type a few letters (case-insensitive!) in the search area
  3. You’re done

Since Tinderbox involves about 1900 files, it’s important to make this fast and easy,

Currently, I’m doing this with blind typing in the Project Navigator. This is bad because

  • You have to keep all groups open all the time, which defeats the utility of groups
  • Blind typing is case-sensitive
  • Mistakes fail silently
  • You need to do a lot of typing because CeresMapDrawingPolicy and CeresMapOutlinePolicy are different files in different places

There’s got to be a much better way to do this. Suggestions? Email me.

Update: That was fast. Matt Hanlon recommends Open Files Quickly (⌘-shift-O ). Helge Gudmundsen recommends Code Pilot.

I’ve got an elementary headache with XCode 4.

Suppose I sit down and say, “Get me the files for CeresMapDrawingPolicy!” Back in the old days of XCode 3, this was easy enough:

  1. Select the project at the top of the group tree
  2. Type a few letters (case-insensitive!) in the search area
  3. You’re done

Since Tinderbox involves about 1900 files, it’s important to make this fast and easy,

Currently, I’m doing this with blind typing in the Project Navigator. This is bad because

  • You have to keep all groups open all the time, which defeats the utility of groups
  • Blind typing is case-sensitive
  • Mistakes fail silently
  • You need to do a lot of typing because CeresMapDrawingPolicy and CeresMapOutlinePolicy are different files in different places

There’s got to be a much better way to do this. Suggestions? Email me.

Update: That was fast. Matt Hanlon recommends Open Files Quickly (⌘-shift-O ). Helge Gudmundsen recommends Code Pilot.

Mar 12 27 2012

Day 1

Day 1

A grueling day of sprint-coding, starting from the rarely-seen XCode stationery. The blank canvas is always formidable, and it’s worse here because intensive Tinderbox work for the 5.10 updates has played havoc with my Objective-C reflexes.

Ten hours later and we’re just about reading legacy Storyspace files.

Day 1

Much of the code is quite ugly, thanks to tons of arcane bit-twiddling. Remember, this file format was originally designed to lift things efficiently off floppy disks, because a big hypertext like Victory Garden could take five minutes to load on those old machines. To minimize processing, large parts of the file format exactly matched the data structures, so you could slam the bits right into memory. Unfortunately, this means that details of the 68000 compiler’s memory layout persist even in this new code, three processors on.

It’s not all awful. Test-driven design will help a lot. It hadn’t been invented the last time I went through this. It’s already helping, although I did lose 20 minutes trying to track down the lost 141-st link in Mary-Kim Arnold’s “Lust”, when it turned out the lost link was never lost at all.

Status: 5 classes, 4 tests.

Curator’s Code proposes that we popularize two new link glyphs: ᔥ to denote “via” and ↬ to denote “hat tip” or acknowledgment

Marco Arment replies in "I am not a curator," arguing that the distinction is not clear and that aggregators do not really want to clarify the distinction anyway — and don’t really want you to follow these links in any case.

This is an old, old question in hypertext research. In fact, the controversy conflates a bunch of old questions that might better be addressed separately:

  • Should links be typed?
  • Should link types represent intention or citation?
  • What should be the link anchor: a text span, or a glyph embedded in the text, or a glyph in the margins or the footer?

I don’t share Arment’s confusion over the two glyphs. Use ᔥ when you’re just repeating a link you saw elsewhere, and use ↬ when you’re commenting on, extending, or disagreeing with a link.

In practice, Arment is probably right: two obscure new glyphs are probably too many for people to learn. At the same time, we need more glyphs because simply “reblogging” in tumblr fashion is soon going to seem old-fashioned and terribly 2012.

It's nice that Tinderbox macros can make it easy to embed these oddball characters in your text without an excursion to Character Viewer. Or, use TextExpander with Tinderbox to give easy mnemonics to each character.

Mar 12 7 2012


I've got an idea for a hypertext fiction thriller that would be exciting, sexy, and a hell of a good time.

But where on earth am I to find the time to write it? And does the world need another thriller more urgently than better Tinderbox and Twig and a new Storyspace and the two print books I'm supposed to be finishing?

Time’s winged chariot indeed.

Update: Mary-Kim Arnold suggests the employment of minions. Alan Jacobs complains that minions are not what they were.

Discovery when doing snack support for last weekend’s Tinderbox: the donuts at Ohlin’s Bakery in Belmont are exceptional.

Gordon Meyer updated his Tinderbox-based weblog, Usable Help, to use internal templates. Here’s how.

Since day one, I've written, built, and managed the site using Tinderbox. It's rather remarkable that I'm still using the same tool a decade later, and almost astonishing that I'm using the same Tinderbox file (document), considering that I started with Tinderbox 1.0 on Mac OS 9. Tinderbox has continued to grow and evolve, and Mac OS has been radically transformed, but here I am with the same file I created so long ago.

It’s been a year since my ELO postmortem. Tinderbox reminds me about major posts on their anniversary. This one might be worth another visit.

The most recent addition to the crowd-sourced directory upon which such hopes rested, and in whose defense so much vitriol was spilled, appears to have been a single stub added four months back. The “Featured article” hasn’t changed since December 2009. Here’s the page about “Our Process”, references in the main navigation list:

Our process 

Information about the process goes here.