<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Henri Bergius - Oscom</title>
    <description>Latest posts in category 'oscom'</description>
    <link>https://bergie.iki.fi</link>
    <language>en</language>
    <lastBuildDate>Tue, 05 May 2026 19:17:08 +0000</lastBuildDate>
    
    <item>
      
      <title>Forget about HTTP when building microservices</title>
      <description>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Microservices&quot;&gt;Microservices&lt;/a&gt; — an architectural pattern we recommended in our &lt;a href=&quot;https://youtu.be/VQdl7J_24PA?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;2012 International PHP Conference keynote&lt;/a&gt; — is pretty popular these days. There are many benefits to consider:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Independent development and release lifecycle for each microservice&lt;/li&gt;
  &lt;li&gt;Ensuring clear API boundaries between systems&lt;/li&gt;
  &lt;li&gt;Ability to use technologies most applicable for each area of a system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In an ideal world, microservices are a realization of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Unix_philosophy&quot;&gt;Unix philosophy&lt;/a&gt; as applied to building internet services: writing programs that do one thing, and do it well; writing programs that work together.&lt;/p&gt;

&lt;h2 id=&quot;just-use-a-message-queue&quot;&gt;Just use a message queue&lt;/h2&gt;

&lt;p&gt;However, when most people think about microservices, they think systems that communicate with each other using HTTP APIs. I think this is quite limited, and something that makes microservices a lot more fragile than they could be. &lt;a href=&quot;https://www.cloudamqp.com/blog/2014-12-03-what-is-message-queuing.html&quot;&gt;Message queues&lt;/a&gt; provide a much better solution. This is mentioned in Martin Fowler’s &lt;a href=&quot;https://martinfowler.com/articles/microservices.html&quot;&gt;Microservices article&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The second approach in common use is messaging over a lightweight message bus. The infrastructure chosen is typically dumb (dumb as in acts as a message router only) - simple implementations such as RabbitMQ or ZeroMQ don’t do much more than provide a reliable asynchronous fabric - the smarts still live in the end points that are producing and consuming messages; in the services.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we were building &lt;a href=&quot;https://thegrid.io/&quot;&gt;The Grid&lt;/a&gt;, we went with an architecture heavily reliant on microservices communicating using message queues. This gave us several useful capabilities:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Asynchronous processing&lt;/strong&gt;&lt;br /&gt;
If you have heavy back-end operations or peak load, a microservice might be swamped with work to be done. If your web server only needs to send work to a queue and not wait for result immediately, you have a lot more freedom on how to organize the work. Furthermore, you can split your service along different scalability characteristics — some systems may be network-bound, others CPU-bound etc&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Autoscaling&lt;/strong&gt;&lt;br /&gt;
Since the work to be performed by your microservices is kept in message queue, you can use the combination of the queue length and typical processing times to automatically determine how many instances of each service you need. Ideally you can use this to ensure that your processing times stay consistent regardless of how many users are on your system at a given time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dead lettering&lt;/strong&gt;&lt;br /&gt;
It is possible to configure RabbitMQ to place any failed operations into a &lt;a href=&quot;https://www.rabbitmq.com/dlx.html&quot;&gt;dead letter queue&lt;/a&gt;. This gives you a full record of any failing operations, making it possible to inspect them manually, replay later, or produce new tests based on real-world failures&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt;&lt;br /&gt;
Sometimes you’re dealing with external HTTP APIs that are rate limited. Once a microservice starts hitting rate limits, you can keep new requests in a queue until the limit lifts again&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;In-flight updates&lt;/strong&gt;&lt;br /&gt;
A message queue can be configured so that non-acknowledged messages go back into the queue. This means that if one of your services crashes, or you deploy a new version of it, no work gets lost. When the service is back up again, it can pick up right where the previous instance left off&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;better-tooling&quot;&gt;Better tooling&lt;/h2&gt;

&lt;p&gt;HTTP is something all backend developers are familiar with. With message queues you have to deal with some new concepts, and hence new tools are also needed.&lt;/p&gt;

&lt;h3 id=&quot;msgflo&quot;&gt;MsgFlo&lt;/h3&gt;

&lt;p&gt;Client libraries for talking with common message queues exist for pretty much every language. However, this still means that you’ll have to handle things like message pre-fetch limits, acknowledging handled messages, and setting up queues yourself. And of course keeping track of what service talks to what can become a burden.&lt;/p&gt;

&lt;p&gt;We developed the &lt;a href=&quot;https://msgflo.org/&quot;&gt;MsgFlo&lt;/a&gt; tool to solve these problems. MsgFlo provides open source &lt;a href=&quot;https://github.com/msgflo&quot;&gt;client libraries&lt;/a&gt; for bunch of different programming languages, providing a simple model to handle message-related workflow.&lt;/p&gt;

&lt;p&gt;To give you an overview of the dataflow between services, MsgFlo also provides a way to define the whole system as a flow-based programming graph. This means you’ll see the whole system visually, and can change connections between services directly from graphical tools like &lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re using &lt;a href=&quot;https://heroku.com&quot;&gt;Heroku&lt;/a&gt;, MsgFlo can also generate the &lt;a href=&quot;https://devcenter.heroku.com/articles/procfile&quot;&gt;Procfile&lt;/a&gt; for you, meaning that the services you’ve defined in your graph get automatically registered with the platform.&lt;/p&gt;

&lt;h3 id=&quot;guv&quot;&gt;Guv&lt;/h3&gt;

&lt;p&gt;As mentioned above, queue-based microservices make autoscaling quite easy. If you’re on Heroku, then our &lt;a href=&quot;https://github.com/flowhub/guv&quot;&gt;Guv tool&lt;/a&gt; can be used to automate scaling operations for all of your background dynos.&lt;/p&gt;

&lt;p&gt;I wrote more about GuvScale in a &lt;a href=&quot;https://bergie.iki.fi/blog/guvscale-heroku-autoscaling/&quot;&gt;recent blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/guvscale-graph.jpg&quot; alt=&quot;Workload and scaling operations&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;p&gt;If you’d like to explore using message queues for your services a bit more, here are couple of good articles:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.runnable.com/post/150022242931/event-driven-microservices-using-rabbitmq&quot;&gt;Event-driven Microservices Using RabbitMQ&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.codeship.com/microservice-communication-queues/&quot;&gt;Microservice Communication with Queues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also some MsgFlo example applications available:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/msgflo/msgflo-example-imageresize&quot;&gt;msgflo-example-imageresize&lt;/a&gt; is a web service for scaling images using autoscaled background workers&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/imgflo/imgflo-server&quot;&gt;imgflo-server&lt;/a&gt; is a web service that uses MsgFlo to send image processing jobs to background &lt;a href=&quot;https://en.wikipedia.org/wiki/GEGL&quot;&gt;GEGL&lt;/a&gt; or &lt;a href=&quot;https://noflojs.org&quot;&gt;NoFlo&lt;/a&gt; microservices&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Thu, 13 Apr 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fforget-http-microservices%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/forget-http-microservices/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/forget-http-microservices/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Conference talk videos</title>
      <description>&lt;p&gt;As I’m preparing for a &lt;a href=&quot;https://noflojs.org&quot;&gt;NoFlo&lt;/a&gt; talk in &lt;a href=&quot;https://bulgariawebsummit.com/&quot;&gt;Bulgaria Web Summit&lt;/a&gt; next week, I went through some older videos of my conference talks. Sadly a lot of the older ones are not online, but the ones I found I compiled in playlists:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;My talks on YouTube&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://vimeo.com/album/4502450&quot;&gt;My talks on Vimeo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;some-highlights&quot;&gt;Some highlights&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/pgP4v9b5DvE?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;NoFlo, Managing Workflows with JavaScript&lt;/a&gt;, my first NoFlo talk, Wakanday 2011:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/pgP4v9b5DvE?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/dVFKgWL_TD8?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;Decoupling Content Management with Create and PHPCR&lt;/a&gt; from SymfonyLive Paris 2012:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/dVFKgWL_TD8?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href=&quot;https://youtu.be/VQdl7J_24PA?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;The Internet is your Application Blueprint&lt;/a&gt;, keynote with &lt;a href=&quot;https://pooteeweet.org/&quot;&gt;Lukas&lt;/a&gt; at the International PHP Conference 2012 where we talked about microservices:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/VQdl7J_24PA?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href=&quot;https://vimeo.com/album/4502450/video/72065207&quot;&gt;Introduction to Flow-Based Programming and NoFlo&lt;/a&gt; at &lt;a href=&quot;https://c-base.org&quot;&gt;c-base&lt;/a&gt; in 2013:&lt;/p&gt;

