<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Acko.net]]></title>
  <link href="https://acko.net/atom.xml" rel="self"/>
  <link href="https://acko.net/"/>
  <updated>2026-03-05T12:10:39+01:00</updated>
  <id>https://acko.net</id>
  <author>
    <name><![CDATA[Steven Wittens]]></name>
    
  </author>

  
  <entry>
    <title type="html"><![CDATA[Get in Zoomer, We're Saving&nbsp;React]]></title>
    <link href="https://acko.net/blog/get-in-zoomer-we-re-saving-react/"/>
    <updated>2022-09-23T00:00:00+02:00</updated>
    <id>https://acko.net/blog/get-in-zoomer-we-re-saving-react</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad">
  <h2 class="sub">Looking back, and forward</h2>
</div></div>

<div class="c"></div>

<p><img src="https://acko.net/files/zoomer/cover.jpg" style="position: absolute; left: -5000px; top: 0;" alt="Zoomer" /></p>

<div class="g8 i2"><div class="pad">

<p>Lately, it seems popular to talk smack about React. Both the orange <i>and</i> red site recently spilled the tea about how mean Uncle React has been, and how much nicer some of these next-gen frameworks supposedly&nbsp;are.</p>

<p>I find this bizarre for two reasons:</p>

<ul class="indent">
  <li>Most next-gen React spin-offs strike me as universally <i>regressive</i>, not&nbsp;progressive.</li>
  <li>The few exceptions don't seem to have any actual complex, <i>battle-hardened</i> apps to point to, to prove their&nbsp;worth.</li>
</ul>

<p>Now, before you close this tab thinking <i>"ugh, not another tech rant"</i>, let me first remind you that a post is not a rant simply because it makes <i>you</i> angry. Next, let me point out that I've been writing code for 32 years. You should listen to your elders, for they know shit and have seen shit. I've also spent a fair amount of time teaching people how to get really good at React, so I know the&nbsp;pitfalls.</p>

<p>You may also notice that not even venerated 3rd party developers are particularly excited about React 18 and its concurrent mode, let alone the unwashed masses. This should tell you the React team itself is suffering a bit of an existential crisis. The framework that started as just the V in MVC can't seem to figure out where it wants to&nbsp;go.</p>

<p>So this is not the praise of a React fanboy. I built my own <a href="https://usegpu.live/docs/guides-live-vs-react" target="_blank">clone of the core run-time</a>, and it was exactly because its limitations were grating, despite the potential there. I added numerous extensions, and then used it to tackle one of the most challenging domains around: GPU rendering. If one person can pull that off, that means there's actually something real going on here. It ties into genuine productivity boons, and results in robust, quality software, which seems to come together as if by&nbsp;magic.</p>

<p>To put it differently: when Figma recently announced they were acquired for $20B by Adobe, we all intuitively understood just how much of an exceptional black swan event that was. We know that 99.99…% of software companies are simply incapable of pulling off something similar. But do we know&nbsp;why?</p>

</div></div>

<div class="g6 i3 mt2">
<p class="tc"><img class="flat" src="https://acko.net/files/zoomer/cover.jpg" alt="Zoomer" /></p>
<p class="tc"><img class="flat" src="https://acko.net/files/zoomer/ibm.png" alt="IBM logo" /></p>
</div>
<div class="c"></div>

<div class="g8 i2"><div class="pad">

<h2 class="mt3">Where we came from</h2>

<p>If you're fresh off the boat today, React can seem like a fixture. The now-ancient saying <i>"Nobody ever got fired for choosing IBM"</i> may as well be updated for React. Nevertheless, when it appeared on the scene, it was wild: you're going to put the HTML and CSS <i>in</i> the JavaScript? Are you&nbsp;mad?</p>

<p>Yes, it <i>was</i> mad, and like Galileo, the people behind React were completely right, for they integrated some of the best ideas out there. They were so right that Angular pretty much threw in the towel on its abysmal two-way binding system and redesigned it to adopt a similar one-way data flow. They were so right that React also dethroned the previous fixture in web land, jQuery, as the diff-based Virtual DOM obsoleted almost all of the trickery people were using to beat the old DOM into shape. The fact that you could use e.g. <code>componentDidUpdate</code> to integrate legacy code was just a conceit, a transition mechanism that spelled out its own obsolescence as soon as you got comfortable with&nbsp;it.</p>

</div></div>

<div class="g10 i1"><div class="pad">
<p class="tc"><img class="flat" src="https://acko.net/files/zoomer/angular-template.png" alt="Angular Template" /></p>
</div></div>

<div class="g8 i2"><div class="pad">

<p>Many competing frameworks acted like this wasn't so, and stuck to the old practice of using <i>templates</i>. They missed the obvious lesson here: every templating language inevitably turns into a very poor programming language over time. It will grow to add conditionals, loops, scopes, macros, and other things that are much nicer in actual code. A templating language is mainly an inner platform effect. It targets a weird imagined archetype of someone who isn't allergic to code, but somehow isn't smart enough to work in a genuine programming language. In my experience, this archetype doesn't actually exist. Designers don't want to code at all, while coders want native expressiveness. It's just that&nbsp;simple.</p>

<p>Others looked at the Virtual DOM and only saw inefficiency. They wanted to add a compiler, so they could reduce the DOM manipulations to an absolute minimum, smugly pointing to benchmarks. This was often just premature optimization, because it failed to recognize the power of dynamic languages: that they can easily reconfigure their behavior at run-time, in response to data, in a turing-complete way. This is essential for composing grown up apps that enable user freedom. The use case that most of the React spin-offs seem to be targeting is not apps but <i>web sites</i>. They are paving cow paths that are well-worn with some minor conveniences, while never transcending&nbsp;them.</p>

</div></div>

<div class="g5 mt01">
<pre><code class="language-tsx wrap">var RouterMixin = {
  contextTypes: {
    router: React.PropTypes.object.isRequired
  },

  // The mixin provides a method so that
  // components don't have to use the
  // context API directly.
  push: function(path) {
    this.context.router.push(path)
  }
};

var Link = React.createClass({
  mixins: [RouterMixin],

  handleClick: function(e) {
    e.stopPropagation();

    // This method is defined in RouterMixin.
    this.push(this.props.to);
  },

  render: function() {
    return (
      &lt;a onClick={this.handleClick}&gt;
        {this.props.children}
      &lt;/a&gt;
    );
  }
});

module.exports = Link;</code></pre>
<div class="c"></div>
<p class="tc"><i>React circa 2016</i></p>
</div>

<div class="g7"><div class="pad">

<p>It's also easy to forget that React itself had many architectural revisions. When old farts like me got in on it, components still had <a href="https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html" target="_blank">mix-ins</a>, because genuine classes were a distant dream in JS. When ES classes showed up, React adopted those, but it didn't fundamentally change the way you structured your code. It wasn't until React 16.8 (!) that we got hooks, which completely changed the way you approached it. This reduced the necessary boilerplate by an order of magnitude, and triggered a cambrian explosion of custom hook development. That is, at least until the buzz wore off, and only the good ideas remained&nbsp;standing.</p>

<p>Along the way, third party React libraries have followed a similar path. Solutions like Redux appeared, got popular, and then were ditched as people realized the boilerplate just wasn't worth it. It was a necessary lesson to&nbsp;learn.</p>

<p>This legacy of evolution is also where the bulk of React's perceived bloat sits today. As browsers evolved, as libraries got smarter, and as more people ditched OO, much of it is now indeed unnecessary for many use cases. But while you can tweak React with a leaner-and-meaner reimplementation, this doesn't fundamentally alter the value proposition, or invalidate the existing appeal of&nbsp;it.</p>

<p>The fact remains that before React showed up, nobody really had any idea how to make concepts like URL routers, or drag and drop, or UI design systems, truly sing, not on the web. We had a lot of individual pieces, but nothing solid to puzzle them together with. Nevertheless, there is actual undiscovered country beyond, and that's really what this post is about: looking back and looking&nbsp;forward.</p>

</div></div>

<div class="g8 i2"><div class="pad">

<p>If there's one solid criticism I've heard of React, it's this: <i>that no two React codebases ever look alike.</i> This is generally true, but it's somewhat similar to another old adage: that happy families all look alike, but every broken family is broken in its own particular way. The reason bad React codebases are bad is because the people who code it have no idea what they're supposed to be doing. Without a model of how to reason about their code in a structured way, they just keep adding on hack upon hack, until it's better to throw the entire thing away and start from scratch. This is no different from any other codebase made up as they go along, React or&nbsp;not.</p>

<p>Where React came from is easy to explain, but difficult to grok: it's the solution that Facebook arrived at, in order to make their army of junior developers build a reliable front-end, that could be used by millions. There is an enormous amount of hard-earned experience encoded in its architecture today. Often though, it can be hard to sort the wheat from the chaff. If you stubbornly stick to what feels familiar and easy, you may never understand this. And if you never build anything other than a SaaS-with-forms, you never&nbsp;will.</p>

<p>I won't rehash the specifics of e.g. <code>useEffect</code> here, but rather, drop in a trickier question: what if the problem people have with <code>useEffect</code> + DOM Events isn't the fault of hooks at all, but is actually the fault of the DOM?</p>

<p>I only mention it because when I grafted an immediate-mode style interaction model onto my React clone instead, I discovered that complex gesture controllers <a href="https://gitlab.com/unconed/use.gpu/-/blob/master/packages/workbench/src/camera/fps-controls.ts#L69" target="_blank">suddenly became 2-3x shorter</a>. What's more, declaring data dependencies that "violate the rules of React" wasn't an anti-pattern at all: it was actually key to the entire thing. So when I hear that people are proudly trying to replace dependencies with magic signals, I just shake my head and look&nbsp;elsewhere.</p>

<p>Which makes me wonder… why is nobody else doing things like this? Immediate mode UI isn't new, not by a long shot. And it's hardly the only sticking&nbsp;point.</p>

</div></div>

<div class="c"></div>

<div class="g12 mt1"><div class="pad">
<p class="tc"><img class="flat" src="https://acko.net/files/zoomer/macos-leopard.webp" alt="Mac OS X - Leopard (2007)" /></p>
<p class="tc"><i>Mac OS X Leopard - 2007</i></p>
</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">
    
<h2 class="mt3">Where we actually came from</h2>

<p>Here's another thing you may not understand: just how good old desktop software truly&nbsp;was.</p>

<p>The gold standard here is Mac OS X, circa 2008. It was right before the iPhone, when Apple was still uniquely focused on making its desktop the slickest, most accessible platform around. It was a time when sites like Ars Technica still published real content, and John Siracusa would lovingly post <a href="https://arstechnica.com/gadgets/2007/10/mac-os-x-10-5/" target="_blank">multi-page breakdowns</a> of every new release, obsessing over every detail for years on end. Just imagine: tech journalists actually knowing the ins-and-outs of how the sausage was made, as opposed to copy/pasting advertorials. It was&nbsp;awesome.</p>

<p>This was supported by a blooming 3rd party app ecosystem, before anyone had heard of an App Store. It resulted in some genuine marvels, which fit seamlessly into the design principles of the platform. For example, Adium, a universal instant messenger, which made other open-source offerings seem clunky and downright cringe. Or Growl, a universal notification system that paired seamlessly with it. It's difficult to imagine this not being standard in every OS now, but Mac enthusiasts had it years before anyone&nbsp;else.</p>

<p class="tc mt2"><a href="https://adium.im/" target="_blank"><img src="https://acko.net/files/zoomer/adium.jpg" alt="Adium IM Client" /></a></p>

</div></div>

<div class="g8 l"><div class="pad">

<p>The monopolistic Apple of today can't hold a candle to the extended Apple cinematic universe from before. I still often refer to the <a href="https://acko.net/files/zoomer/apple-hig-2008.pdf" target="_blank">Apple Human Interface Guidelines</a> from that era, rather than the more "updated" versions of today, which have slowly but surely thrown their own wisdom in the&nbsp;trash.</p>

<p>The first section of three, <i>Application Design Fundamentals</i>, has almost nothing to do with Macs specifically. You can just tell from the&nbsp;chapter titles:</p>

<ul class="indent">
  <li>The Design Process</li>
  <li>Characteristics of Great Software</li>
  <li>Human Interface Design</li>
  <li>Prioritizing Design Decisions</li>
</ul>

</div></div>

<div class="g4 r mt01">
  <img src="https://acko.net/files/zoomer/apple-hig-2008.png" alt="Apple Human Interface Guidelines 2008 - Outline" />
</div>

<div class="g8 l"><div class="pad">

<p>Like another favorite, <a href="https://en.wikipedia.org/wiki/The_Design_of_Everyday_Things" target="_blank">The Design of Everyday Things</a>, it approaches software first and foremost as tools designed for people to use. The specific choices made in app design can be the difference between something that's a joy to use and something that's resented and constantly fought against.</p>

</div></div>

<div class="c"></div>

<div class="g8 i2 mt2"><div class="pad">

<p>So what exactly did we lose? It's quite simple: by moving software into the cloud and turning them into web-based SaaS offerings, many of the basic affordances that used to be standard have gotten watered down or removed entirely. Here are some examples:</p>

<div class="mt1 mb1">
  <video controls="controls" src="https://acko.net/files/zoomer/menu-hover.mov" width="367" height="215" style="margin: 0 auto; display: block"></video>
  <p class="tc"><i>Menus let you cross over empty space and other menu items, instead of strictly enforcing hover rectangles.</i></p>
</div>

<div class="mt1 mb1">
  <video controls="controls" src="https://acko.net/files/zoomer/drag-window-icon.mov" width="469" height="152" style="margin: 0 auto; display: block"></video>
  <p class="tc"><i>You can drag and drop the file icon from a document's titlebar e.g. to upload it, instead of having to go look for it again.</i></p>
</div>

</div></div>

<div class="c"></div>

<div class="g10 i1"><div class="pad">

<div class="mt1 mb1">
  <video controls="controls" src="https://acko.net/files/zoomer/alt-menu.mov" width="672" height="175" style="margin: 0 auto; display: block"></video>
  <p class="tc"><i>Holding keyboard modifiers like CTRL or ALT is reflected instantly in menus, and used to make power-user features discoverable-yet-unobtrusive.</i></p>
</div>

</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>And here are some more:</p>

<ul class="indent">
  <li>You can browse years of documents, emails, … and instantly draft new ones. Fully off-line, with zero lag.</li>
  <li>You can sort any table by any column, and it will remember prior keys to produce a stable sort for identical values.</li>
  <li>Undo/redo is standard and expected, even when moving entire directories around in the Finder.</li>
  <li>Copy/pasting rich content is normal, and entirely equivalent to dragging and dropping it.</li>
  <li>When you rename or move a file that you're editing, its window instantly reflects the new name and location.</li>
  <li>You can also drag a file into an "open file" dialog, to select it there.</li>
  <li>When downloading a file, the partial download has a progress bar on the icon. It can be double clicked to resume, or even copied to another machine.</li>
</ul>

<p>It's always amusing to me to watch a power user switch to a Mac late in life, because much of their early complaints stem from not realizing there are far more obvious ways to do what they've trained themselves to do in a cumbersome way.</p>

<p>On almost every platform, PDFs are just awful to use. Whereas out-of-the-box on a Mac, you can annotate them to your heart's content, or drag pages from one PDF to another to recompose it. You can also sign them with a signature read from your webcam, for those of us who still know what pens are for. This is what happens when you tell companies like Adobe to utterly stuff it and just show them how it's supposed to be done, instead of waiting for their approval. The productivity benefits were&nbsp;enormous.</p>

</div></div>

<div class="c"></div>

<div class="g4 mt1">
  <img src="https://acko.net/files/zoomer/fountain-pen.jpg" alt="Fountain pen" />
</div>

<div class="g8"><div class="pad">

<p>As an aside, if all of this seems quaint or positively boomeresque, here's a tip: forcing yourself to slow down and work with information directly, with your hands, manipulating objects physical or virtual, instead of offloading it all to a cloud… this is not an anti-pattern. Neither is genuine note taking on a piece of paper. You should try it&nbsp;sometime.</p>

<p>At the time, many supposed software experts scoffed at Apple, deriding their products as mere expensive toys differentiated purely by "marketing". But this is the same company that seamlessly transitioned its entire stack from PowerPC, to x86, to x64, and eventually ARM, with most users remaining blissfully unaware this ever took&nbsp;place.</p>

<p>This is what the pinnacle of our craft can actually look&nbsp;like.</p>

</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>Apple didn't just knock it out of the park when it came to the OS or the overall UI: they also shipped powerful first-party apps like iMovie and Keynote, which made competing offerings look positively shabby. Steve Jobs used them for his own keynotes, arguably the best in the&nbsp;business.</p>

<p>Similarly, what set the iPhone apart was not just its touch interface, but that they actually ported a mature media and document stack to mobile wholesale. At that time, the "mobile web" was a complete and utter joke, and it would take Android years to catch up, whether it was video or music, or basic stuff like calendar invites and&nbsp;contacts.</p>

<p>It has <i>nothing</i> to do with marketing. Indeed, while many companies have since emulated and perfected their own Apple-style pitch, almost no-one manages to get away from that tell-tale "enterprise" feel. They don't know or care how their users actually want to use their products: the people in charge don't have the first clue about the fundamentals of product design. They just like shiny things when they see&nbsp;them.</p>

</div></div>

<div class="c"></div>

<div class="g12 mt1"><div class="pad">
<p class="tc"><img class="flat" src="https://acko.net/files/zoomer/imovie.jpg" alt="iMovie (2010)" /></p>
<p class="tc"><i>iMovie - 2010</i></p>
</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<h2 class="mt2">The Reactive Enterprise</h2>

<p>What does any of this have to do with React? Well it's very simple. Mac OS X was the first OS that could actually seriously claim to be reactive.</p>

<p>The standard which virtually everyone emulated back then was Windows. And in Windows, the norm—which mostly remains to this day—is that when you query information, that information is fetched once, and never updated. The user was just supposed to know that in order to see it update, they had to manually refresh it, either by bumping a selection back and forth, or by closing and reopening a dialog.</p>

</div></div>

<div class="c"></div>

<div class="g4 mt1">
<img class="flat" src="https://acko.net/files/zoomer/windows95.gif" alt="Windows 95" />
<p class="tc"><i>Windows 95</i></p>
</div>

<div class="g8"><div class="pad">

<p>The same applied to preferences: in Windows land, the established pattern was to present a user with a set of buttons, the triad of <i>Ok</i>, <i>Cancel</i> and <i>Apply</i>. This is awful, and here's why. If you click <i>Ok</i>, you are committing to a choice you haven't yet had the chance to see the implications of. If you click <i>Cancel</i>, you are completely discarding everything you did, without ever trying it out. If you click <i>Apply</i>, it's the same as pressing <i>Ok</i>, just the window stays open. None of the 3 buttons let you interact confidently, or easily try changes one by one, reinforcing the idea that it's the user's fault for being "bad at computers" if it doesn't do what they expect, or they don't know how to back&nbsp;out.</p>

<p>The bold Mac solution was that toggling a preference should take effect immediately. Even if that choice affects the entire desktop, such as changing the UI theme. So if that's not what you wanted, you simply clicked again to undo it right away. Macs were reactive, while Windows was transactional. The main reason it worked this way was because most programmers had no clue how to effectively make their software respond to arbitrary&nbsp;changes, and Microsoft couldn't go a few years without coming up with yet another ill-conceived UI framework.</p>

</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>This divide has mostly remained, with the only notable change being that on mobile devices, both iOS and Android tend to embrace the reactive model. However, given that much of the software used is made partially or wholly out of web views, this is a promise that is often violated and rarely seen as an inviolable constraint. It's just a nice-to-have. Furthermore, while it has become easier to <i>display</i> reactive information, the crucial second half of the equation—interaction—remains mostly neglected, also by&nbsp;design.</p>

</div></div>

<div class="c"></div>

<div class="g4 l mt1">
  <img src="https://acko.net/files/zoomer/tacoma.jpg" alt="Tacoma Narrows Bridge Collapse" />
  <p class="tc"><i><a href="https://en.wikipedia.org/wiki/Tacoma_Narrows_Bridge" target="_blank">Tacoma Narrows bridge collapse</a> (1940)</i></p>

  <img src="https://acko.net/files/zoomer/hyatt.jpg" alt="Tacoma Narrows Bridge Collapse" />
  <p class="tc"><i><a href="https://en.wikipedia.org/wiki/Hyatt_Regency_walkway_collapse" target="_blank">Hyatt Regency walkway collapse</a> (1981)</i></p>
</div>

<div class="g8 r"><div class="pad">

<p>I'm going to be cheeky and say if there's anyone who should take the blame for this, it's back-end engineers and the technology choices they continue to make. The very notion of "back-end" is a fallacy: it implies that one can produce a useful, working system, without ever having to talk to&nbsp;end-users.</p>

<p>Just imagine how alien this concept would be to an engineer before the software revolution happened: it'd be like suggesting you build a bridge without ever having to think about where it sits or who drives over it, because that's just "installation" and "surfacing". In civil engineering, catastrophes are rare, and each is a cautionary tale, never to be repeated: the loss of life was often visceral and brutal. But in software, we embraced never learning such&nbsp;lessons.</p>

<p>A specific evil here is the legacy of SQL and the associated practices, which fragments and normalizes data into rigid tables. As a result, the effect of any change is difficult to predict, and virtually impossible to reliably undo or&nbsp;synchronize after the fact.</p>

<p>This is also the fault of "enterprise", in a very direct sense: SQL databases and transactions are mainly designed to model business processes. They evolved to model bureaucratic workflows in actual enterprises, with a clear hierarchy of command, a need to maintain an official set of records, with the ability for auditing and&nbsp;oversight.</p>

</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>However, such classic enterprises were of course still run by people, by individuals. The bulk of the work they did was done offline, producing documents, spreadsheets and other materials through direct interaction and iteration. The bureaucracy was a means to an end, it wasn't the sole activity. The idea of an organization or country run entirely on bureaucracy was the stuff people made <a href="https://en.wikipedia.org/wiki/Brazil_(1985_film)" target="_blank">satirical movies</a>&nbsp;about.</p>

<p>And yet, many jobs now follow exactly this template. The activity is entirely coordinated and routed through specific SaaS apps, either off-the-shelf or bespoke, which strictly limit the available actions. They only contain watered down mockeries of classic desktop concepts such as files and folders, direct manipulation of data, and parallel off-line workstreams. They have little to no affordances for drafts, iteration or errors. They are mainly designed to appeal to management, not the&nbsp;riff-raff.</p>

<p>The promise of adopting such software is that everything will run more smoothly, and that oversight becomes effortless thanks to a multitude of metrics and paper trails. The reality is that you often replace tasks that ordinary, capable employees could do themselves, with a cumbersome and restrictive process. Information becomes harder to find, mistakes are more difficult to correct, and the normal activity of doing your job is replaced with endless form filling, box-ticking and notification chasing. There is a reason nobody likes JIRA, and this is it.</p>

<p>What's more, by adopting SaaS, companies put themselves at the mercy of someone else's development process. When dealing with an unanticipated scenario, you often simply <i>can't</i> work around it with the tools given, by design. It doesn't matter how smart or self-reliant the employees are: the software forces them to be stupid, and the only solution is to pay the vendor and wait 3 months or more.</p>

<p>For some reason, everyone has agreed that this is the way forward. It's insane.</p>

</div></div>

<div class="c"></div>

<div class="g12 mt1"><div class="pad">
<p class="tc"><img class="flat" src="https://acko.net/files/zoomer/oracle.png" alt="Oracle Cloud Stuff" /></p>
<p class="tc"><i>Oracle Cloud with AI Bullshit</i></p>
</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<h2 class="mt2">Circling Back</h2>

<p>Despite all its embedded architectural wisdom, this is a flaw that React shares: it was never meant to enable user freedom. Indeed, the very concept of Facebook precludes it, arguably the world's biggest lock-in SaaS. The interactions that are allowed there are exactly like any other SaaS: GET and POST to a monolithic back-end, which enforces rigid processes.</p>

<p>As an app developer, if you want to add robust undo/redo, comfy mouse interactions and drag-n-drop, keyboard shortcuts, and all the other goodies that were standard on the desktop, there are no easy architectural shortcuts available today. And if you want to add real-time collaboration, practically a necessity for real apps, all of these concerns spill out, because they cannot be split up neatly into a wholly separate front-end and back-end.</p>

<p>A good example is when people mistakenly equate undo/redo with a discrete, immutable event log. This is fundamentally wrong, because what constitutes an action from user's point of view is entirely different from how a back-end engineer perceives it. For example undo/redo needs to group multiple operations to enable sensible, logical checkpoints… but it also needs to do so on the fly, for actions which are rapid and don't conflict.</p>

<p>If you don't believe me, go type some text in your text editor and see what happens when you press CTRL-Z. It won't erase character by character, but did you ever think about that? Plus, if multiple users collaborate, each needs their own undo/redo stack, which means you need the equivalent of git rebasing and merging. You'd be amazed how many people don't realize this.</p>

<p>If we want to move forward, surely, we should be able to replicate what was normal 20 years ago?</p>

<p class="tc">
  <a href="https://supabase.com/"><img class="flat inline" src="https://acko.net/files/zoomer/supabase.webp" alt="SupaBase" style="width: 120px" /></a>
  <a href="https://tinybase.org/"><img class="flat inline" src="https://acko.net/files/zoomer/tinybase.svg" alt="TinyBase" style="width: 120px" /></a>
  <a href="https://rxdb.info/"><img class="flat inline" src="https://acko.net/files/zoomer/rxdb.svg" alt="RxDB" style="width: 120px" /></a>
  <br />
  <i>Real-time databases</i>
</p>

<p>There are a few promising things happening in the field, but they are so, so rare… like the slow-death-and-rebirth of <a href="https://acko.net/blog/the-database-is-on-fire/" target="_blank">Firebase</a> into open-source alternatives and lookalikes. But even then, robust real-time collaboration remains a 5-star premium feature.</p>

<p>Similarly, big canvas-based apps like Figma, and scrappy upstarts like <a href="https://www.tldraw.com/" target="_blank">TLDraw</a> have to painstakingly reinvent all the wheels, as practically all the relevant knowledge has been lost. And heaven forbid you actually want a decent, GPU-accelerated renderer: you will need to pay a dedicated team of experts to write code nobody else in-house can maintain, because the tooling is awful and also they are scared of math.</p>

<p>What bugs me the most is that the React dev team and friends seem extremely unaware of any of this. The things they are prioritizing simply don't matter in bringing the quality of the resulting software forward, except at the margins. It'll just load the same HTML a bit faster. If you stubbornly refuse to learn what <code>memo(…)</code> is for, it'll render slightly <i>less worse</i>. But the advice they give for event handling, for data fetching, and so on… for advanced use it's simply wrong.</p>

<p>A good example is that <a href="https://www.apollographql.com/docs/react/data/subscriptions/#subscribing-to-updates-for-a-query" target="_blank">GraphQL query subscriptions</a> in Apollo split up the initial <code>GET</code> from the subsequent <code>SUBSCRIBE</code>. This means there is always a chance one or more events were dropped in between the two. Nevertheless, this is how the library is designed, and this is what countless developers are doing today. Well okay then.</p>

<p>Another good example is implementing mouse gestures, because mouse events happen quicker than React can re-render. Making this work right the "proper way" is an exercise in frustration, and eventually you will conclude that everything you've been told about non-HTML-element <code>useRef</code> is a lie: just embrace mutating state here.</p>

<p>In fact, despite being told this will cause bugs, I've never had any issues with it in React 17. This leads me to suspect that what they were really doing was trying to prevent people from writing code that would break in React 18's concurrent mode. If so: dick move, guys. Here's what I propose: if you want to warn people about "subtle bugs", post a concrete proof, <a href="https://pocorgtfo.hacke.rs/" target="_blank">or GTFO</a>.</p>

<p class="mt2 mb2 tc" style="opacity: .5">* * *</p>

<p>If you want to build a truly modern, robust, desktop-class web app with React, you will find that you still need to pretty much make apple pie from scratch, by first re-inventing the entire universe. You can try starting with the pre-made stuff, but you will hit a wall, and/or eventually corrupt your users' data. It's simply been my experience, and I've done the React real-time collaboration rodeo with GPU sprinkles on top multiple times now.</p>

<p>Crucially, none of the React alternatives solve this, indeed, they mostly just make it worse by trying to "helpfully" mutate state right away. But here's the annoying truth: you cannot skip learning to reason about well-ordered orchestration. It will just bite you in the ass, guaranteed.</p>

<p>What's really frustrating about all this is how passive and helpless the current generation of web developers seem to be in all this. It's as if they've all been lulled into complacency by convenience. They seem afraid to carve out their own ambitious paths, and lack serious gusto for engineering. If there isn't a "friendly" bot spewing encouraging messages with plenty of 👏 emoji at every turn, they won't engage.</p>

<p>As someone who took a classical engineering education, which included not just a broad scientific and mathematical basis, but crucially also the necessary engineering <i>ethos</i>, this is just alien to me. Call me cynical all you want, but it matches my experience. Coming after the generation that birthed Git and BitTorrent, and which killed IE with Firefox and Konqueror/WebKit, it just seems ridiculous.</p>

<p>Fuck, most zoomers don't even know how to <i>dance</i>. I don't mean that they are <i>bad</i> at dancing, I mean they literally <i>won't try</i>, and just stand around awkwardly.</p>

<p>Just know: nobody else is going to do it for you. So what are you waiting for?</p>

</div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Zero to Sixty in One Second]]></title>
    <link href="https://acko.net/blog/zero-to-sixty-in-one-second/"/>
    <updated>2013-08-23T00:00:00+02:00</updated>
    <id>https://acko.net/blog/zero-to-sixty-in-one-second</id>
    <content type="html"><![CDATA[<style type="text/css" media="screen">
  .visualizer-activate {
    display: none;
  }
  .visualizer-activate a {
    display: block;
    position: absolute;
    left: 50%;
    top: 37%;
    width: 50px;
    height: 50px;
    margin-left: -25px;
    margin-top: -25px;
    text-align: center;
    vertical-align: middle;
    line-height: 58px;
    font-size: 28px;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    padding-left: 4px;
    border-radius: 25px;
    color: #fff;
    background: rgb(108,123,132);
    box-shadow: 0 2px 0 rgb(84,98,105);
    box-shadow: 0 2px 0 rgb(84,98,105),
                0 0px 5px rgb(255,255,255),
                0 0px 20px rgb(255,255,255);
  }
  .visualizer-activate a.pause {
    display: none;
    opacity: .5;
    transition: opacity .1s ease-in-out;
    -webkit-transition: opacity .1s ease-in-out;
    line-height: 56px;
  }
  .visualizer-activate:hover a.pause {
    opacity: 1;
  }

</style>

<script type="text/javascript">
// <!--
window.Acko && Acko.queue(function () {
  if (window.gl) {
    var p = document.querySelector('.visualizer-activate');
    p.innerHTML = '<a href="#" class="play"><span class="icon-play"><span></span></span></a>'+
                  '<a href="#" class="pause"><span class="icon-pause"><span></span><span></span></span></a>';
    p.style.display = 'block';
    p.children[0].addEventListener('click', function (e) {
      e.preventDefault();
      gl.exports.visualizer.quietFrames = -420*60;
      gl.exports.visualizer.start();
      this.style.display = 'none';
      this.parentNode.children[1].style.display = 'block';
    });
    p.children[1].addEventListener('click', function (e) {
      e.preventDefault();
      gl.exports.visualizer.quietFrames = 0;
      gl.exports.visualizer.stop();
      this.style.display = 'none';
      this.parentNode.children[0].style.display = 'block';
    });
  }
});
// -->
</script>

<div class="g8 i2"><div class="pad">

<h2 class="sub">Fusing WebGL, CSS 3D and HTML</h2>

<p><em>Ladies and gentlemen, this is your captain speaking. Today's flight on WebGL Air will take us high above the cloud. Those of you sitting in Chrome class, on the desktop side of the plane, will have the clearest view. Internet Explorer class passengers may turn to their in-seat entertainment system instead. Passengers are reminded to put away their iPads and iPhones during take off and landing.</em></p>

<p><em>Edit: You can now also watch the <a href="http://www.youtube.com/watch?v=zjwA1VmuPnw">YouTube video</a> kindly provided by Leland Batey.</em></p>

<p>Acko.net, the domain, just turned 13, so it's time for a birthday present in the form of a complete front-end rewrite. The last design was entirely based on CSS 3D: it was a fun experiment, but created at a time when browser implementations were still wonky. It ultimately proved impractical: the DOM is not a good place to store complicated geometry. It's too bulky and there is a huge difference between a styled <code>&lt;div&gt;</code> and a shaded quad. After adding WebGL to the mix with MathBox and typesetting with MathJax, it turned into a catastrophic worst case for loading, and the smoothness was often lost even on fast computers.</p>

<p>Since then, we've seen a big push for rendering performance, both from the native and JS side. Hardware-accelerated DOM compositing is better understood, <code>requestAnimationFrame</code> is now common-place and reliable, and we have excellent profiling tools down to the frame level.</p>

<p>Hence the goal: to fuse 3D elements into the page like before, but with full 60 <span title="frames per second">fps</span> rendering. Plus to use WebGL instead of CSS 3D where possible, and be free of the constraints of the DOM.</p>

<p>Like <a href="http://www.voodoojs.com/">Voodoo.js</a> I use a fixed full-screen canvas and sync up scrolling with a 3D camera. The scene is mapped to CSS pixels and CSS perspective is locked to the camera. Once HTML, CSS 3D and WebGL are all in sync there's a truckload of <a href="http://acko.net/files/fullfrontal/fullfrontal/webglmath/online.html">linear algebra</a> and easing functions to keep you amused. The code is based on the platform I kludged together for the christmas demo, at times a mess of ad hoc demo formulas and spaghetti, though robust enough in the parts that count.</p>

</div></div>

<div class="c"></div>

<div class="wide mt2">
  <a target="_blank" href="http://daim.org/"><img src="https://acko.net/files/zerotosixty/daim.jpg" alt="Daim Graffiti" /></a>
</div>

<div class="g8 i2 mb1">
  <a target="_blank" class="credit" href="http://daim.org/">Daim</a>
</div>

<div class="g8 i2"><div class="pad">

<h2>Procedural Wildstyle</h2>

<p>The <em>so Designers Republic</em> kitsch of last time was starting to grate, and I wanted something more stylish. Taking inspiration from street art and graffiti, in particular long-time favorite <a href="http://daim.org/">Daim</a>, Acko's gone wild, though with a math twist. This design was built procedurally using some nifty vector calculus and more difference equations than you can shake a stick at.</p>

<p>At its heart it's really a game of Snake, albeit a complicated one. Starting from a line-based skeleton of the model, the curves are traced out, smoothed, oriented and finally extruded on the fly into ribbons. The final pose shows 261 lines mapped to 2,783 curve segments, tessellated into 43,168 triangles, though that amount is just a knob that can be tuned. In other words, it's a <em>scalable vector graphic</em>. No images were harmed in the making of this header, or the rest of the window dressing for that matter. These pixels are local, organic and bespoke, though I'm pretty sure they're not vegan.</p>

</div></div>

<div class="c"></div>

<div class="wide mt2 mb2 draggable">
  <img src="https://acko.net/files/zerotosixty/skeleton.png" alt="Mesh Skeleton" data-replace="gl.exports.tracks.exportTracks()" data-position="[0, -150, 150]" data-rotation="[.3, 0, 0]" />
</div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>The ribbons need to animate, so I'm using a slightly exotic set up: a single Three.js <code>BufferGeometry</code> mesh is created with all the ribbons' topology in it. It only contains the connectivity of the triangles that span the vertices, stored as indices. The actual positions and normals are read from a texture that is updated on the fly by JavaScript using <code>gl.texSubImage2D</code>.</p>

</div></div>

<div class="c"></div>

<aside class="g6 mt1 tc pr"><div class="pad">
  <img src="https://acko.net/files/zerotosixty/geometrytexture.png" alt="Ribbon Geometry Texture" data-replace="gl.exports.tracks.exportTexture()" />
  <p>This is the actual geometry data for the header, stored in a 288×256 RGBA texture (floating point). The columns alternate between position and normal.</p>
  <p class="visualizer-activate"></p>
</div></aside>

<div class="g6"><div class="pad">

<p>As a ribbon follows its path, only its head and tail change, growing new segments or collapsing older ones. Each ribbon scrolls through the texture, which alters only a fraction of the total data per frame. Both the head and tail can add and remove segments at will, which allows me to vary the geometrical detail along each path. As long as the number of drawn segments at any given time never exceeds the texture height, a ribbon could in theory follow an infinitely long trail, wrapping around the edge endlessly. They're basically semi-virtualized meshes, allocated out of a fixed memory space. The arrows are an easy upgrade: I allocate a couple additional segments at the end and shape them to the right widths.</p>

<p>To draw a ribbon, I draw one contiguous subset of the total mesh (or two, if wrapping around the edge) which maps into a rectangular area of the texture. Ribbon color is stored statically as a vertex attribute, which means the entire hero piece can be drawn using a single shader, texture and vertex buffer.</p>

<p>For the background, I added a static <code>BufferGeometry</code> clocking in at 3,344 triangles. It consists of rounded boxes laid out in a randomized hyperboloid pattern. Aside from breaking the uniform whiteness, it's also quite the parallax enhancer down here.</p>

</div></div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<h2>DJ Ambient</h2>

<p>All of this is shaded with some custom GLSL. I use a basic Blinn-Phong lighting model tweaked for aesthetics, and there's some edge highlights and fog to top it off. But if I left it there, the result would still look pretty flat, without shadows. A common approach is to use shadow mapping, but that only works for point sources like the sun. The diffuse shadows that you see on an overcast day require an entirely different approach.</p>

</div></div>

<aside class="g3 i2 mt1 tc ol1"><div class="pad">
  <a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter14.html" target="_blank"><img src="https://acko.net/files/zerotosixty/ao1.jpg" alt="Ambient Occlusion" /></a>
  <p>No shadows</p>
</div></aside>

<aside class="g3 mt1 tc ol1"><div class="pad">
  <a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter14.html" target="_blank"><img src="https://acko.net/files/zerotosixty/ao2.jpg" alt="Ambient Occlusion" /></a>
  <p>Ambient occlusion</p>
</div></aside>

<aside class="g3 mt1 tc ol1"><div class="pad">
  <a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter14.html" target="_blank"><img src="https://acko.net/files/zerotosixty/ao3.jpg" alt="Ambient Occlusion" /></a>
  <p>One indirect light bounce</p>
</div></aside>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>What's needed is <a href="http://en.wikipedia.org/wiki/Ambient_occlusion" target="_blank">ambient occlusion</a>, a measure of how much skylight is obscured by the surrounding geometry at every point. The less sky you can see from a point, the darker it should be. This is slow to compute analytically for large scenes and hence is typically either faked or baked in. An easy hack is <a href="http://en.wikipedia.org/wiki/Screen_space_ambient_occlusion" target="_blank">Screen-Space AO</a>, which is really just <em>crease darkening</em> using the final image's depth buffer. It's clever but expensive, creating only local shadows. Quality can vary a lot between implementations, often creating distracting dark or light halos around silhouettes. They all share the same blind spot: only the currently visible pixels can cast any shadow. So while I added <a href="http://alteredqualia.com/three/examples/webgl_postprocessing_ssao.html" target="_blank">alteredq's SSAO shader</a>, it's disabled by default and only rendered at quarter resolution, upscaled with a bilateral filter to hide this fact.</p>

<aside class="tc mt2 mb2">
  <p><img src="https://acko.net/files/zerotosixty/ssao.jpg" alt="Screen-space Ambient Occlusion" /></p>
  <p class="mt0">Screen-space ambient occlusion (SSAO) in CryEngine 2</p>
</aside>

<p>Instead, I used a technique from NVidia's <em>GPU Gems 2</em>. It uses a <a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter14.html">disc-based model</a> to calculate occlusion and even indirect lighting on the fly. Rather than go real-time on the GPU, I decided to only do it statically in JS, and just do plain occlusion without light bounces.</p>

<p>The discs for all the ribbons are generated ahead of time, and the disc-to-disc shadowing is done once for the final model in two passes. The first pass overestimates due to overlapping shadows and thus is too dark. The second pass uses the first to assign lesser weights to discs in shadow to compensate, then runs the algorithm anew.</p>

<p>There's another simplification: instead of small one-sided discs based on the real geometry, I use large two-sided discs and treat each ribbon as flat. Each disc occludes in both directions, but accumulates shadow on its front and back separately.  This gives a decent approximation of light around and across the entire object.</p>
  
<p>Below is the actual disc model. In this diagram, the two radii of each disc represent its front and back illumination, with smaller discs receiving more shadow. The crosshairs mark the real disc radius.</p>

</div></div>

<div class="c"></div>

<div class="wide mt2 mb2 draggable">
  <img src="https://acko.net/files/zerotosixty/discs.png" alt="Occlusion Model" data-replace="gl.exports.tracks.exportDiscs()" data-position="[0, -150, 150]" data-rotation="[.3, 0, 0]" />
</div>

<div class="c"></div>

<div class="g8 i2"><div class="pad">

<p>When streaming out new pieces of ribbon, the occlusion is baked in on the fly, stored in the unused alpha channel next to the position (RGB). The four nearest discs on the ribbon are interpolated bilinearly, and the vertex's normal and position is used to mix the front and back shadow values appropriately. Thus it's effectively trilinear filtering a 2×2×N voxel grid per ribbon, which snakes and twists along its length.</p>

<p>I'm very happy with how good it looks, even with very coarse divisions like this. Unlike SSAO it costs practically nothing once generated. If you wish, you can view the design <a href="http://acko.net/#white" target="_blank">entirely in white</a> to examine the lighting—or in <a href="http://acko.net/#sepia" target="_blank">black and white</a>, or in <a href="http://acko.net#70s" target="_blank">the seventies</a>, tone mapping is fun.</p>

<p>To ensure smooth rendering, the resolution is scaled down if it drops below 45 fps for several frames. This is essential on slower GPUs, but can sometimes over&shy;compensate, as WebGL is easily interrupted by other tasks on the machine. The browser doesn't tell you how much you're currently pushing it, so it's impossible to safely scale back up without causing more stutters. To mitigate this problem, I built in some strategic reset points, like when you focus the window or scroll to the top. In the end, 60fps happens more often than not, though it remains a goal rather than a guarantee. If you fullscreen your browser, you are now the bane of my existence, especially if you keep two dozen other windows open on the second monitor at the same time. On an underpowered retina MacBook.</p>

<p>Finally I also turned on <a href="http://mynameismjp.wordpress.com/2012/10/24/msaa-overview/" target="_blank">MultiSample Anti-Aliasing</a> to avoid the dreaded jaggies and make the vector style shine. It's substituted with <a href="http://en.wikipedia.org/wiki/Fast_approximate_anti-aliasing" target="_blank">Fast Approximate AA</a> if it's unavailable. FXAA is also used if SSAO is enabled, as you can't post-process multisampled images with WebGL.</p>

<p>Preparing all of this would take ~400ms on my 4 year old laptop, but most of that is spent on the occlusion which is static. Hence, I saved the lighting data into a JSON file for speedier loading, which cuts it down to ~100ms. The data gzips into 18KB, about the size of a small PNG, so no worries there. Add to that the time required to fetch and run the rest of the page, and we can call it an even second.</p>

<p>Of course, it only works on a subset of browsers and leaves the vast majority of mobile devices out in the cold. It does work in Chrome Beta on Android, though performance and stability is still pretty crap and more fixes are needed, both in the browser and in my own code. Rather than try and emulate some of the bling for CSS 3D-only environments, it's all or nothing. Without WebGL, you get plain images.</p>

<h2>Achievement Unlocked</h2>

<p>Reading all that, you might mistake the header as a mere love letter to hackery. But there's a twist, quite a literal one. The twisting of each ribbon is not generated arbitrarily, but mathematically derived. It embodies the differential principle of <a href="https://en.wikipedia.org/wiki/Parallel_transport" target="_blank">parallel transport</a>. The up direction changes parallel to each curve, which means the ribbons never rotate in place. They only turn when they naturally want to. Hence, the design kind of has a will of its own. I can set the initial up direction of a ribbon, but only affect it through its curved path. Arranging and tuning all the ribbons was a nice puzzle in itself, and it's a nice nod to the math that's all over the place, even if it is invisible.</p>

<p>As I started playing around with some screensaver-style shots, I realized it would make a pretty neat demo just by itself, so I built that in too, to the dulcet tones of <a href="http://www.selahsue.com/" target="_blank">Selah Sue</a>—whose last name I hope is not indicative. Here parallel transport would ensure a perfectly smooth ride, but that's not exciting, so there's some springy exponential easing with adaptive lookahead instead. That's on top of the secondary demo, which features an audio visualizer and the smooth drum and bass of <a href="http://www.secretoperations.com/" target="_blank">Seba</a>. There's maybe a third one too.</p>

<p>The songs are used here <em>entirely for educational purposes</em> of course. Not that it matters, since they're all on YouTube anyway. Click the Growl-like notifications to find out more about the artists. There's also a handful of achievements to be gathered, eight to be precise. Some of these are experiments that were turned off in the final version. Others are... trickier. Oh hey, did you notice the JS console?</p>

<p>By the way, special mention also goes to Time and how some browsers keep terrible track of it. Like when you're trying to sync a demo to a stuttery <code>&lt;audio&gt;</code> clock, Firefox ಠ_ಠ. There's also the matter of what to do when the user switches to another tab, and the answer is.... it'll desync, because I don't want to be sapping resources in a background tab. Minor constraints of putting on a live act, doors close after the show starts.</p>

<p class="tc mt2">
  <img src="https://acko.net/css/images/growl-large-01.png" class="inline flat" width="112" height="112" alt="Achievement Unlocked" />
  <img src="https://acko.net/css/images/growl-large-02.png" class="inline flat" width="112" height="112" alt="Information" />
  <img src="https://acko.net/css/images/growl-large-03.png" class="inline flat" width="112" height="112" alt="Music" />
</p>

<h2>Turn Right Past The Header</h2>

<p>The refresh-less navigation is also back from last time, slightly cleaned up. It still works on the same basic principle of fetching static, full HTML documents. However the transition mechanism now carefully choreographs the necessary DOM manipulation to avoid stutters: any image, iframe or video inserted in the content would mean future paints at an unknown time, so they're postponed until after the transition is complete. I did it the dirty but fast way, with string manipulation before it hits the DOM: such is the luxury of being the only one, person or machine, writing the markup.</p>

<p>Which leaves of course the content. But don't fix what ain't broke: distraction-free publishing is easy enough with Jekyll and a responsive 960 pixel grid with sideburns, so things still look and work mostly the same. I only added a home for my math talks and expanded the front page to highlight some demos and experiments. I aim to keep focusing on quality rather than quantity, and to remind visitors what the web looks like when you take away everything social media's done to it.</p>

<p>It's also fun to observe that after many years, the unified front-end convergence really has arrived. There is little difference between this site and the games that use HTML for their UI, such as the latest Sim City. For dealing with typography, illustration and UI, you want the comfort of DOM and CSS. For real-time graphical content, you'll want to draw it yourself, either in 2D, or 3D. Combine the two, and you get what game developers have been doing for years. Only this lacks all the sharp C bits, which game devs been replacing with Lua for years anyhow. That's Portuguese for "JavaScript" by the way.</p>

<p>So there you have it. A fresh look with a pile of juicy hax, and hopefully not too many bugs in the wild. Thanks go to all those who came before and provided all these toys for me to play with. You can too, for the source is <a href="https://github.com/unconed/fuse10/" target="_blank">entirely on Github</a>. Like I said, <em>educational</em>. Meanwhile I'll be over here, listening to the <a href="http://en.wikipedia.org/wiki/Wipeout_(video_game)" target="_blank">wipE'out"</a> <a href="http://www.coldstorage.org.uk/" target="_blank">soundtrack</a> on repeat in memory of the old one. Comments welcome on <a href="https://plus.google.com/112457107445031703644/posts/6xhyep1357J">Google Plus</a>.</p>

<p><em>PS: The previous version <a href="http://acko.net/files/slacko/" target="_blank">has been archived</a> with its fallbacks disabled so you can see the current state of CSS 3D in browsers. Still pretty broken. Still a great test case. So is the <a href="/blog/this-is-your-brain-on-css/">disembodied head</a>.</em></p>

</div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Noir meets web]]></title>
    <link href="https://acko.net/blog/noir-meets-web/"/>
    <updated>2008-10-23T00:00:00+02:00</updated>
    <id>https://acko.net/blog/noir-meets-web</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad">
  
