Skip to main content
 

How #xoxofest and #indiewebcamp saved me, in a way.

For me, one of the most interesting aspects of was the humility on show from people like Evan Williams, Maciej Cheglowski and Cabel Sasser - people who, in my mind at least, have "made it", and should be happy, successful and singing on hillsides with butterflies. Instead, each of their presentations was introspective and personal in different ways.

Frank Chimero captures one facet of it well in this amazing post:

After several talks, an unstated theme began to emerge, providing fuel for many of the stories and ideas expressed throughout the two days. It was often hinted upon, but only directly stated in Christina Xu’s talk. It came out as bright and searing as magnified daylight: “Independence is lonely.”

Independence is lonely.

When I moved to the San Francisco Bay Area, I did so for personal reasons. My mother has (had?) idiopathic pulmonary fibrosis, an incurable disease of the lungs that causes progressive scarring until you can't breathe anymore. I wanted to be close to both my parents to support them, and to spend more time with them. It was a good decision: I was there when she had to be bumped up to two refrigerator-sized oxygen concentrators in parallel in order to be able to breathe, I was there when she had her double lung transplant, and she's lying on my sofabed right now, in readiness for yet another session at the hospital.

So I have no regrets, even with everything else aside. However, you've probably noted that the San Francisco Bay is not the worst place in the world to be if you're making software. Legends have been made here. The people here have have made the world change over and over again - even before the computer revolution - and will do so many more times. I want to be in that mix. Call it egotism, but I believe I can help the world change, too.

But I was lonely.

Now, it's true that I wasn't fully independent, or alone. I work for latakoo, an enterprise video management startup based out of Austin, Texas. I'd been working with them first as an unpaid advisor, and then transitioned to lead their technology team. However, they were all in Texas, and I was all the way over here. Flights and Google Hangouts are useful, but they're not quite the same as having a ready-made community to plug into.

I've always liked to have my own projects, but the last big self-owned project I'd helped to start - something called Elgg - had not ended well. It still continues to be widely used, and I'm still very proud of the work we did, but the startup we'd founded with it succumbed to a series of bizarre interpersonal issues that I still don't fully understand. It's a shame, because we had been successfully bootstrapping, and had succeeded in a way that I think most web startups wouldn't be capable of, from a standing start with zero knowledge.

Those interpersonal issues were killer. There were, through the course of Elgg's evolution, a number of what felt like attempts to subjugate me in importance in the company, and in the project. I was threatening, I think, which is bizarre; if you've ever met me, you'll know that I go out of my way to be un-threatening. (And I was responsible for building the project, which is still in use in two national governments, Fortune 500 companies, etc etc.) In the end, though, it was a disagreement over a fundamental business direction that made me leave; I realized that it could never be profitable under its current heading, and I realized I didn't have quite enough clout to change this on my own. The company faded away less than a year later, and Yammer, a company that took exactly the direction I wanted to head in, was sold to Microsoft for a billion dollars.

So it goes. I left in 2009, just as the web was becoming more mobile; it was something you accessed from everywhere, rather than on your desktop or laptop. So I started to build something called Outmap, which would let anyone create, curate and crowdsource sets of geographically-tied data, and then share and access them from wherever they were. My two big use cases were (for the free version) crowdsourcing lists of free wifi access points using Twitter, which was a big issue at the time, and (for the pro version) being able to take biological species counts using a smartphone.

But then there was a kerfuffle with some people, because they felt that perhaps I shouldn't have been creating any social software at all after Elgg. All software is social, of course, and it was really an attempt to bully me into doing some things I didn't want to do, having already been bullied into doing some things that I also didn't want to do. They had a lot more money and power than me, though, which meant that I wound up shelving the project.

All of which brings me to San Francisco in 2011, feeling utterly burned-out about my own projects, and feeling shy about connecting with people in the industry because I was no longer doing the thing I was vaguely known for. I was forced to be a talker rather than a doer; something I strongly dislike. I had left my girlfriend behind in Edinburgh, I was dealing with a dying parent, I was in the midst of my startup's scrabbling-around phase (trying to find the right product-market fit), I was personally losing money every month because of the phase we were in, and I didn't know anybody at all. Without realizing it, I lost faith in my ability to create things on my own terms. Reader, I was miserable. For a year.