&lt;iframe src=&quot;https://player.vimeo.com/video/72065207&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;If you find any I’ve missed, please &lt;a href=&quot;mailto:henri.bergius@iki.fi&quot;&gt;let me know&lt;/a&gt;!&lt;/p&gt;
</description>
      <pubDate>Fri, 31 Mar 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fconference-talk-videos%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/conference-talk-videos/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/conference-talk-videos/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>The Grid: Web Design by Artificial Intelligence</title>
      <description>&lt;p&gt;As mentioned &lt;a href=&quot;http://bergie.iki.fi/blog/nemein-anders/&quot;&gt;last year&lt;/a&gt;, I’m working on a Artificial Intelligence that can do web design. It is called &lt;a href=&quot;https://thegrid.io/#6&quot;&gt;The Grid&lt;/a&gt;. Last week I gave a talk at &lt;a href=&quot;http://liftconference.com/lift16&quot;&gt;Lift Conference&lt;/a&gt; explaining how it all works.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/v65HLBGLG_g&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;If you can’t see the video embed above, it is also available on &lt;a href=&quot;http://livestream.com/liftconference/events/4805866/videos/112147620&quot;&gt;the Livestream site&lt;/a&gt; and &lt;a href=&quot;https://youtu.be/v65HLBGLG_g&quot;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Wed, 17 Feb 2016 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Flift-how-does-the-grid-work%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/lift-how-does-the-grid-work/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/lift-how-does-the-grid-work/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Why did I reimplement Jekyll using NoFlo</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; is a delightful piece of software. A Ruby application that turns your Markdown and HTML files to a nicely constructed static website. Since the generated site is static, you can deploy and serve it from anywhere with no security or performance concerns. As a matter of fact, &lt;a href=&quot;http://bergie.iki.fi/&quot;&gt;this site&lt;/a&gt; is &lt;a href=&quot;http://bergie.iki.fi/colophon/&quot;&gt;built&lt;/a&gt; with Jekyll.&lt;/p&gt;

&lt;p&gt;For websites that don’t need to offer dynamic functionality this is in many ways the culmination of &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;Decoupled Content Management&lt;/a&gt; — you can write the post using whatever editor, use GitHub as the content repository, and deploy the pages to any web server you want.&lt;/p&gt;

&lt;p&gt;If you’ve been to &lt;a href=&quot;http://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;our Kickstarter project&lt;/a&gt; you probably know that I’ve reimplemented Jekyll using the &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; flow-based programming environment. &lt;em&gt;If I’m so happy with Jekyll as it is, why would I do such a thing?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;introducing-noflo-jekyll&quot;&gt;Introducing noflo-jekyll&lt;/h2&gt;

&lt;p&gt;Before I go to the reasons, let me briefly introduce the project itself: &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll&quot;&gt;noflo-jekyll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like any flow-based program, the NoFlo reimplementation of Jekyll is built out of a graph. Here is how the main graph of the application looks like when loaded via the NoFlo UI prototype:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-jekyll.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-jekyll-small.png&quot; alt=&quot;NoFlo Jekyll main graph&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quite a few of the boxes you see in that graph are actually &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/tree/master/graphs&quot;&gt;subgraphs&lt;/a&gt;. Since the UI is still under work, the subgraphs have been defined in the more text editor friendly &lt;a href=&quot;https://noflojs.org/documentation/fbp/&quot;&gt;.fbp syntax&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In total at the current version the graphs contain &lt;strong&gt;107 nodes&lt;/strong&gt;. Most of these running a component from the extensive &lt;a href=&quot;https://noflojs.org/library/&quot;&gt;NoFlo component libraries&lt;/a&gt;, but there are also &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/tree/master/components&quot;&gt;&lt;strong&gt;4 custom components&lt;/strong&gt;&lt;/a&gt; built for this project. These components put together are under 500 lines of code, and everything else is using 100% reusable code from existing libraries. Not bad compared to the size of the original Jekyll code base at over 16k LoC!&lt;/p&gt;

&lt;p&gt;You can grab the &lt;a href=&quot;https://npmjs.org/package/noflo-jekyll&quot;&gt;first release of noflo-jekyll&lt;/a&gt; right now from NPM. Please refer to &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#readme&quot;&gt;the README&lt;/a&gt; on how to use it.&lt;/p&gt;

&lt;h2 id=&quot;where-this-is-coming-from&quot;&gt;Where this is coming from&lt;/h2&gt;

&lt;p&gt;When I started working with the rest of &lt;a href=&quot;https://www.facebook.com/thegridio&quot;&gt;The Grid&lt;/a&gt; team last year, Jekyll development had practically stopped. It looked like nothing was happening in that community. Since Jekyll was something we very much wanted to utilize for various projects, the situation looked a little bit risky.&lt;/p&gt;

&lt;p&gt;Since we’re very much a NoFlo shop, it felt natural to take Jekyll as sort of a specification, and reimplement it using FBP techniques. Initially this was an internal effort, but then we decided, very much in the nature of &lt;a href=&quot;http://tom.preston-werner.com/2011/11/22/open-source-everything.html&quot;&gt;GitHub’s “open source (nearly) everything”&lt;/a&gt; philosophy, that this should be opened as well.&lt;/p&gt;

&lt;p&gt;I got noflo-jekyll into a running state in about a week, and then moved my attention to other things we needed to build. And so the finishing touches and a public release were postponed to a better day.&lt;/p&gt;

&lt;p&gt;As it happens, &lt;a href=&quot;http://blog.parkermoore.de/2013/05/06/jekyll-1-dot-0-released/&quot;&gt;Jekyll development resumed&lt;/a&gt; pretty soon after that. But there are still many reasons why noflo-jekyll can be quite cool.&lt;/p&gt;

&lt;h2 id=&quot;benefits-of-the-noflo-port&quot;&gt;Benefits of the NoFlo port&lt;/h2&gt;