<p>After 4 years of LeuvenSpeelt.be aka the <em>Interfacultair Theaterfestival</em> at my old university, the organisers are calling it quits. I was their resident web monkey, and designed a <a href="/tag/theater">new site and poster every year</a>. I always saw these designs as an opportunity to explore unconventional web design, as the sites were low on content and high on marketing — essentially being fancy brochures with a news feed.
</p>

<p>
With a track record of originality, I figured we should end it in style, so I whipped up a new page which explains the reasons for quitting (i.e. the politics) and highlights the work done with a timeline and some photos.
</p>

<p class="tc">
<a href="/files/leuvenspeelt/2009/index.html"><img class="natural" src="/files/leuvenspeelt/itf2009.jpg" alt="" /></a>
</p>

<p>
I wanted the reader to get a sense of ambiguity and dread that comes with ending big projects, so for inspiration I looked to Film Noir, known for its mystery and shady morals. The scene is meant to look like the desk of the typical private detective, who is trying to make sense of a case.
</p>

<p>
The end result was pretty close to how I imagined it, though the limitations of the web as a medium required me to tone down the contrast quite a bit for readability. This makes it lose some of the noir-ness, but overall the cohesion of the piece is still right. Because it's just a good-bye page, it probably won't get as much exposure as the previous editions, but it's the thought that counts.
</p>