This is where community becomes important. Finally, in an act of desperation, I put out a message saying that I was having trouble meeting people (although, yes, that was mostly because of my own barriers). Tantek Çelik responded, inviting me to a microformats dinner in the Westfield Dome, where I had some great conversation with him, Kevin Marks and Ariel Waldman, and we collaboratively ended up submitting a pull request to Elgg, to get its profiles to support appropriate microformat markup.

A month or two afterwards, I went to XOXO and found a community of independent makers and doers who were creating things on their own terms using the power of the Internet and were improving their lives in the process. In a quiet corner one evening, I cried. And then I made a resolution: I would give myself time, every day, to build my own things again. In November, as part of NaNoWriMo, I wrote a novel.

That Elgg pull request was eventually rejected, and it was as a direct result of this that I found myself writing the first code for Bonita and then idno, and then eventually presenting my platform at IndieWebCamp. It was a lot more than a simple social platform that embodied some technical principles; for me, this journey has been more symbolic. It's been about taking my life, claiming some ownership, and rearranging it to be what I wish it to be.

(An important note: I have no ill will towards the current Elgg team at all, which is, in my opinion, doing a great job.)

I wrote the database and object code for idno while I was spending my evenings in my mother's recovery apartment, while she was getting slowly better after her invasive surgery. A couple of commits were from the ward after she was readmitted. I wrote the interfaces when I had moved back to my own apartment, and was still waking up every night with flashbacks from the day of the operation. I presented the first version - chickens! - when I was finally beginning to breathe again on my own terms, and was wondering what the rest of my life would look like. And now, I'm getting ready to release.

For me, the movement has been about software, sure, but it's more importantly been about meeting amazing people and once again being a part of a human movement. I have found my community in San Francisco, and I am no longer lonely.

They say that to have real satisfaction in your career, you should feel like you're making progress on meaningful work. More and more, I feel that way about my life. And it's helping me with my work on latakoo, my interpersonal relationships, and the way I feel about the world.

The power of XOXO isn't in the things that people are making on their own terms, although the things they're making are incredible. It's in the sharing of those things, and in the motivation to create, and in the community.

For both the and communities, I can say this: I'm proud to be there.

· Posts

 

How chickens work #indiewebcamp

I built an easy way to post chickens.

To post a chicken, or series of chickens, the user just clicks on the appropriate content icon:

51c72621bed7de1c5e787b6c

Note that the content icons are designed to be accessible both on a touch device and with a pointer.

The user is then asked exactly how many chickens they would like to post (with clear messaging: "CHICKEN CHICKEN CHICKEN?").

Once the user has made their chicken selection, a new chicken object is created. An Activity Streams "post" event is called. I've written my chicken plugin to define chicken content as having an Activity Streams object type of "note".

Twitter and Facebook plugins are listening for new "post" events with object type "note". When I post chickens, they're sent one! If I've linked idno with my Twitter and Facebook accounts, the content is sent to those plugins, and they are in turn responsible for sending the content to their respective sites.

My chickens are posted to Twitter and Facebook.

Finally, the default template on my feed defers to my chicken plugin every time someone visits on my site and wants to see my chicken content. (The template there displays chickens with some photographic help.) I've added an h-as-chicken microformat content type behind the scenes, so third-party clients can parse my pages for chicken content. And finally, the Activity Streams content is available to anyone who requests my pages with an Accept: application/json header.

It took 30-45 minutes to code, except for chicken photo search and download time. And here's what a post looks like.

51c72a08bed7de3314375bf0

· Posts

 

The tyranny of content types #indiewebcamp

I've been thinking this morning about content types and granular access permissions (which, it turns out, is ground the IndieWeb community has already tread).

Activity Streams is a data syndication format with very granular content types, which is awesome - unless those content types dictate the kinds of content you actually allow people to create with your software.

Why should a content type be strictly a note, or an article, or a place, image, video, application? One of the amazing things about the modern web is that we can combine content types to create experiences that are richer than the sum of their media parts.

At the simplest level, I want to be able to (eg) include a photo with a checkin. But why not construct a post that's a photo followed by some audio followed by some text followed by an interactive widget followed by a non-linear video with an interactive layer on top of it? One of the neat things about the is that you control your platform - and that should mean controlling the form of your content too.

Watch this space ...

· Posts

 

Centralizing my digital trail into a single #indieweb stream is making me think about what I post.