&lt;p&gt;Here are some reasons why especially Node.js developers should care about this project:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Pure JavaScript&lt;/strong&gt;, no need for Ruby or other runtimes in your environment. Especially handy if you’re using &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; for site generation&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Other data sources&lt;/strong&gt;, in NoFlo everything is just a flow of data. You could easily plug in other data sources than the file system. For example, database query results&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different converters&lt;/strong&gt;, don’t want to use Markdown? Just plug in your own mark-up processor component&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different template engines&lt;/strong&gt;, don’t want to use Liquid? Just plug in your own template processor component&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use as library or executable&lt;/strong&gt;, this Jekyll implementation is just a NoFlo graph. You can use it in &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#usage-in-noflo-graphs&quot;&gt;other NoFlo applications&lt;/a&gt;, as &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#command-line-usage&quot;&gt;a Node.js module&lt;/a&gt;, or as &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#command-line-usage&quot;&gt;a command-line executable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, as with any reimplementation of a application being actively developed, there are also some &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#known-issues-and-differences-with-ruby-jekyll&quot;&gt;potential caveats&lt;/a&gt; to observe.&lt;/p&gt;

&lt;h2 id=&quot;a-noflo-example&quot;&gt;A NoFlo example&lt;/h2&gt;

&lt;p&gt;Most of the existing NoFlo applications out there are dealing with various business processes, and so very little of that is available out in the open. As such, &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll&quot;&gt;noflo-jekyll&lt;/a&gt; can probably show how to build bigger systems out of flow-based graphs, and also how to connect them with the rest of the Node.js ecosystem.&lt;/p&gt;

&lt;p&gt;noflo-jekyll is now available under the MIT license for your static site generation needs. But as it happens, it wasn’t the only interesting NoFlo example to be released this week. You may want to also check out how to &lt;a href=&quot;https://github.com/kenhkan/noflo-woute#readme&quot;&gt;handle HTTP requests in NoFlo&lt;/a&gt; with the Woute module. There is even &lt;a href=&quot;https://github.com/kenhkan/noflo-woute/tree/master/examples/echo_server&quot;&gt;an example project&lt;/a&gt; available.&lt;/p&gt;

&lt;h2 id=&quot;keeping-up-with-jekyll&quot;&gt;Keeping up with Jekyll&lt;/h2&gt;

&lt;p&gt;To realize the benefits of flow-based static site generation, it is quite important to keep the NoFlo reimplementation up-to-speed with things changing in Jekyll-land.&lt;/p&gt;

&lt;p&gt;Because of this, the most important part of our automated tests is comparing results between a site generated by the original Jekyll program, and the NoFlo version. This means that when new features are added to Jekyll, we can follow the &lt;a href=&quot;http://www.jamesshore.com/Blog/Red-Green-Refactor.html&quot;&gt;red-green-refactor&lt;/a&gt; style of test-driven development, and add these features to the &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/tree/master/test/fixtures&quot;&gt;test site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been happily building &lt;a href=&quot;http://bergie.iki.fi/&quot;&gt;my blog&lt;/a&gt; and the &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo site&lt;/a&gt; with this for a while, and except for some minor templating and Markdown handling differences between the Node.js and Ruby versions of those libraries, things are looking solid. If you find something that doesn’t work with the site or templates you have, please &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/issues&quot;&gt;let us know&lt;/a&gt;!&lt;/p&gt;
</description>
      <pubDate>Mon, 12 Aug 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fnoflo-jekyll%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/noflo-jekyll/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/noflo-jekyll/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>The mobile-first Web</title>
      <description>&lt;p&gt;The growth of mobile web users is staggering. While &lt;a href=&quot;http://bergie.iki.fi/blog/meego-diaspora/&quot;&gt;some of us&lt;/a&gt; have been browsing the web on mobile devices for nearly ten years, most of the world population is only now getting there.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.tuaw.com/2013/05/31/internet-trends-report-highlights-ipads-incredible-success-roo/&quot;&gt;number of mobile web users&lt;/a&gt; is already at 1.5 billion, which happens to be quite close to the &lt;a href=&quot;http://www.internetworldstats.com/blog.htm&quot;&gt;total number of Internet users&lt;/a&gt; back in 2009.&lt;/p&gt;

&lt;p&gt;And it is &lt;a href=&quot;http://www.fiercemobileit.com/story/global-smartphone-market-growth-estimates-vary-among-research-firms/2013-06-03&quot;&gt;growing rapidly&lt;/a&gt;. In 2015 there will be an estimated &lt;a href=&quot;http://finance.yahoo.com/news/number-smartphones-around-world-top-122000896.html&quot;&gt;2 billion smartphone users&lt;/a&gt; which is quite close to the total number of Internet users currently.&lt;/p&gt;

&lt;p&gt;In the developed world, this is likely to be a mixture of tablets, smartphones, and traditional desktop computers, with most users having at least two different web-capable devices. In the developing world, &lt;em&gt;the smartphone is the computer&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Considering these statistics, &lt;em&gt;it is insanity to design websites and services PC-first&lt;/em&gt;, with mobile only as an afterthought.&lt;/p&gt;

&lt;h2 id=&quot;how-to-prepare&quot;&gt;How to prepare&lt;/h2&gt;

&lt;p&gt;Just some years ago, the mobile web was a slum. Instead of getting full-featured websites, many sent us out to poorly-built and featureless &lt;a href=&quot;http://www.mobify.com/blog/6-reasons-mdot-websites-are-dead-ends/&quot;&gt;m. sites&lt;/a&gt;. Now more and more sites go with &lt;a href=&quot;http://en.wikipedia.org/wiki/Responsive_web_design&quot;&gt;responsive web design&lt;/a&gt; that makes the site itself adapt to different screen sizes and resolutions.&lt;/p&gt;

&lt;p&gt;But even with responsive design, it is easy to go overboard. Tools like &lt;a href=&quot;http://jetpack.me/support/mobile-theme/&quot;&gt;WordPress Jetpack&lt;/a&gt; and &lt;a href=&quot;http://jquerymobile.com/&quot;&gt;jQuery Mobile&lt;/a&gt; oversimplify the site itself by trying to make it look and feel like a native app. In the mobile-first world this is not the right way to go.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;http://blogs.hbr.org/cs/2013/05/the_rise_of_the_mobile-only_us.html&quot;&gt;The Rise of the Mobile-Only User&lt;/a&gt; content strategist Karen McGrane makes a valid point (emphasis added):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mobile users should get the same content. It’s frustrating and confusing for them if you only give them a little bit of what you offer on your “real” website. If you try to guess which subset of your content the mobile user needs, you’re going to guess wrong. Deliver the same content as your desktop user sees. (&lt;em&gt;If you think some of your content doesn’t deserve to be on mobile, guess what — it doesn’t deserve to be on the desktop either. Get rid of it.&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;there-is-no-pixel-perfect&quot;&gt;There is no pixel-perfect&lt;/h2&gt;

&lt;p&gt;In this new world users will access your content or software using a wildly varying set of devices. And each of them has the reasonable expectation of being able to access the full experience and the full set of features you’re providing.&lt;/p&gt;