<p>
I think it's a fitting end to a project that, more than anything else, has taught me about graphical design and style.
</p>

<p>
Tools used: 3D Studio Max (with Mental Ray), Photoshop, TextMate
</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Welcome to the World of Tomorrow!]]></title>
    <link href="https://acko.net/blog/welcome-to-the-world-of-tomorrow/"/>
    <updated>2008-07-20T00:00:00+02:00</updated>
    <id>https://acko.net/blog/welcome-to-the-world-of-tomorrow</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p><small>(with apologies to <a href="http://en.wikipedia.org/wiki/Futurama">Matt Groening</a>)</small>
</p>

<p>
After about <a href="/blog/new-design-for-acko-net">two years</a>, it's time for another make-over of my site.
</p>

<p>
My last design had a relatively quirky look, with a bold red/yellow theme built from various irregular vector shapes. The idea was to step away from the typical mold of rectangular aligned frames on a page. I tried to incorporate some elements of perspective into the page composition, but it ended up being a relatively flat, geometrical theme.
</p>

<p>
This time I wanted to work on the depth aspect and try to create something that feels spacious. To do this, I based the entire redesign on a two-point perspective. While the content itself is normal 2D markup, it sits in a 3D frame.
</p>

<p>
<img class="natural" src="/files/redesign-2008/wirepron.png" title="Some of the guide lines used in the construction process." alt="" /></p>