It shouldn't be surprising. I've been on the web and posting on the Internet since 1994, but posting in the usual way scatters my data all over the place. Short status updates end up on Twitter; longer, more personal ones on Facebook; checkins on Foursquare; photos on Flickr; audio on Soundcloud; etc etc etc.

My site here at werd.io is an attempt to change my posting habits from being silo-first to more of a approach: Publish (on your) Own Site, Syndicate Everywhere. Now, all my status updates, posts, photos and checkins are here in one place, on a server that I own running code that I write, and copied to all those other sites.

It's made me think about posting much more deliberately.

A friend of mine often says that you shouldn't publish anything on the web that you wouldn't be happy seeing on a billboard. I don't think that's true on the whole web - for example, at latakoo we're building tools to make sending, storing and sharing private media content (video, audio, images, large data files) easier, including a self-hosted enterprise option that federates with our hosted .com site. But for the free, public, social web, it definitely makes sense.

This morning, I checked into my office, and then I checked into a local BBQ joint for lunch. Do I really need to share that? Possibly; possibly not. It's my choice, but at least having all this content front and center allows me to make it in a more informed way. I'll probably check in a little less often, except perhaps to announce my presence at venues for special events (like IndieWebCamp this weekend) or to "tweet" links to resources I think are interesting.

This is all new, and my thoughts on it are still baking. Having one stream has certainly made me think about my identity online in ways that I haven't for years. Maybe I'll maintain several identities? Run an anonymous site for frivolous checkins or photos of my latté? The jury's still out, but because I'm empowered to run my own platform, the choice is all mine.

· Posts

 

A new website running on a new platform

idno.pngI just installed a vanilla configuration of idno onto my new website at werd.io.

idno is a personal attempt at building a publishing platform that adheres to IndieWeb principles: own your own data, publish on your own site, use existing social websites for dissemination but not as an origin. I've also tried to use microformats where possible, allowing every page to contain lightweight semantic information, as well as making it skinnable, extensible, and social.

I also wanted a chance to think about platform design again, separately from my work at latakoo (where I'm CTO) and informed by my previous work on Elgg (which I helped start nine years ago). What would I do if I was building a platform from scratch in 2013? How could I make it more useful?

I'm proud of the results so far, and the decisions I've made. Here are some highlights:

idno is based on Activity Streams, and every page is an API call

If you visit the front page of the site, or click on any user profile, the feed you see is an Activity Stream (albeit rendered to HTML). You can easily toggle a JSON version by setting application/json to be your web client's accepted type. There's automatic RSS, of course, too. And if entities have attachments - for example an uploaded file or a photo - the RSS items have automatic enclosure tags, as you'd expect. (That means idno can host podcasts and deliver other files via RSS.)

The system is designed so that all plugins automatically have an API without having to do any extra work. I'm also planning on implementing HTTP signatures, or something like them, to authenticate seamlessly in addition to standard sessions.

idno uses HTML5 (and Bootstrap, jQuery)

HTML5 needs no introduction or reasoning. Bootstrap is a very handy set of rails for responsive front-end design (with lots of pre-existing themes), and jQuery is an integral part of that. On top of that, idno bakes in some useful features behind the scenes - like autosaving works in progress using your browser's local storage, for example.

idno runs on PHP 5.4 with a MongoDB back-end.

PHP is a controversial decision, but it remains one of the most widely-deployed web scripting languages in the world. Version 5.4 is old enough to be installable on most servers, but new enough to contain some really neat features. Idno makes extensive use of the JsonSerializable interface. (It also uses a lot of 5.3 features like lazy loading and namespaces.) MongoDB, meanwhile, means that we don't have to force plugin writers to maintain schemas, nor to emulate NoSQL in MySQL, which has been a tactic I've used in the past. So far it's performing great, and it also provides GridFS, a useful file store.

All of this a work in progress, which has mostly been coded late at night, and there's still a lot to do. For example, at the time of publishing, the hashtags below aren't linked anywhere and aren't automatically marked up, but I bet if you check back in a few days, they will be. Another is that although my posts are automatically POSSEd out across the web, I can't yet posts things like replies to tweets from the idno interface. Nonetheless, I invite the brave to check out the GitHub repository (idno is released under an Apache 2.0 license), and let me know what you think.

· Posts