&lt;p&gt;This changes web design substantially. Even in the old world of different PC browsers, &lt;em&gt;pixel perfect web design&lt;/em&gt; was rarely that. With responsive design, it is &lt;a href=&quot;http://blog.microsecommerce.com/index.php/uncategorized/responsive-design-and-the-demise-of-pixel-perfect/&quot;&gt;even less so&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Think in &lt;em&gt;visual components instead of full pages&lt;/em&gt;. The composition of a page out of these components can vary for different screen sizes&lt;/li&gt;
  &lt;li&gt;Design the compositions always for at &lt;em&gt;three screen form factors&lt;/em&gt;: a full-sized desktop or tablet screen, a smartphone screen, and the 7” tablet in between&lt;/li&gt;
  &lt;li&gt;Make your &lt;em&gt;user interface elements big enough&lt;/em&gt; to be used on inaccurate touch screens&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Never, ever require a plugin&lt;/em&gt; to access some content or functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://css-tricks.com/css-media-queries/&quot;&gt;CSS Media Queries&lt;/a&gt; make responding to different form factors quite easy. And besides that, they also make it easy to optimize for the &lt;a href=&quot;http://developer.android.com/training/multiscreen/screendensities.html#TaskProvideAltBmp&quot;&gt;different screen densities&lt;/a&gt; we now have. This way your images will look sharp on anything the users have, from the “retina-class devices” to the lowest-specced Chinese smartphone, while requiring the user to only download the assets that their device can utilize.&lt;/p&gt;

&lt;p&gt;The devices people use to access the services you provide will vary greatly not only in their display capabilities, but also in the ways you can do input. Some will have mice and physical keyboards, but an increasing amount will instead have a touchscreen. For these users, it is a big service to use the correct &lt;a href=&quot;http://sixrevisions.com/html5/new-html5-form-input-types/&quot;&gt;HTML5 input types&lt;/a&gt; so that the on-screen keyboards and widgets can adapt to the content being entered.&lt;/p&gt;

&lt;h2 id=&quot;the-web-is-not-native&quot;&gt;The web is not native&lt;/h2&gt;

&lt;p&gt;The web is its own platform, and as such it is &lt;em&gt;foolish to try and mimic traditional desktop applications&lt;/em&gt;. It will never feel quite right whatever you do.&lt;/p&gt;

&lt;p&gt;It is a lot better to accept this and fully embrace the unique advantages of the web platform:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;The web is an &lt;a href=&quot;http://bergie.iki.fi/blog/the_universal_runtime/&quot;&gt;universal runtime&lt;/a&gt;&lt;/em&gt; that works on 100% of the computing devices your users have&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;There are no gatekeepers&lt;/em&gt; telling what you can publish, and &lt;em&gt;no middlemen&lt;/em&gt; taking a cut of whatever you sell online&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The web is built out of URLs&lt;/em&gt; that users can easily share with each other, and continue using when they switch devices&lt;/li&gt;
  &lt;li&gt;URLs also allow &lt;em&gt;any application on the web to link to any screen or state of another application&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;It is just as easy to &lt;em&gt;provide content as it is to provide functional applications&lt;/em&gt; on the web&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every major software company on the planet has their own web browser, and the competition between these is fierce. This will ensure that over time, the web will keep on getting better and faster. Compare this to traditional software platforms that can easily stagnate or get abandoned. Thanks to the standard protocols it also &lt;em&gt;allows you to use any technology of your choosing&lt;/em&gt; for the server side of your software.&lt;/p&gt;

&lt;p&gt;Paul Graham put it well in his &lt;a href=&quot;http://paulgraham.com/road.html&quot;&gt;The other road ahead&lt;/a&gt; from 2001:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;And you don’t have to know if you bet on Web-based applications. No one can break that without breaking browsing. The Web may not be the only way to deliver software, but it’s one that works now and will continue to work for a long time. Web-based applications are cheap to develop, and easy for even the smallest startup to deliver.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;things-are-getting-better&quot;&gt;Things are getting better&lt;/h2&gt;

&lt;p&gt;As somebody who has been developing for the web for nearly &lt;a href=&quot;http://press.web.cern.ch/press-releases/2013/04/cern-celebrates-20-years-free-open-web&quot;&gt;twenty years&lt;/a&gt; the rate the web developer experience keeps improving is sometimes dizzying.&lt;/p&gt;

&lt;p&gt;We get used to some limitations in the stack, and then suddenly something comes along and removes that shortcoming. We’re still exploring the new kinds of designs and visual experiences technologies like Media Queries and &lt;a href=&quot;http://en.wikipedia.org/wiki/WebGL&quot;&gt;WebGL&lt;/a&gt; make possible, just like it took years for the community to find best practices around things like AJAX.&lt;/p&gt;

&lt;p&gt;And yet new amazing things keep pouring in. My personal favourite recently has been &lt;a href=&quot;http://www.polymer-project.org/&quot;&gt;Web Components&lt;/a&gt; which gives a standard way to &lt;em&gt;provide reusable widgets on the web&lt;/em&gt;, and to do things like &lt;em&gt;data binding and templating&lt;/em&gt;. This alone will make a lot of the popular frameworks and libraries obsolete.&lt;/p&gt;

&lt;p&gt;Just watch &lt;a href=&quot;http://youtu.be/0g0oOOT86NY&quot;&gt;this video&lt;/a&gt; and see how much easier web development is becoming:&lt;/p&gt;

&lt;iframe width=&quot;500&quot; height=&quot;281&quot; src=&quot;https://www.youtube.com/embed/0g0oOOT86NY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;The current work on standardizing &lt;a href=&quot;https://payswarm.com/&quot;&gt;Web Payments&lt;/a&gt; together with more grassroots efforts like &lt;a href=&quot;http://bitcoin.org/en/&quot;&gt;Bitcoin&lt;/a&gt; promise to add better ways to do business on the web. This should remove the last big advantage of native applications in that they’re easier (but very expensive) to monetize via app stores and in-app payments.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://rdfa.info/&quot;&gt;Linked Data on the web&lt;/a&gt; and new features like &lt;a href=&quot;http://beta.yandex.com/&quot;&gt;Yandex Islands&lt;/a&gt; make it easier to connect web applications and data on the web together. Tools like my &lt;a href=&quot;http://createjs.org/&quot;&gt;Create.js&lt;/a&gt; make the web easier to edit, and &lt;a href=&quot;http://webintents.org/&quot;&gt;Web Intents&lt;/a&gt; promise even closer integration between web apps.&lt;/p&gt;

&lt;p&gt;Each of these will make the web richer and better. Each of them will allow new startups to be built, and new meaningful connections to happen over the internet, many of these using mobile devices.&lt;/p&gt;

&lt;p&gt;It is an exciting time to be a web developer.&lt;/p&gt;
</description>
      <pubDate>Fri, 07 Jun 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fmobile-first-web%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/mobile-first-web/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/mobile-first-web/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Automated linking with rich text editors</title>
      <description>&lt;p&gt;The web is built of links, of pages linking to other resources on the internet. But making those links manually is tedious. This is another area where &lt;a href=&quot;http://createjs.org&quot;&gt;modern inline editors&lt;/a&gt; could do better.&lt;/p&gt;

&lt;p&gt;Yesterday on Hacker News, there was a thread about &lt;a href=&quot;http://www.wikidata.org&quot;&gt;Wikidata&lt;/a&gt;, Wikimedia Foundation’s new knowledge base. &lt;a href=&quot;https://news.ycombinator.com/item?id=5627968&quot;&gt;This comment&lt;/a&gt; struck me especially:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I was using Wikipedia the other day and it occurred to me how primitive it is to have all the inner links to other Wikipedia articles defined manually, surely these should have been automated by now (i.e., marking a word or two would link you to the relevant article).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And indeed, this is a usability problem that can already be fixed with the &lt;a href=&quot;http://viejs.org/&quot;&gt;Semantic Interaction stack&lt;/a&gt; underneath Create.js.&lt;/p&gt;