<p>
<img class="natural" src="/files/making-love-to-webkit/old-acko.png" alt="" /></p>

<p>
The header image is a regular illustration file (which is 100% manual vector work) and the content is typical HTML/CSS. However there is a twist: the perspective from the header is continued into the content with some simple 3D decorations, created on-demand with Canvas tags and JavaScript (<a href="javascript:void(0);" onclick="highlightCanvases();return false;">highlight canvases</a>, check out the footer).
</p>

<p>
While this perspective works perfectly near the top, the further down you go, the more vertically stretched the shapes get and it ends up looking weird. To compromise, the projection actually gets more and more isometric the further down you go. This creates an interesting effect when scrolling down.
</p>

<p>
The design also uses various CSS3 methods (@font-face, text-shadow, box-shadow) throughout, and uses sIFR 3 as a fallback for the headline font. Unfortunately CSS3 is still mostly unsupported in the browserscape, so only Safari 3.1 users get the luxury combo of <em>pretty, fast and no Flash</em>. Everyone else will have to suffer through hacks.
</p>

<p>
As a total surprise, the canvas-rocket-science trickery even works in IE6 thanks to Google's <a href="http://excanvas.sourceforge.net/">ExplorerCanvas</a> library.
</p>

<p>
I'll probably be tweaking it a bit more in the days to come, but feedback is appreciated.
</p>

