Skip to main content
 

@fdevillamil That's about it for now, because @medium doesn't have a write API. We're thinking of ways to more easily see manual .

· Statuses

 

· Photos

 

· Photos

 

@RichardSmedley Seems fair; Twitter is where your friends are! The 's helps: http://indiewebcamp.com/POSSE

· Statuses

 

Twitter now not letting you create apps if you don't have a cell no. on your acct. implications?

· Statuses

 

How idno handles #POSSE syndication to third-party sites #indieweb

Last week at Homebrew Website Club, I was asked how Idno syndicates to third-party sites like Twitter when I post content.

Here's how it works.

First of all, Idno has a plugin system, that allows new functionality to be added system-wide. As well as new kinds of content like slide presentations, plugins are available that interact with the APIs of Twitter, Facebook, Foursquare and Flickr.

When I install any of those plugins in Idno, I'm taken through a process where I register my Idno site with the third-party API. Each of those sites has a slightly different process, but in each case it takes about 30 seconds.

Once the link has been made, the plugin shows up as an option in Idno's user settings screen. I click "settings", and then click a button to link my account to the site:

52ddc8a9bed7de923bd9b28b

This is exactly the same procedure as logging in with any of those sites, or attaching any third-party application. It's about two clicks: in the case illustrated above, I'm taken to Twitter, which asks me to confirm that I want to give Idno permission to use my Twitter account, and then taken back to my Idno settings. Internally, my OAuth token for that site is saved to my user account.

Here's where things get interesting.

