HyperCard
HyperCard was a revolutionary desktop computer application released in 1987 by Apple Computer, Inc. The application itself was merely a platform and a toolkit for the construction of 'stackware' - virtual stacks of index cards, with buttons, text fields, graphics, sound and animation that could do just about anything. All of this was made possible by the simple user interface, English-like scripting language (called 'HyperTalk') and a suite of cool example stacks.
Apple originally bundled HyperCard for free with early Macintosh computers. Stacks that came with HyperCard included an address book, various collections of ready-made buttons and a library of clipart. Users have apparently used it to control the lighting on tall buildings, track appointments, build highly successful games (Myst) and heaps more. It really was amazing what you could do with it and how easy it was.
I am particularly fond of HyperCard. It was my first programming environment and my only programming environment for many years of my childhood. Alas, Apple never really seemed to know what to do with it. In the mid 1990s it was looking dated - colour graphics was a clumsy add-on and the World Wide Web was about to take-off. When the application was eventually canned for good, few were around to notice except a few HyperCard faithful who'd stuck around to the very end. It was rather unceremonious for what had started out as such an awesome work of engineering.
The Clones
In the early days while HyperCard was still in popular use amongst Apple users, there was a similar product called SuperCard. Developed after HyperCard, it provided built-in colour, multiple windows and a whole heap of functions that HyperCard didn't have. Of course, with all this extra stuff the interface was not nearly as simple as Apple's HyperCard. SuperCard oddly enough has survived to this day (2009) despite having changed company probably close to ten times over it's lifetime.
Numerous other clones inspired by HyperCard have come and gone. The only one I know of that deserves a mention is Runtime Revolution. It shares much in common with HyperCard, although the program could benefit from a simplification of the design and a more polished user interface.
Surf looked interesting, but the program has long since disappeared from the Internet. No traces of it anywhere, as if it never existed. Weird.
Other clones or programs inspired by HyperCard have since been bought or abandoned. One in particular was the most hideous software development I have ever laid eyes on. The said program's creators had no idea how to distribute the program for download, let alone build something with a usable interface!
I've never been particularly fond of any of the clones. They just never 'smelt' right. Despite it's failings, HyperCard managed to do things in a way none of the competition ever did. Or perhaps it's just nostalgia and fond memories? Whatever the case, the sheer simplicity of the old HyperCard user interface has something in common with that of the old Mac OS 6. Something that I sometimes wish we had more of in this age of widgets and gadgets and eleventy-billion microscopic toolbar icons littering the screen.
Cinsimp Development
I began a project in 2008 to bring HyperCard back from the dead. Unfortunately work and study got in the way, and I wasn't able to find a substantial block of time again until late 2009...
Update: December 21, 2009: The last few days have been hectic. I've got a rudimentary, near-complete HyperTalk compiler, the outline of a virtual machine and most of a basic Stack file format implemented. Tomorrow should see the Stack module debugged and working. Wednesday I'll be throwing a barebones GUI together and testing the complete flow from GUI -> Script -> Compiler -> VM -> Stack -> GUI and generally integrating everything. Expect to see a working demo posted late this week once some of the bugs have been ironed out!
Update: December 22, 2009: Well, as hoped the Stack module is debugged and working! I have a stable stack file format with support for cards, backgrounds and well not a lot else. But all the various sequences of cards; in the stack, in the background and the marked cards are supported at the format level. Access by ID and sequence is almost instant regardless of stack size. Sorting should be relatively quick once it's implemented. I started playing with wxWidgets last night and it looks like I may have a rudimentary HyperCard clone working by Wednesday/Thursday. Very exciting!
Update: December 23, 2009: The prototype GUI currently written using wxWidgets is now sufficiently developed for work on the VM to continue. I have the ability to create and open stacks, create and destroy cards and backgrounds and edit card scripts, and I have a 'messagebox' in which to type HyperTalk commands. There are no buttons and fields yet. The program just prints the details of the current card to screen and more verbose information on various internals to the console. Tomorrow should see the VM executing small scripts with somewhat limited scope.
Update: December 24, 2009: The first integration between GUI, file format and language is a success! I am able to enter one of few implemented, built-in commands in the message box and the command is executed. The message travels through the entire message hierarchy (from card, to background, to stack, stacks in use, home, etc.) until it reaches ResetCard. Or it can be caught earlier in the hierarchy by a handler within a script. Today marks a significant milestone in the development on this project; it is the first day the foundations for the entire environment have come together and worked. There is much work to be done before this thing is remotely usable but most of the difficult design tasks have been completed.
Update: December 27, 2009: I've had a few days just idling after a week hard at it. Today I managed to make a very decent start on an implementation of the original HyperCard text field. That is, a multi-line, scrolling text field with visible lines and several styles that aren't available on today's machines; outline and shadow in particular. It doesn't seem apparent how I can implement visual effects without being able to paint widgets into an offscreen buffer. Unfortunately I couldn't see how this would be possible with my use of wxWidgets for windowing and all things GUI. Hence I am now writing my own styled, multi-line text editor! Oh, and I managed to get the storage of buttons and fields to about 90% the other day.
Update: December 28, 2009: The development of a HyperCard-like text field is progressing well. I have the field now rendering styled-text and blinking the insertion point. The field is click-sensitive and knows which line and character have been clicked.
Well I am off to see my family for a few days. I don't expect to get much done aside from maybe some documentation during that time. More updates in a week!
Update: January 6, 2010: Good progress was made today on an implementation of buttons. More to follow soon. At this stage I'm hoping to wrap things up by Sunday for a reasonably solid post up here. The project will be released as open-source as soon as it's functioning solidly from end-to-end, and not too much like a construction zone.
Update: January 10, 2010: I'm not as far along as I had hoped - I have slowed down significantly due to spending too much time relaxing instead of coding on my holiday... Despite all that sitting around watching movies I have got command calls, arguments and a couple of built-in commands including 'put' working successfully. Aside from a couple of small things I have yet to try, the design of the VM is now fairly solid. All that really remains is to implement the hundreds of built-in commands, operators and property accessors of the original program! It is safe to say I will be posting a build with a somewhat smaller subset of functionality initially. The next major job on the horizon is now implementing a rudimentary field and integrating it with the rest of the program. Despite having started well on a multi-line styled, scrollable field a couple of weeks ago, I've decided it will be easier to aim for HyperCard 1.x functionality on that front initially, ie. a single font and style for the entire field. That is assuming I want to deliver a reasonably sound build of this program before I go back to work and without massive memory leaks... ;)
Update: January 12, 2010: The HyperTalk environment is now running handlers, repeat loops, decision (if) blocks and accessing object properties. I've gone back to complete work on an editfield. I'm still in two minds about the support for multiple styles in one field; it just depends how solid the implementation looks once some of the glitches have been ironed out. At this point you can type in the field, use the arrow keys and mouse to move the insertion point and scroll up and down using the arrow buttons. Tomorrow I'll need to get the field practically finished and stable. Text selections are probably next. One of the interesting things about writing your own text field is when you realise stuff, like the insertion point for example: when it's at the end of a line it is technically also in the same place in the text as the beginning of the next line. The offset is the same, but the position of the blinking line isn't. Ideally of course it should go where the user puts it.
Update: January 13, 2010: I seem to have been on a roll with this text field. The field has a working scroll thumb and supports selections and editing, as well as the 'Show Lines' feature of HyperCard you can see illustrated above. The majority of work now is in cleaning the code up and getting the automatic insertion point positioning to work more reliably around soft-line boundaries. It's a little glitchy at present!
Update: January 14, 2010: Well the field is almost complete. I need to revise the way scroll calculations are performed, but otherwise it's basically complete. The next major job will be integration with the main project.
Update: January 15, 2010: I've just spent about 4 hours laying out dialogs for the user interface. Now the painful part is done, I can concentrate on assembling all these pieces!!
Update: January 16, 2010: Today was the first day I started working to bring all the pieces together. I have a compiler, a virtual machine, a stack file, buttons, fields, menus and dialogs, but there are a lot of small holes - so the program is to date useless. I hope to change that over the next two to three days. Field editing dialogs were enabled today and the edit field widget now responding appropriately to changes made by the author in the dialogs. Today also saw the addition of the standard 'I-beam' cursor when hovering the mouse over a field. The plan for tomorrow is to re-route all drawing to an offscreen buffer for the card window, and complete moving the card environment from the stack file format where I originally (mis)placed it to where it actually belongs. Monday should see the introduction of rudimentary paint tools and picture capabilities. And perhaps on Tuesday I'll have enough pieces to construct a 'Home' stack.
Update: January 17, 2010: I have implemented my first visual effect and tested it as a transition between two cards in a test stack. My effect, 'wipe left' and it's counterparts, wipe right, wipe up and wipe down can be run at one of four different speeds as in the original program - normal, fast, slow and very slow. That was this evening. I spent most of the day deleting stuff and refactoring large portions of the program, stopping only for a barbeque with some friends at lunch. The architecture I have now I am fairly happy to leave as-is for release, hopefully sometime towards the end of my time-off, ie. early next week. Tomorrow I will be working on basic paint tools and card artwork as planned. Once some of that is completed, I'll be purely focused on what needs to be done to get a rudimentary but solid release together in the coming days. I guess I've spent about 3 working weeks on this project in total. I have something like 10,000 lines of C-source to show for it. Perhaps less fortunate is the large number of unattended to leaks and holes around the place. Of course, with a few more days attention it should be quite useable. I'm getting very excited now!
Update: January 18, 2010: Finally. A major milestone has tonight been reached. The environment has a primative picture saving ability that will no doubt be gradually extended to include some basic paint tools. With a little over a week of my holiday remaining, I can now turn my attention to wrapping this thing up.
I had originally hoped to closely replicate the original program. Despite having completed much of the heavy lifting, for legal and copyright reasons I am unable to continue down that path and make a public release of the product. As such, I will be working over the next few days towards a colour-enabled program with a feature-set something of a cross between HyperCard 1 and HyperCard 2. Where it makes sense to do so, new commands may be added or functions adapted to suit a modern environment. Stay tuned.
Update: January 19, 2010: I've settled on the GNU General Public License (GPL) for release of the sources for my project. I'm anticipating having something worth uploading within a couple more days, certainly by the end of the week.
Today involved bug fixes and hooking the new Object Properties palette to the objects it will be used to edit. Yesterday evening I redesigned the menubar and scrapped a whole heap of 'extra' stuff that wont be needed or wont make it into the first release. The build is substantially more stable today. I expect to finish the non-scripting components of the build at some stage tomorrow. It's looking good!
![]()
Well as usual things take longer than expected. The build quality is steadily dropping as I race to get more of the remaining essentials implemented. As of this evening, I'm content with what I have. It's a long way off where I'd like it to be, but, it works, just!
Tomorrow I will just be cleaning and organising the code for upload to this site. One of the reasons for publishing the code is so that if I run out of time or loose interest, others can pick it up and run with it. This is something I suspect I'll be tinkering with for some time, but at least the option is there. It's also still a very useful tool and as discussed above, I'm not particularly keen on any of the existing alternatives.
Related Links
Internet Archive article - video and stills from a program introducing HyperCard 1.0 in 1987, including a number of big names involved with the development of the product.
HyperCard on Twitter - yes, it has a Twitter page! Includes a number of insanely amusing comments from HyperCard faithful.
More about HyperCard on Wikipedia
University of Michigan - HyperCard Archive