</div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Poster design for Interfacultair Theaterfestival 2008]]></title>
    <link href="https://acko.net/blog/poster-design-for-interfacultair-theaterfestival-2008/"/>
    <updated>2008-02-28T00:00:00+01:00</updated>
    <id>https://acko.net/blog/poster-design-for-interfacultair-theaterfestival-2008</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>The design is meant to look like the cover of a board game box and accompanies the <a href="http://acko.net/blog/because-there-are-too-many-serious-websites-around">web site</a>'s design.
</p>

<p>
<a href="/files/leuvenspeelt/itf-affiche-2008.png"><img class="natural" src="/files/leuvenspeelt/itf-affiche-2008-thumb.png" alt="Poster design" /></a>
</p>

</div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Because there are too many serious websites around]]></title>
    <link href="https://acko.net/blog/because-there-are-too-many-serious-websites-around/"/>
    <updated>2008-02-07T00:00:00+01:00</updated>
    <id>https://acko.net/blog/because-there-are-too-many-serious-websites-around</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>I finished designing and building this year's edition of <a href="http://www.leuvenspeelt.be/">LeuvenSpeelt.be</a>, a site that promotes student theater at my old university. You can <a href="/tag/theater">read about the background</a> in my previous blog posts.
</p>

<p>
<a href="http://www.leuvenspeelt.be/"><img class="natural" src="/files/leuvenspeelt/leuvenspeelt2008.jpg" alt="LeuvenSpeelt.be 2008 screenshot" title="LeuvenSpeelt.be - Promoting amateur theater by students" /></a>
</p>