Remember I said that Idno's content types are also provided via plugins? There's a plugin for status updates, for photos, blog posts, events, etc etc. Whenever I want to add a new content type to Idno, I add a plugin. (They're really easy to write; the presentations plugin was written in about an hour, while I was recovering from a root canal operation.)

As well as descriptive content type - "status update" - each plugin announces a generic content type that maps to those used by the activity streams specification. A status update is also a "note"; a blog post is an "article". This allows plugins to extend functionality for certain kinds of content without dictating which plugin you use for that content. Someone can add extra logic for status updates, while not caring which status update plugin I actually use.

When I post new content, the system pulls up an interface supplied by that content's plugin, and also asks any syndication plugins if they're able to handle content of this type. So when I click on my "status update" button, Idno asks plugins if they're able to syndicate content of type "note".

Idno automatically renders some buttons for me based on those plugins. If I enable the "Twitter" button, my content will be syndicated to Twitter when I post it. If I enable the "Facebook" button, it'll go to Facebook, too. If I later decide to add a button for Path or LinkedIn or Friendster via a plugin, it'll show up there, and work in exactly the same way, without me having to change any of the status update plugin.

529a339fbed7ded008743763

When I hit Save, the syndication plugin receives information about the content type (but not which plugin created it), as well as information about my account. It retrieves my API token from when I linked my account through my settings panel, and uses that to sign an API request posting the content to that site. It then retrieves the URL of the syndicated content and saves it to the local content in Idno, so a "syndicated to" link can be displayed underneath it. (Check at the bottom of this post's page: you'll see a link to Twitter.)

This process works throughout Idno. Photos (of generic type "image") can be syndicated to Facebook, Twitter and Flickr, and while the logic is different for each site, the user interface flow is the same for each one. This works whether I'm posting from a laptop or a phone, and whether I'm on the standard web interface, a custom interface or the API.

It's important to note that none of this takes much time, for any of the parties involved. Writing a content plugin takes about an hour; writing a syndication plugin can take much less time, if the third-party API uses OAuth. Site admins can install a plugin and set it up in a few minutes. The process for the user takes mere moments, and that's the most important thing.

· Posts

 

· Photos

 

<a href="http://twitter.com/obra">@obra</a> Check out the non-bundled plugins in 's GitHub space (including Twitter): https://github.com/idno

· Statuses

 

What idno is

idno.pngThis site runs on idno: an open source social publishing platform that I've been working on for the past few months in my own time.

You may know that I co-founded Elgg, the open source social networking engine, which is used by the likes of Oxfam, NASA, the World Bank and several national governments as a social intranet and learning platform. The original thinking around Elgg happened a decade ago. Given that, you shouldn't be surprised to learn that my original thought experiment was: What decisions would I make if I was building Elgg today, in 2013? What would I do the same way, and what would I do differently?

Some technical decisions

I knew that I could make a faster social networking platform, with a better templating engine, and a much smaller codebase - even while sticking to PHP as an underlying scripting language. Partially that's because PHP 5.3+ is a much better development platform than earlier versions. It's also because there are now some well-tested, intelligent back-end frameworks, like Symfony 2, and front-end frameworks, like Bootstrap.

One of the major decisions I made when we built Elgg 1.0 was that not only was it a hassle for plugin developers to write their own database schemas - it was undesirable to the point of being dangerous. We effectively faked a NoSQL schema in MySQL by creating a data model around entities (first-class objects like users and blog posts), metadata, annotations and relationships. People were taken aback, and it was row-intensive, but it worked, and it continues to work today.

Nonetheless, today we have NoSQL, so is based around MongoDB. This means there are far fewer database transactions involved - and adding new data to an object is incredibly easy. Together with a plugin architecture based on lazy loading, and Symfony's excellent observer pattern support, as well as the framework code I've built, I'm able to write a new plugin in an hour or two. That's important for a system I'm building in my spare time!

51d37de3bed7de3636a1d24e

Meanwhile, all of the things about that were great - a plugin architecture, granular access permissions - are intact. And on top of that there's a faster framework, and a responsive front-end that works really well in a mobile browser. Great!

But that's not the end of the story.

The community has existed for years as a force to advance the state of the independent web, and to promote ownership of our own spaces. IndieWebCamp is an annual event for creators to discuss their platforms, technologies and ideas.

One of the big concepts to come out of has been : Publish (on your) Own Site, Share Everywhere. The idea is that your friends or followers shouldn't have to join your site to engage with you; you should be able to post on your own site and be read on Twitter, Facebook, Foursquare, or wherever they happen to be. idno has built-in plugins for status updates, blog posts, images, checkins and events. Correspondingly, it also has plugins to this content to Twitter, Facebook, Foursquare and Flickr - and writing more would be trivial.

That's just as well, because I've committed to only post on my own site and copy to third parties (where that's possible).

Reinventing the social web

This year, though, something else happened. Using Microformats 2 (a way to very simply embed meaningful markup into any web page) together with Webmention (a way for any web page to lightly ping the pages it references), the community participants created the first indieweb decentralized comments thread.

Using nothing more than the markup on their own web pages and a very simple protocol, the participants created the basics of a decentralized social community, where each comment is hosted on its owner's own site, but nonetheless forms a coherent, easily-readable narrative.

This is a very big deal.

It's a completely different model to traditional social networking, where content typically doesn't bleed outside the walls of a specific social site. It's also different to previous decentralized social networking efforts, which have been in many ways more sophisticated, but much harder to join in with. Because a simple IndieWeb-compatible social tool can be built in an afternoon, just as a simple RSS-compatible tool can be built in an afternoon, these concepts have a much greater chance of succeeding.

51d2f810bed7dee523aaad1b

Needless to say, idno is now a first-class participant in the decentralized IndieWeb social community. I've implemented IndieWeb comments, and moved immediately to also implement decentralized events that anyone can RSVP to, as well as decentralized likes. It also integrates with Firefox's brand new Social API.

You can browse the web and reply to any page, on a site that you truly own.

As more sites and platforms implement the IndieWeb social standards, those interactions will become correspondingly more social. For now, though, you can go ahead and interact with the web already.

Beyond that, idno will continue to develop over time as a community platform in itself. I'm using it here on my own site as a single-person publishing platform, but it doesn't have to be that at all, and all those Elgg-style features will continue surface as time goes on. But there's a big, wide web out there, and it's important to embrace that as widely as possible.

idno's homepage is here. Meanwhile, I continue to do work I'm proud of in my actual job, working for latakoo to facilitate media storage and transfer for video professionals and the broadcast news industry. We're talking about using decentralized social networking there too - but more on that another time.

· Posts

 

@obra Super-neat. There are some extras at https://github.com/idno, if you want to try or (eg) install your own JS.

· Statuses

 

· Statuses

 

Put a bird on it

Put a bird on it

Portland is very bird-friendly.

Also, this photo should to Flickr (as well as Facebook).

· Photos

 

My chicken may actually be the peak of my career. All downhill from here. http://werd.io/view/51c5ebe2bed7de88581e1f51

· Statuses

 
Untitled

Will Norris demos to Google+.

· Photos

 

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

 

#indieweb checkins; trying to decide the best approach

Map readersI've been self-publishing my photos and status updates for less than a week, but I already wouldn't do it another way. Idno lets me post easily from my phone or laptop, and the updates show up on the sites I'm connected to. Right now, that means Twitter and Facebook, but sites like Flickr and LinkedIn are coming. (This is all available as open source code, by the way.)

Technical aside: when I post something new, it gets an Activity Streams object type and verb. Status updates are notes, blog posts are articles, and photos are images. Plugins then listen for when new, public content is created with those object types (and, right now, the "post" verb) , and syncs them to third-party sites as appropriate. That way someone else could write a better status update plugin than mine, and nobody would have to rewrite the plugins that synchronize content.

The other silo that I use all the time is Foursquare. Theoretically, taking the user's location isn't hard - did I mention I'd written a book on Javascript Geolocation? - but in reality, this is harder than just grabbing the user's current latitude and longitude and saving it to an Activity Streams place object. Foursquare maintains an extensive database of venues, that's so good that a bunch of third party services use it as well. I don't really want to have to duplicate that.

There are alternatives: OpenStreetMap has a downloadable free software database of locations. The downside is that you need to extract points of interest yourself - and the database, perhaps predictably, is over 28 gigabytes. That's far too much data for most individual sites to be handling themselves. It's certainly not something I'd like to deal with on my personal server.

For me, the perfect use case is this: I click "check in" in idno, the browser grabs my location, I'm presented with a list of nearby points of interest and I select one. The content is saved locally and then synchronized to location-centric services like Foursquare and Facebook Places.

Now, I could use Foursquare's database to populate that list of locations, but somehow that feels unclean. The purpose of me self-hosting is to own my own data, and using that database would make me dependent on Foursquare's service. Also, the flip-side of that also makes me uncomfortable: if my purpose is to put less value into Foursquare's service instead of my own site, I probably shouldn't be using the database they put so much investment into.

I'm not sure anyone else is syndicating their location to sites like Foursquare from their own sites, but if they are, I'd love to hear from them. Until then, I'm considering writing the simplest possible shim: a geolocation plugin that takes my physical location and lets me save a "hint" along with it, that will act as a way to gently nudge the third party synchronization plugins to pick the best venue. The hint wouldn't be publicly displayed, but for example, I could type "amendment" when checking into one of my favorite brewpubs in San Francisco, and that'd be enough for me to be checked into 21st Amendment on Foursquare.

Speaking of which, time to head over the bay and grab a pint ... Sadly, I won't be checking in just yet.

· Posts

 

Every day I'm -ing, -ing. Actually, that's not true. I really just started today.

· Statuses