&lt;h2 id=&quot;introducing-annotatejs&quot;&gt;Introducing Annotate.js&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/szabyg/annotate.js&quot;&gt;Annotate.js&lt;/a&gt;&lt;/strong&gt; is a VIE widget built by Szaby Grünwald. It works very similarly to a spell checker in traditional text editors — you write text, and it highlights the potential entities you might want to link to. You then can either accept or decline these link suggestions by clicking them. In case of multiple potential matches, you can also disambiguate between them by selecting from an offered list.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=zAMUpd6rb9k&amp;amp;feature=share&amp;amp;list=UUnPE7t9tqwcsO0LLyw5zuPQ&quot;&gt;Here is a quick video&lt;/a&gt; of Annotate.js in action:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/zAMUpd6rb9k?list=UUnPE7t9tqwcsO0LLyw5zuPQ&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;You can also try it yourself &lt;a href=&quot;http://szabyg.github.io/annotate.js/&quot;&gt;with an online demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Currently Annotate.js &lt;a href=&quot;https://github.com/bergie/hallo/blob/master/src/plugins/annotate.coffee&quot;&gt;has been integrated&lt;/a&gt; with the &lt;a href=&quot;http://hallojs.org&quot;&gt;Hallo rich text editor&lt;/a&gt;, but it would be easy to do the same with other popular editors like Aloha and CKEditor.&lt;/p&gt;

&lt;h2 id=&quot;connecting-to-entities&quot;&gt;Connecting to entities&lt;/h2&gt;

&lt;p&gt;The big question with automatic linking is &lt;em&gt;where the entities come from&lt;/em&gt;. There are services like &lt;a href=&quot;http://www.opencalais.com/&quot;&gt;OpenCalais&lt;/a&gt; that can provide these suggestions for your content, but most of them are focused only on shared knowledge bases of big companies, famous people, and major cities.&lt;/p&gt;

&lt;p&gt;Unless you’re running a newspaper, it is unlikely that these are the things your content is about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://stanbol.apache.org/&quot;&gt;Apache Stanbol&lt;/a&gt;&lt;/strong&gt; is an open source engine that can provide the enhancements for you. Out of the box it provides suggestions based on the Wikipedia knowledge repository. But more importantly, you can feed it with your own entities.&lt;/p&gt;

&lt;p&gt;This way the enhancements you get for your content can be tuned to be meaningful to your content and your audience. If you write about medicine, they could be about symptoms and diseases, or if you’re writing about technology, they could be specific open source projects and their contributors. With Stanbol, the choice is yours.&lt;/p&gt;

&lt;p&gt;The current downside of Stanbol is that you’ll have to run it yourself, but there may be &lt;a href=&quot;http://signup.redlink.co/&quot;&gt;solutions coming for that as well&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;beyond-editing&quot;&gt;Beyond editing&lt;/h2&gt;

&lt;p&gt;Like &lt;a href=&quot;http://bergie.iki.fi/blog/never-lose-content/&quot;&gt;never losing your content&lt;/a&gt; or &lt;a href=&quot;http://bergie.iki.fi/blog/create-collections/&quot;&gt;managing collections&lt;/a&gt;, Annotate.js shows what we can do to improve the editing experience when we interact with it in a &lt;em&gt;semantically meaningful&lt;/em&gt; manner.&lt;/p&gt;

&lt;p&gt;What Annotate.js does is not merely creating links, but it also marking the machine-readable relationship between them and the HTML content being edited. This can then be used by yet another set of tools — like search engines — to understand and organize the content better.&lt;/p&gt;