<p>
The site is a simple Drupal installation with heavy content and theme work. The design is heavy on graphics and built as an experimental semi-fluid layout that adapts to different screen resolutions. Peripheral design elements are shifted in or out of the browser frame to make more space for content as needed.
</p>

<p>
Tools used: Photoshop, Illustrator, 3D Studio Max, TextMate. Uses the beautiful Fontin font available freely from Jos Buivenga's <a href="http://www.josbuivenga.demon.nl/index.html">exljbris</a> foundry.
</p>

<p>
And no, no easter eggs this year.</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Design presentation slides]]></title>
    <link href="https://acko.net/blog/design-presentation-slides/"/>
    <updated>2007-03-22T00:00:00+01:00</updated>
    <id>https://acko.net/blog/design-presentation-slides</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>I did my OSCMS talk <a href="/blog/oscms-talk-designer-eye-for-the-geek-guy-gal">Designer eye for the geek guy</a> today. My main plan for this talk was to blast as much basic graphical design concepts into people's heads as possible and sort of teach some of the principles, vocabulary and methods that a lot of designers take for granted.
</p>

<p>
The response was great as far as I could tell. I also got the inevitable "How do we deal with Internet Explorer?" spin-off discussion in the questions round at the end ;).
</p>

<p>
<a href="http://www.blkmtn.org/">Steven Peck</a> <a href="http://video.google.com/videoplay?docid=4892104132825691414&amp;hl=en">recorded my session</a> on video.
</p>

<p>
You can <a href="http://acko.net/files/design-eye/Design%20Eye%20for%20the%20Geek%20Guy-Gal%20-%2022%20March%202007.pdf">download the slides as PDF</a> (36.5 MB), though because of all the graphics it's quite large. I think some sections will not be clear at all without the spoken explanation to go along with it though.
</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Announcing.... ComicJuice!]]></title>
    <link href="https://acko.net/blog/announcing-comicjuice/"/>
    <updated>2007-03-06T00:00:00+01:00</updated>
    <id>https://acko.net/blog/announcing-comicjuice</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad">
  
<h1>Announcing.... ComicJuice!</h1>
  
<p>I'm proud to announce the start of ComicJuice, a web 2.0 social mashup tool that lets you create comics in your browser and share them with others.
</p>

<p>
<em>Update: Now with Internet Explorer support! Thanks to <a href="http://code.google.com/p/explorercanvas/">Google's ExplorerCanvas</a>. Viewing comics works in IE6 and 7, while editing still requires IE7.</em>
</p>

<p>
<iframe style="margin: 0 auto;" width="425" height="349" src="http://www.youtube.com/embed/qhVMU48GfvE" frameborder="0" allowfullscreen="allowfullscreen"></iframe>
</p>

<p>
The crazy part is that I started working on this only friday evening (that's 4 days ago). Once I had the initial idea and a rough plan, I simply couldn't not code it.
</p>

<p>
A lot of jQuery and JavaScript later, with some &lt;canvas&gt; wizardry (boy is that thing inconsistent across browsers), we have a fully-fledged comic creator. The best part is that all of it is rendered client-side, so no actual images need to be generated. To display a comic, we use the same code as the editing interface. The down-side is that it doesn't work in IE, but I've been thinking about maybe doing a rough canvas emulation. We'll see. For now, the latest versions of Safari, Firefox and Opera have been tested and work well.
</p>

<p>
You can also embed comics with iframes, and copy/pastable code is provided. Like this lame example:
</p>

<p><em>(No longer available)</em></p>

<p>
I figured a Web 2.0 mash-up would not be complete without a fitting design to go in, so I designed icons, sliders and toolbars for the editor, as well as a theme for the website. The theme is a Garland knock-off: I guess I'm proving myself wrong that it's a bad base theme. It's actually quite good as it has fluid/fixed 1-3 column layouts in it.
</p>

<p>
I'm curious to see if ComicJuice takes off and what people do with it. It was a blast to code in any case. Check it out.</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Drupal's Designer Future]]></title>
    <link href="https://acko.net/blog/drupals-designer-future/"/>
    <updated>2007-03-01T00:00:00+01:00</updated>
    <id>https://acko.net/blog/drupals-designer-future</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>In the past months I've been doing a lot more graphical design, and it's caused me to think about how it relates to Drupal. This prompted me to write a rather long blog piece with some insights and a call to action. If you are interested in the future of Drupal, please read on.<!--break-->
</p>

<p>
The trigger was that I noticed that I'm getting less and less motivated to do graphics work for Drupal. It's not that I don't like design... I loved designing and building that LeuvenSpeelt.be site last month for example. But when it comes to Drupal graphics, the personal reward that I feel from doing it doesn't seem proportional to the effort I put in. This includes designing little banners for the Drupal.org spotlight, doing a t-shirt, making ad buttons, doing the association theme and more.
</p>

<p>
The most recent big example was the Garland theme. When Stefan Nagtegaal showed a work-in-progress version of his 'Themetastic' theme (as it was then called) in September, I was instantly charmed and knew that this was our new default theme in the making and said so clearly.
</p>

<p>
Many others were not convinced though and hammered on details, even though the basic design for the theme was rock solid. Some were not convinced of the theme's potential, or simply didn't see that we needed a theme that was graphically smashing rather than a good base to develop on.
</p>

<p>
At that point, I essentially said "screw the community, this is going to be our default theme" and started refining the theme so it was perfect for core. This took several weeks.
</p>

<p>
Until then, the rest of the community put its eggs in the wrong baskets and got a lot of useless design-by-committee done. These designs, which were in my opinion mediocre at best, were being pushed for inclusion. This may sound a bit harsh, but I honestly believe that if the most popular candidate theme, Deliciously Zen, had become the new default core theme, we'd have been ridiculed for still not 'getting' design after 6 years and Drupal 5 would not have been such a big release. Just like 4.7, most people would not stick to Drupal long enough to discover how good it is.
</p>

<p>
Now, when the Garland theme was finally done, everyone suddenly changed their opinion and congratulated <em>the community</em> on its excellent work. I have to admit this hit a nerve, especially after I'd been spending countless days and nights the two weeks before fixing annoying IE rendering bugs, redoing the CSS layout and adding a whole new layer of Glitz und Glanz to Drupal core.
</p>

<p>
Only three people did serious work on what became the Garland theme: Stefan Nagtegaal did the original design from scratch and worked with Adrian Rossouw to come up with a proof-of-concept of the recolorable theme. I wrote the color picker, improved the theme and coded what became the color.module based on Adrian's stuff.
</p>

<p>
Only a handful of people helped with testing of the theme during its development and only after the main theme was finished — most of the bugs were in the recoloring mechanism. How can such a vital piece of Drupal 5 have only have 3 serious contributors, when the whole release had almost 500 people submitting <em>patches</em>?
</p>

<p>
To me, this shows that we have a problem in the Drupal community, or rather a knowledge void. Not enough Drupal people are savvy enough about theming and design to help out with even small tasks (like a banner) or even give quality tips and feedback on other work.  The result is that theming and design receives little attention. Most contributed themes and sites could look a lot better, if they just themed it some more. And getting patches into core that give the defaults a little more oomph is tough, as they are often considered to be useless embellishments.
</p>

<p>
Still, ever since Drupal started, there has been the recurring cry of doing more to attract great designers to the platform. The overall effects of this have been minimal. However, something similar did happen before.
</p>

<p>
Before Drupal 4.0 was released, the focus was mainly on features and Drupal was a highly experimental project. After a while, as more people started using it, many users complained that Drupal was too hard or confusing to use. Because of this, 4.0 was the first of many releases that contained significant usability improvements, in this case in the administration area. Many small and large usability features were added. With the menu system and tabs having been added to core by Drupal 4.5, even contributed modules started using the same UI concepts as core. Drupal's UI ended up much more consistent across configurations and it became easier to learn and document. Now with Drupal 5.0, we have undoubtedly produced the most usable release yet.
</p>

<p>
How did this happen? Over the years, the idea has popped up many times to bring usability experts on board to do a review, and the hope has lived that a usability expert or two will magically pop up in the community and solve all our problems (sound familiar?). Neither has happened so far.
</p>

<p>
What did happen is that usability became a big priority for the project, and as a result, many people started educating themselves about it. The community quickly identified those in its ranks knowledgable about usability and listened to their advice. Soon, big UI gurus were being quoted on the mailing lists and "-1 isn't usable" became a valid reason to dismiss a feature. Sure, this process took time, but it definitely happened. Plus, the combined usability knowledge and effort of the community, though individually not at expert level, had a much larger effect in the long run than any single expert could have.
</p>

<p>
The same needs to happen for design. For years now, the Drupal community has been hoping for a group of prodigy designers to magically appear and design a set of jaw dropping themes and UI. They have not shown up. Talking and maintaining a high quality of design across Drupal still often feels like swimming upstream, because most community members don't care much for design unless it is delivered in front of their noses on a silver platter. For many, design is still something to only be enjoyed, not something to be created.
</p>

<p>
Now, I really want to see this change. For one thing, the shortage of design talent means Drupal is generally perceived to be ugly. It's quite demotivating, because we put a lot of time into it. Unfortunately people illogically, but consistently, assume a relation between how something looks and how good it is built. With Drupal 5 we've done a lot to improve this, but we could still do a lot better. Drupal is no OS X (yet).
</p>

<p>
For another, when only a handful people are always doing the same jobs, the passion tends to slip out and the challenge becomes a chore. I honestly have no ideas left for a spotlight banner at the moment. That's why the <a href="http://drupal.org/themes/bluebeach/spotlight/performance-scalability.png">scalability banner</a> is so mind-numbingly boring, though I made <a href="http://drupal.org/node/15209">plenty of cool ones</a> before.
</p>

<p>
This is also why I'm holding that <a href="http://acko.net/blog/oscms-talk-designer-eye-for-the-geek-guy-gal">OSCMS talk about design</a> this month: I want more people to realize that if your site and/or module is ugly, people aren't going to like it or use it. It's as simple as that. If you mess up something as basic as text formatting, your message simply doesn't get through (hello MySpace users). The only way to change that is to put in the effort to make things look clean and nice. Nice products and nice sites tend to cause happy, dedicated and long-term users.
</p>

<p>
The community not only needs to realize this, but also needs to teach itself the knowledge and skill to do something about it. Drupal has infinite potential, but it only goes where the community takes it. If the majority remains allergic to design and graphics, very little will change and only at a glacial pace.</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Children of Men Fake Media]]></title>
    <link href="https://acko.net/blog/children-of-men-fake-media/"/>
    <updated>2007-02-28T00:00:00+01:00</updated>
    <id>https://acko.net/blog/children-of-men-fake-media</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>I got linked this video, which contains all the fake media created for the movie 'Children of Men' (see my <a href="http://acko.net/blog/children-of-men-is-awesome">earlier post)</a>.
</p>

<p>
Aside from sci-fi geek fun, I loved watching them to analyse the graphical designs they used. One of the subjects I'll be talking about in my <a href="http://acko.net/blog/oscms-talk-designer-eye-for-the-geek-guy-gal">OSCMS talk about design</a> is branding and style. If you're going to attend, here's a great opportunity to do your homework.
</p>

<p>
Having an eye for graphical design is as important as creative skill, but luckily you can train on this. Each of these ads or clips has a different look tailored towards the product and its audience. Look at the graphical elements, such as images, colors, typography and animation and try to figure out why it's appropriate and effective. There's also some public signage in there which has a style of its own.
</p>

<p>
If you have some time, a good trick is to take a particular design, look at it for a couple minutes, then try to reproduce it in a graphical program like Photoshop or Illustrator. When you're done, compare your version with the original, and try to figure out what you did different and whether this makes it better or worse. Look for qualities like readability, alignment, typography, contrast and aesthetics. The ones in the movie are probably a bit too graphical each, but you can do this for logos or web sites too.
</p>