&lt;p&gt;It is easy to see Create.js (like Drupal did, &lt;a href=&quot;http://drupal.org/node/1979784&quot;&gt;unfortunately&lt;/a&gt;) as just an easy way to add nice inline editing features to your CMS. However, while that is a good initial step, the addition of being able to interact with your content on the semantic level can do a lot more. Automated linking is just another demonstration of that.&lt;/p&gt;

&lt;p&gt;As the ecosystem around Create.js and VIE matures, and it ships in more systems, there will be things that we can’t even imagine now built on the stack.&lt;/p&gt;

&lt;p&gt;If your CMS is &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;properly decoupled&lt;/a&gt;, you can benefit from that immediately.&lt;/p&gt;
</description>
      <pubDate>Tue, 30 Apr 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fautomated-linking%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/automated-linking/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/automated-linking/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Why WordPress needs to get Decoupled</title>
      <description>&lt;p&gt;Couple of days ago there was an interesting post on &lt;a href=&quot;http://jshakespeare.com/the-dire-state-of-wordpress/&quot;&gt;the Dire State of WordPress&lt;/a&gt;, talking about the issues developers have when working with this &lt;a href=&quot;http://en.wordpress.com/stats/&quot;&gt;hugely popular&lt;/a&gt; content management system:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When you learn PHP from WordPress as I (and probably many other people) did, you just assume that all the idiosyncrasies and illogicalities are par for the course when building a CMS-driven site. It’s taken me several years to realise that it doesn’t have to be like this. In fact, it wasn’t really until I started learning more about OO principles and working with frameworks that I started looking at WP in a different light. Why is every instance of every model treated like a post? Why can’t I extend the functionality of a post type without writing a whole mess of hooks, filters and functional code into a file that isn’t semantically related to that post in any way?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;These may sound like the gripes of someone whose needs will never be met by something like WordPress, but the lack of fundamental logic that gives rise to the above issues is what makes WordPress problematic for developers at all levels. And because the crossover on the venn diagram of ‘people who know good application development practises’ and ‘people who build sites in WordPress’ is such a thin sliver, it just trundles along in its current hokey state, baffling both the unseasoned and the proficient developer alike.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As expected, this generated a &lt;a href=&quot;https://news.ycombinator.com/item?id=5407879&quot;&gt;lively discussion on Hacker News&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;technical-debt&quot;&gt;Technical debt&lt;/h2&gt;

&lt;p&gt;Now, I’ve used WordPress on-and-off ever since it was &lt;a href=&quot;http://codex.wordpress.org/History&quot;&gt;still called b2 cafelog&lt;/a&gt;, but I wouldn’t consider myself a WordPress developer. But still, looking at it mostly from the outside, it is clear that many of the issues WordPress users and developers face today result from &lt;a href=&quot;http://en.wikipedia.org/wiki/Technical_debt&quot;&gt;technical debt&lt;/a&gt; accruing from bad architectural decisions done a decade ago, and the missing will to correct those.&lt;/p&gt;

&lt;p&gt;WordPress is still undergoing a transition from a blogging platform &lt;a href=&quot;http://www.ducttapemarketing.com/blog/2011/02/28/wordpress-3-1-is-big-leap-into-cms/&quot;&gt;to a general-purpose CMS&lt;/a&gt;. The changes this requires mean that without a sound architecture, the problems with the underlaying engine will only become exacerbated.&lt;/p&gt;

&lt;p&gt;This is not something unique to WordPress. Many popular CMSs, including Drupal and TYPO3 have been suffering from the same problem. We all in the open source CMS community have been there. The difference however is that these projects have identified this issue, and have taken steps to correct it.&lt;/p&gt;

&lt;h2 id=&quot;start-decoupling&quot;&gt;Start decoupling&lt;/h2&gt;

&lt;p&gt;The reason why CMSs become so messy is because they all try to be so many things at once. A CMS is a web framework, a CMS is a web editing tool, and a CMS is a content store. But each of these are in reality their own, specialized areas, and so the principle of &lt;a href=&quot;http://en.wikipedia.org/wiki/Separation_of_concerns&quot;&gt;separation of concerns&lt;/a&gt; tells us that they should be handled by separate pieces of software.&lt;/p&gt;

&lt;p&gt;I wrote a still-popular post titled &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;Decoupling Content Management&lt;/a&gt; two years ago to argue just that. Projects like &lt;a href=&quot;http://phpcr.github.com&quot;&gt;PHPCR&lt;/a&gt; and &lt;a href=&quot;http://createjs.org&quot;&gt;Create.js&lt;/a&gt; have since then sprung up to move that from idea to practice, and have already been adopted by many CMSs.&lt;/p&gt;

&lt;p&gt;In nutshell, the transition I want CMSs — WordPress included — to make is this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/decoupled-cms-architecture.png&quot; alt=&quot;Decoupling Content Management&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is my &lt;a href=&quot;http://youtu.be/j4NoAFK-KNY&quot;&gt;talk on the subject&lt;/a&gt; from JS.everywhere in Paris late last year:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/j4NoAFK-KNY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;We also talk about the cross-CMS collaboration this enables in the &lt;a href=&quot;http://vimeo.com/50883868&quot;&gt;TYPO3 Neos launch video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Think about it, developers from Midgard CMS and TYPO3 working together and sharing substantial parts of the user interface codebase, while still enabling each project to retain a unique look-and-feel!&lt;/p&gt;

&lt;h2 id=&quot;non-participation&quot;&gt;Non-participation&lt;/h2&gt;

&lt;p&gt;Over the past two years I’ve given tens of talks about Decoupled Content Management in various developer and CMS conferences. In these events I’ve talked with a lot of developers from various different CMSs from both the open source and proprietary worlds. But despite its popularity, WordPress core developers have been absent.&lt;/p&gt;

&lt;p&gt;Symfony activist Lukas Smith &lt;a href=&quot;https://news.ycombinator.com/item?id=5414441&quot;&gt;has noticed the same&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I think the first step would be that the WordPress core developers start to mingle with the PHP community. I simply have not met a single WordPress core developer at any PHP conference and I tend to go to 6-10 a year in various countries around the world.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;I have also not seen any WordPress core dev participate on an php-src internals discussion let alone something like the Framework Interoperability Group that outs out the PSRs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;But without communication the chances of collaboration are low and without collaboration imho its going to be hard for WordPress to identify and assess the potential for new directions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;moving-forward&quot;&gt;Moving forward&lt;/h2&gt;

&lt;p&gt;While WordPress is still the top dog of the CMS world, it is a precarious position that shouldn’t lull them into complacency. The web moves forward, things change, and all technical debt must be paid eventually. And that is what can fatally slow down a project.&lt;/p&gt;

&lt;p&gt;Solving the architectural issues is a big amount of work, and so I would start by examining how other projects like &lt;a href=&quot;http://bergie.iki.fi/blog/drupal-and-collaboration/&quot;&gt;Drupal have made their transition&lt;/a&gt;. The part &lt;em&gt;Symfony components to the rescue of your PHP projects&lt;/em&gt; of my &lt;a href=&quot;http://bergie.iki.fi/blog/symfony-live/&quot;&gt;Symfony Live Paris liveblog&lt;/a&gt; is a good place to start.&lt;/p&gt;

&lt;p&gt;For WordPress, like for any PHP content management system, &lt;a href=&quot;http://bergie.iki.fi/blog/my_secret_agenda_for_php_content_management_systems/&quot;&gt;my secret agenda for PHP CMSs&lt;/a&gt; should apply. If you’re a WordPress core developer, I’d love to chat about how to move forward.&lt;/p&gt;
</description>
      <pubDate>Fri, 22 Mar 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fwordpress-decoupled%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/wordpress-decoupled/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/wordpress-decoupled/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Create.js in 2013</title>
      <description>&lt;p&gt;It is now 2013, and the &lt;a href=&quot;http://www.iks-project.eu/&quot;&gt;IKS project&lt;/a&gt;, started &lt;a href=&quot;http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/&quot;&gt;back in 2009&lt;/a&gt; to improve content management systems through semantic technologies, has ended. Alongside &lt;a href=&quot;http://stanbol.apache.org/&quot;&gt;Apache Stanbol&lt;/a&gt; and &lt;a href=&quot;http://viejs.org/&quot;&gt;VIE.js&lt;/a&gt;, the &lt;a href=&quot;http://createjs.org&quot;&gt;Create.js&lt;/a&gt; inline editing toolkit was one of the major outcomes of this European Union funded effort.&lt;/p&gt;

&lt;p&gt;This post outlines the current state of Create, and some of the things that will be happening around it in 2013.&lt;/p&gt;

&lt;h2 id=&quot;increased-cms-adoption&quot;&gt;Increased CMS adoption&lt;/h2&gt;

&lt;p&gt;Thanks to being picked up by major CMSs like &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal 8&lt;/a&gt;, &lt;a href=&quot;http://neos.typo3.org/&quot;&gt;TYPO3 Neos&lt;/a&gt;, &lt;a href=&quot;http://midgard-project.org/&quot;&gt;Midgard&lt;/a&gt;, &lt;a href=&quot;http://cmf.symfony.com/&quot;&gt;Symfony CMF&lt;/a&gt; and &lt;a href=&quot;http://www.opencms.org/en/&quot;&gt;OpenCms&lt;/a&gt; for their inline editing needs, Create.js is experiencing very strong adoption. Many of these CMSs will be shipping a new major version during 2013.&lt;/p&gt;

&lt;p&gt;These releases will bring Create.js into millions of sites out there, giving users a friendlier and faster way to edit the web. By being built on the semantic interaction framework of VIE, this also means a significant expansion of the RDFa &lt;a href=&quot;http://www.w3.org/standards/semanticweb/data&quot;&gt;Linked Data&lt;/a&gt; base.&lt;/p&gt;

&lt;p&gt;This amount of new users will be staggering, meaning that we will need to put a lot of focus into stability and ease-of-use of the toolkit. To make life for new integrators and &lt;a href=&quot;http://www.ohloh.net/p/midgardcreate/contributors?sort=latest_commit&quot;&gt;contributors&lt;/a&gt; easier, we will also need to improve the &lt;a href=&quot;http://createjs.org/guide/&quot;&gt;documentation&lt;/a&gt; and test coverage. All of this is shown also by the fact that &lt;a href=&quot;https://github.com/bergie/create&quot;&gt;Create.js on GitHub&lt;/a&gt; has climbed from few hundred watchers a year ago to nearly 1400 today.&lt;/p&gt;

&lt;h2 id=&quot;any-editor-you-want&quot;&gt;Any editor you want&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/&quot;&gt;first versions of Create.js&lt;/a&gt; were written exclusively with the &lt;a href=&quot;http://aloha-editor.org/&quot;&gt;Aloha Editor&lt;/a&gt; in mind. Later on we added support for &lt;a href=&quot;http://hallojs.org/&quot;&gt;Hallo.js&lt;/a&gt; in order to provide a simpler, MIT-licensed alternative. However, the needs of CMSs change and new promising editors are released.&lt;/p&gt;

&lt;p&gt;With this in mind, we received a contribution from the OpenCms team to have a more generic editor abstraction allowing integration of any new editors that CMSs may want to integrate. With it, the latest versions of Create.js support also &lt;a href=&quot;http://imperavi.com/redactor/&quot;&gt;Redactor&lt;/a&gt; and &lt;a href=&quot;http://ckeditor.com/&quot;&gt;CKEditor 4&lt;/a&gt; alongside Aloha and Hallo.&lt;/p&gt;

&lt;p&gt;The utility of this abstraction layer was proven recently when &lt;a href=&quot;http://buytaert.net/from-aloha-to-ckeditor&quot;&gt;Drupal switched&lt;/a&gt; from Aloha to CKEditor.&lt;/p&gt;

&lt;p&gt;Hallo.js:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-editors/hallo.png&quot; alt=&quot;Create.js with Hallo Editor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Aloha Editor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-editors/aloha.png&quot; alt=&quot;Create.js with Aloha Editor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;CKEditor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-editors/ckeditor.png&quot; alt=&quot;Create.js with CKEditor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Redactor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-editors/redactor.png&quot; alt=&quot;Create.js with Redactor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In addition to the editors we now support, integrators can use the reasonably simple &lt;a href=&quot;https://github.com/bergie/create/tree/master/src/editingWidgets&quot;&gt;property editor API&lt;/a&gt; to implement their own editors when needed. For example, Drupal provides a &lt;a href=&quot;http://drupalcode.org/project/edit.git/blob/06e86c82ab5412ef1f78aea343dbe0f9cbd16867:/js/createjs/editingWidgets/formwidget.js&quot;&gt;custom editor widget&lt;/a&gt; that utilizes forms rendered on the server side for editing more complex field types.&lt;/p&gt;

&lt;h2 id=&quot;new-default-ui&quot;&gt;New default UI&lt;/h2&gt;

&lt;p&gt;As many of you probably know, Create.js can be used on two levels: as a full inline editing interface, or as a set of components for building your own editing UI.&lt;/p&gt;

&lt;p&gt;In the latter part of 2012, much of focus was put into the components themselves, as that is the way most CMSs leverage Create. But the default user interface is also important, and so I have been collaborating with the Berlin-based designer &lt;a href=&quot;http://marie-schweiz.de/&quot;&gt;Marie Schweiz&lt;/a&gt; to improve the user experience of stock Create.js. This work is still in the concept stage, but I’m quite happy with the direction we’re headed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-ui-2013-editing.png&quot; alt=&quot;Editing text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One important concern to tackle with the new UI is handling of non-visible metadata and the other concerns raised by &lt;a href=&quot;http://www.lullabot.com/articles/inline-editing-and-cost-leaky-abstractions&quot;&gt;Lullabot’s excellent critique&lt;/a&gt; of inline editing. Here you can see some of that in action:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-ui-2013-metadata.png&quot; alt=&quot;Editing geolocation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Other important parts is to use colored indicators for showing what can be edited, and its state (published, untranslated, etc.), and to make the process of &lt;a href=&quot;http://bergie.iki.fi/blog/create-collections/&quot;&gt;adding new content&lt;/a&gt; clearer:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/createjs-ui-2013-create.png&quot; alt=&quot;Adding items&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Clear visuals and bigger touch targets should also make the new UI friendlier for tablets and other new touchscreen devices.&lt;/p&gt;

&lt;h2 id=&quot;new-editing-tools&quot;&gt;New editing tools&lt;/h2&gt;

&lt;p&gt;The main purpose of Create.js is to enable inline editing of textual content, but even in the &lt;a href=&quot;http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/&quot;&gt;original versions&lt;/a&gt; we had additional features like image handling and versioning that most CMSs need.&lt;/p&gt;

&lt;p&gt;Adding more functionality related to non-textual content is highly useful, and something that ought to go hand-in-hand with the new UI effort. In the new default UI we have a large overlay (seen in blue in the geolocation editor) that can be used for new interesting editing features, like better image pickers, or even editing images and videos to be inserted to a page.&lt;/p&gt;

&lt;p&gt;Another idea I’ve been toying around has been a more semantic way of handling tables. Instead of editing tables in the traditional WYSIWYG way, how about making queries to your CMS system and then presenting the data in tabular manner? &lt;a href=&quot;http://aloha-editor.org/guides/plugin_block.html&quot;&gt;Aloha’s Blocks feature&lt;/a&gt; can give a lot of inspiration here.&lt;/p&gt;

&lt;h2 id=&quot;getting-involved&quot;&gt;Getting involved&lt;/h2&gt;

&lt;p&gt;In 2013 the development of Create.js should happen in a lot more community-driven manner. Given the massive adoption of the library, this shouldn’t be a problem.&lt;/p&gt;

&lt;p&gt;If you’re interested in getting involved, take a look at &lt;a href=&quot;https://github.com/bergie/create&quot;&gt;the repository on GitHub&lt;/a&gt;, file &lt;a href=&quot;https://github.com/bergie/create/issues?state=open&quot;&gt;issues&lt;/a&gt;, and send &lt;a href=&quot;http://github.com/guides/pull-requests&quot;&gt;pull requests&lt;/a&gt;. The most immediate concern is getting the &lt;a href=&quot;https://github.com/bergie/create/issues?milestone=1&amp;amp;page=1&amp;amp;state=open&quot;&gt;1.0.0 stable&lt;/a&gt; out of the door, which should be helped greatly by the recently-released &lt;a href=&quot;https://groups.google.com/d/topic/viejs/RYKfp0Fhuag/discussion&quot;&gt;VIE 2.1.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For discussing both development and integration of Create.js, the &lt;a href=&quot;http://groups.google.com/group/createjs&quot;&gt;Create.js Google Group&lt;/a&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#iks&lt;/code&gt; IRC channel on FreeNode are the best options. The &lt;a href=&quot;https://github.com/bergie/create/blob/master/CHANGES.md&quot;&gt;Create.js change log&lt;/a&gt; is also an important thing to watch.&lt;/p&gt;
</description>
      <pubDate>Sun, 06 Jan 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fcreatejs-in-2013%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/createjs-in-2013/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/createjs-in-2013/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Interview: Create.js and VIE in CMSs</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://createjs.org/&quot;&gt;Create.js&lt;/a&gt; and &lt;a href=&quot;http://viejs.org/&quot;&gt;VIE&lt;/a&gt; were recently added &lt;a href=&quot;http://drupal.org/node/1849526&quot;&gt;to the core of Drupal 8&lt;/a&gt;. Just like &lt;a href=&quot;http://bergie.iki.fi/blog/typo3-neos-and-createjs/&quot;&gt;with TYPO3 Neos&lt;/a&gt;, I’ll write a longer post on how things went later.&lt;/p&gt;

&lt;p&gt;The German &lt;a href=&quot;http://it-republik.de/php/php-magazin-ausgaben/ZF2-000528.html&quot;&gt;PHPmagazin&lt;/a&gt; was already fast enough to interview me on that at &lt;em&gt;&lt;a href=&quot;http://it-republik.de/php/news/VIE-und-Create.js-Warum-In-place-Editing-so-erfolgreich-ist-065930.html&quot;&gt;VIE und Create.js: Warum In-place Editing so erfolgreich ist&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;While there were many interesting CMSs already using Create – including &lt;a href=&quot;http://www.opencms.org/en/&quot;&gt;OpenCms&lt;/a&gt;, &lt;a href=&quot;http://cmf.symfony.com/&quot;&gt;Symfony CMF&lt;/a&gt;, &lt;a href=&quot;http://midgard-project.org/midcom/&quot;&gt;Midgard&lt;/a&gt;, and &lt;a href=&quot;http://neos.typo3.org/&quot;&gt;Neos&lt;/a&gt; – I can understand why the integration with Drupal has received so much notice. After all, the system is &lt;a href=&quot;http://w3techs.com/technologies/details/cm-drupal/all/all&quot;&gt;estimated to&lt;/a&gt; have a 7% market share of all CMSs, and so to run more than 2% of the entire web. In 2010 this was &lt;a href=&quot;http://engineindustries.com/blog/jason/how-many-websites-use-drupal-lets-estimate-number-part-one&quot;&gt;calculated to mean&lt;/a&gt; about 7 million websites. These numbers are big.&lt;/p&gt;

&lt;p&gt;The PHPmagazin interview was published in German. For the more international audience, I received permission from the author to publish the English version here on my blog:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;First of all congratulations to the success of your libraries: Symfony CMF and Drupal seem to like you very much.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks! I’m really happy that major CMSs like Drupal and TYPO3 have joined the Create.js effort, as well as some of the newer projects like Symfony CMF. We’re still sadly missing some of the big names like WordPress and Joomla. I’d be happy to help them get started as well.&lt;/p&gt;

&lt;p&gt;It should be noted however that the libraries have been a team effort. While I started and do maintain them, many others from the &lt;a href=&quot;http://www.iks-project.eu/&quot;&gt;IKS consortium&lt;/a&gt; and the various CMS projects have contributed significantly.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How come, they consider your libraries over others?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’d imagine it is the combination of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Timing (they all have been thinking about inline editing in this development cycle)&lt;/li&gt;
  &lt;li&gt;Standards (VIE and Create work with the web standards, not against them)&lt;/li&gt;
  &lt;li&gt;Focus (the Create library is really only intended for inline editing for CMSs, nothing more, nothing less)&lt;/li&gt;
  &lt;li&gt;Licensing (MIT license allows them all to integrate this code without any legal hassles)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;I could expand a little bit on the timing point. The HTML5 suite of standards is now out with useful features like localStorage, contentEditable, and RDFa, and these already have decent support in mainstream browsers. There are also great tools like &lt;a href=&quot;http://aloha-editor.org/&quot;&gt;Aloha Editor&lt;/a&gt; and my &lt;a href=&quot;http://hallojs.org/&quot;&gt;Hallo.js&lt;/a&gt; utilizing them. This all means the time is right for bringing direct manipulation interfaces into content management systems.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What does it mean for you libraries to be part of a project? Do we have to fear fragmentation into many builds for each CMS?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obviously versioning will be an issue. I hope the CMSs will track versions of my libraries as closely as their release cycle allows, but in any case backwards compatibility is something that we will have to take seriously, as this library will be installed on millions of servers.&lt;/p&gt;

&lt;p&gt;As for fragmentation, I think the fact that VIE and Create encourage CMS projects to consider and adopt standards like RDFa and JSON-LD will actually reduce fragmentation between systems and increase possibilities for interoperability and shared code.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What kind of issues are there to be fixed when implementing vie/create into a CMS?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inline editing is quite closely connected to two areas in a CMS:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We need to be able to tell in CMSs output templates where the editable things are, and what they are (usually via RDFa annotations)&lt;/li&gt;
  &lt;li&gt;We need to be able to save changes back to the server (usually via a RESTful API)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these are things where most CMSs have had to do some server-side work to make Create.js possible, and there have even been libraries like &lt;a href=&quot;https://github.com/flack/createphp&quot;&gt;CreatePHP&lt;/a&gt; built to make that easier.&lt;/p&gt;

&lt;p&gt;At the same time, adding support for the different capabilities of the different CMSs has meant that Create and VIE have become better with each new system we integrate with.&lt;/p&gt;
</description>
      <pubDate>Fri, 30 Nov 2012 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fcreatejs-vie-in-cmss-interview%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/createjs-vie-in-cmss-interview/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/createjs-vie-in-cmss-interview/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Inline editing: you have to do it right</title>
      <description>&lt;p&gt;In a curious turn of events, the &lt;a href=&quot;http://plone.org/&quot;&gt;Plone&lt;/a&gt; team is &lt;a href=&quot;http://plone.293351.n2.nabble.com/RFC-re-inline-editing-td7560809.html&quot;&gt;considering to remove&lt;/a&gt; their inline editing feature around the same time when similar features are being added to popular CMSs like &lt;a href=&quot;http://bergie.iki.fi/blog/typo3-neos-and-createjs/&quot;&gt;TYPO3&lt;/a&gt; and &lt;a href=&quot;http://bergie.iki.fi/blog/drupal-and-collaboration/&quot;&gt;Drupal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While the reason why Ploners are considering to remove the feature is technical, wanting to remove an old library dependency, the discussion thread contains quite a lot of people complaining about inline editing. Some examples:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;No problem for us, we always disabled the feature. It confused users more than it helped them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;I positively hated that feature and it was always one of the first we switched of in a new site. So to my mind it can be removed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;what-went-wrong&quot;&gt;What went wrong?&lt;/h2&gt;

&lt;p&gt;At the same time we’ve been getting a lot of positive feedback for &lt;a href=&quot;http://createjs.org/&quot;&gt;Create.js&lt;/a&gt;, the inline editing toolkit many CMSs are now using. Are Plone users to different in their preferences? Turns out this might not be the case, and the issue with Plone’s inline editing feature is just poorly thought-out UX:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;inline edit was a great feature. People was not complaining against inline editing itself and most of them appreciated it a lot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;What was the real problem with end users? Users just hated opening the inline edit when trying to click on a link on a document. This could be solved very easily and I’d like a future reimplementation of inline edit keeping in mind these usability issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;createjs-could-help&quot;&gt;Create.js could help&lt;/h2&gt;

&lt;p&gt;So, the important lesson here is that UX matters. This is why in Create you have a separation between the editing state (where clicking on something allows you to edit it), and browsing state where all content behaves normally.&lt;/p&gt;

&lt;p&gt;In general we’re putting quite a lot of effort into the user experience, for instance by helping users to &lt;a href=&quot;http://bergie.iki.fi/blog/never-lose-content/&quot;&gt;never lose content&lt;/a&gt; or to &lt;a href=&quot;http://bergie.iki.fi/blog/create-collections/&quot;&gt;manage collections&lt;/a&gt;. We ship Create with a UI that we feel works well, but still allow projects to build their own user experience on top of the common infrastructure.&lt;/p&gt;

&lt;p&gt;During the course of the &lt;a href=&quot;http://www.iks-project.eu/&quot;&gt;IKS Project&lt;/a&gt;, I’ve worked closely with several CMS communities, even participating in their hackathons and developer events. I’d be more that happy to help the Plone community to improve their editing experience the same way.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you’re interested in a better inline editing experience, the &lt;a href=&quot;http://createjs.org/guide/&quot;&gt;Create.js integration guide&lt;/a&gt; is a good place to start. My post &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;Decoupling Content Management&lt;/a&gt; gives more background on the approach. There are also &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling-content-management-video/&quot;&gt;videos of Decoupled CMS talks&lt;/a&gt; available.&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Mon, 05 Nov 2012 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Finline-editing-done-right%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/inline-editing-done-right/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/inline-editing-done-right/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
  </channel>
</rss>