<p>
The clips can be <a href="http://www.foreignoffice.com/projekts/movies/movie_com.htm">viewed in QuickTime</a> and were done by London-based design studio <a href="http://www.foreignoffice.com/">Foreign Office</a>.
</p>

<p>
<em>Tip: you can slowly move forwards or backwards in a QuickTime video by scrolling up/down.</em>
</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Poster for Interfacultair Theaterfestival done]]></title>
    <link href="https://acko.net/blog/poster-for-interfacultair-theaterfestival-done/"/>
    <updated>2007-02-19T00:00:00+01:00</updated>
    <id>https://acko.net/blog/poster-for-interfacultair-theaterfestival-done</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>I just finished designing the poster for this year's theaterfestival at my ex-university. I already blogged about the <a href="/blog/leuvenspeelt-another-year">websites</a> for the event which I made.
</p>

<p>
The poster follows the same carnival theme as the website and reuses several elements from the 3D scene. It's rendered in a flatter composition and looks more like a mini-tent or puppet show.
</p>

<p>
<div style="text-align: center; margin: 0.5em -1em;"><a href="/files/leuvenspeelt/itf-affiche-2007-groot.png"><img class="natural" src="/files/leuvenspeelt/itf-affiche-2007-klein.png" alt="Poster for Interfacultair Theaterfestival 2007, Leuven." /></a></div>
</p>

<p>
<!--break-->The challenge every year is finding an aesthetic way of cramming the information for up to 8 events on a single poster. The festival's branding is important (which explains the large title and website address), but these posters are going to be used for over 2 months. So, I chose to focus the design around the dangling labels for the events, with the floating ducks as decoration. In Belgium at least, there is a game at fairs where kids have to fish out rubber ducks from a steady stream using a small fishing rod, so it's a recognizable setting.
</p>

<p>
The 3D render was exported to a PNG and decorated in Illustrator. All the text and print on the design is vector art, so it will print crisply. For the 3D rendering, it is unpractical to go beyond 250 dpi as it takes too much time and memory to produce the image. Still, 250 dpi is sufficient for posters like this, as the final print will be 70 x 50 cm large (7000x5000 pixels @ 254 dpi).
</p>

<p>
I made an effort to paint and collect high quality textures for all the objects, so there is plenty of detail to look at up close. Every element looks realistic. Check out this <a href="/files/leuvenspeelt/itf-affiche-2007-groot.png">high resolution version</a> (3.5 MB) to see. The final PDF however is 2.5x more detailed, even.
</p>

<p>
More info about the event can found in this <a href="http://acko.net/blog/leuvenspeelt-another-year">blog entry</a>, or on the <a href="http://www.leuvenspeelt.be/">event's website</a> (if you read Dutch).</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[OSCMS Talk: Designer Eye for the Geek Guy/Gal]]></title>
    <link href="https://acko.net/blog/oscms-talk-designer-eye-for-the-geek-guy-gal/"/>
    <updated>2007-02-14T00:00:00+01:00</updated>
    <id>https://acko.net/blog/oscms-talk-designer-eye-for-the-geek-guy-gal</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p><em>Update: I've posted the <a href="/blog/design-presentation-slides">presentation slides and a video</a> is available as well.</em>
</p>

<p>
I'll be attending the <a href="http://www.oscms-summit.org">OSCMS conference</a> in Sunnyvale CA at Yahoo next month. Aside from a repeat of my DrupalCon jQuery talk, (though with a bit more examples) I just submitted another proposal for a talk. It's something that I've wanted to do for a while now:
</p>

<blockquote>
<p>
In meetings and lectures across the globe, people are made to endure hideous presentation slides featuring some of the wildest colors, clip art and typography. Many websites are so confusingly laid out, that you get dizzy from the overload of boxes, images or links. And every day, people receive resumés, invoices and ads ... <em>*cue lightning and thunder*</em> set in the Comic Sans font.
</p>

<p>
It's enough to make the average designer's hair turn blue, fall out, morph into a ninja and stab him/her in the eyes.
</p>

<p>
But, all hope is not lost! Contrary to popular belief, graphical design is not some arcane voodoo magic, but a straightforward discipline that values experience, reusability, elegance and good tools just like programming. Just like code, there are plenty of objective ways to measure the quality of a design. However, just like art is subjective, so may two programmers disagree on which implementation is the best. No designer is born with a genetic sense of proportion... it's just that while you were busy writing BASIC code on your C64, they were busy drawing superheroes.
</p>

<p>
I myself am an engineering geek who's never had any sort of formal design or art training, but has earned the title of "design nazi" on numerous occasions.
</p>

<p>
This session will teach geeks some basic principles about graphical design (especially on the web), from a geek perspective. This means we won't talk about "visually balanced design" but "here's a good approach to spacing". Soon, you'll be hearing the oooh's and aaah's when you don your designer hat.
</p>
</blockquote>

<p>
You can vote on the <a href="http://2007.oscms-summit.org/node/340">session page</a> if you're interested.</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Wordpress.com copies Drupal theme]]></title>
    <link href="https://acko.net/blog/wordpress-com-copies-drupal-theme/"/>
    <updated>2006-12-12T00:00:00+01:00</updated>
    <id>https://acko.net/blog/wordpress-com-copies-drupal-theme</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>I just found out that Wordpress.com has <a href="http://wordpress.com/blog/2006/12/12/new-theme-garland-and-rockin-color-picker">launched a port of the Drupal Garland theme for their users</a>. It didn't take long for some questions to rise up, so I'd like to clear up my side of the story.</p>

<p>
I received a mail about a month ago by Bryan Veloso at Automattic where he praised the theme and was asking for permission to port it to Wordpress for Wordpress.com.
</p>

<p>
I replied with the clear fact that the theme is technically GPL'd and thus only subject to the restrictions in that license, but that there were a variety of other factors to consider:
</p>

<blockquote><p>
The Garland theme is the result of a concentrated effort of a few dedicated Drupal folks to make a new default theme for the upcoming Drupal 5. Drupal has always been better on the technical side than the design side, and this is an important step to get rid of our 'clunky geek software' image.
</p>

<p>
We'd also like to use it to establish a better Drupal branding. The default Garland look is very blue and matches our visual identity. However, the recoloring feature of Garland ensures that people aren't stuck with all blues, and can change everything to match their tastes. So, more Drupal sites will now stick to using the default (Garland) theme. If website visitors keep seeing the same design on multiple sites, they might start to wonder why that is and what CMS is running behind it. This is especially important because, unlike Wordpress, our themes are typically built to be used both for the front-end and back-end (there really is no hard distinction).
</p>

<p>
From this point of view, if Wordpress or Wordpress.com were to make the Garland theme available, <em>it would be a direct hit to our goals, especially because it's going to take us a couple of weeks to get our final Drupal 5.0 release out the door and really get the buzz flowing</em>. And then, weeks or even months to see the spread of Garland-themed Drupal sites.
(emphasis added for clarity)
</p></blockquote>

<p>
I never got a reply or any sort of news about it, until Gerhard pasted me the link to the Wordpress.com announcement. My immediate reaction was disappointment. If Wordpress.com serves up Garland before we do, all hope of promoting it as an original Drupal style is pretty much flushed down the drain.
</p>

<p>
I'm also disappointed that they did such a poor job: Elements are missing or badly styled, the positioning and spacing is off too and they didn't even credit Stefan Nagtegaal in the footer.
</p>

<p>
Of course, technically, Wordpress.com didn't do anything wrong. But the fact that they asked first, and then still copied it and released it early feels like a stab in the back for me.</p></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New Design for Acko.net]]></title>
    <link href="https://acko.net/blog/new-design-for-acko-net/"/>
    <updated>2006-07-13T00:00:00+02:00</updated>
    <id>https://acko.net/blog/new-design-for-acko-net</id>
    <content type="html"><![CDATA[<div class="g8 i2 first"><div class="pad"><p>If you're not reading this through an aggregator, you will have already noticed: I've redesigned my website.
</p>

<p>
The last theme <a href="/blog/redesign">lasted about 2.5 years</a>, so it was time for something new and fresh.
</p>

<p>
Now, I don't know about you, but honestly I'm a bit tired of all the pastelly rounded corners and soft shadows that are all the rage today. Sure, it looks nice and neutral, but I'd prefer something with a little more <em>oomph</em>. So, after a day of fun with vectors tools, a highly saturated color palette and some browser-fighting, my geometric theme (uncreatively called <em>Acko8</em>) is completed.
</p>

<p><img class="natural" src="/files/redesign-2008/previous-acko-large.jpg" alt="" /></p>

<p>
The result is, as you'd expect, tableless and semantic XHTML/CSS. The theme should work from 800x600 up without scrolling (though at higher resolutions, more eye candy sticks out on the sides). Whether it is aesthetically pleasing depends of course on your own tastes. But I sure love the way it turned out!
</p>

<p>
What's cool is that I specifically crafted the underlying CSS skeleton to allow images to 'break out' of the text flow. The previous design tried this as well, but had several nasty issues with it. The effect is quite nice.
</p>

<p>
Aside from the looks I already reorganised the site a bit. The front door page was removed in favor of a more direct approach. I put my side projects a bit more in the spotlight as well. Finally, I emphasised the personal aspect, with a clear explanation of the site's purpose in the upper-right corner on every page.
</p>

<p>
Comments welcome!</p></div></div>
]]></content>
  </entry>
  
</feed>
