IndieWebCamp is a 2-day creator camp focused on growing the independent web



Falcon is a personal publishing (tweeting, blogging, realtime syndicating) web application. There is an instance of Falcon running at and serving/syndicating blog and tweet content.

Attendees that are using it on their own site:


Note: this documentation is purely for informational purposes.

There are many aspects of this design that are not optimal and that I'm working on improving. However I figured it was still worth documenting it to capture it.

If some of this helps you with designing your own indieweb implementation, great. If something doesn't make sense, ask, as there's a good chance it's something that I should fix in the design.

Thanks, - Tantek 19:37, 23 March 2013 (PDT)


Post Types

Falcon supports the following 5 kinds of posts.

Note: auto-linking and auto-embedding for all types that support them is all accomplished with the open source CASSIS auto_link function.


notes posts are supported with

  • white-space (serial space characters, line-breaks, blank lines)
  • auto-linking of URLs, @-names to Twitter
  • auto-embedding of JPG/PNG/GIF/MP4/MOV/OGV and Youtube/Vimeo URLs
  • POSSE to Twitter of up to 118 chars with permashortid of original post, or first 110-113 chars with ellipsing/truncating and permashortlink to original post. (assuming 6 char personal short domain, e.g.
  • webactions: Favorite, Retweet, Reply with Twitter fallbacks


articles as blog posts are supported with:

  • POSSE to Twitter of up to 113 chars long article name with permashortlink of full post, or first 110-113 chars with ellipsing/truncating and permashortlink to original post. (assuming 6 char personal short domain, e.g.
  • webactions: Post with Twitter Tweet fallback.
  • citation UI for copy pasting URL or HTML embed with h-cite markup.


reply notes are supported. Replies are similar to notes, but for replying to tweets, commenting on other posts.

  • with minimal reply-context support (linked URL of original being replied to)
  • with multi-reply reply-context presentation support too.
  • current reply limitations:
    • replies directly to tweets (Tweet permalink URLs) are well supported. I've wanted to POSSE my @-replies to Twitter and have them thread properly on Twitter for a while, so even just implementing this helps me interact with friends who use Twitter instead of their own site (most people).
    • replies to indieweb URLs are supported for posting / storing / presenting, but won't thread to their POSSE copies.
    • multi-reply support provides a manual work-around for replying to an indieweb URL and also replying to the POSSE copy of that indieweb URL (and thus threading with it on Twitter).
      • This gives me the ability to (but a bit inconveniently) post a reply to an indieweb post, and also post a POSSE'd @-reply that threads properly to the POSSE'd copy of the original indieweb post I'm replying to. There's two itches below for supporting replies either to POSSE tweets or original posts, automatically discovering the other if present, preferring the original post in reply-context presentation, and threading with the POSSE tweet if any.


rsvp notes are supported. RSVPs are similar to reply notes, but for RSVPing to indieweb event posts. (since 2013-264)

  • p-rsvp marked up with a <data> element in its reply-context where it says "RSVP yes to". E.g. [1].
  • only works for indieweb event posts - no POSSE reply threading support.
  • only supports RSVP "yes", via text of note starting with the literal text: "going to "
  • assumes first in-reply-to URL in the note is the URL of the event post being RSVPed to.
  • webmention must still be sent manually, e.g. via curl.


comics - similar to articles, except the post name is incorporated into the image and not displayed separately. The image is served wider than images in articles, and is marked up with:
<div class="comic"><object type="image/jpeg" ...> fallback markup </object></div>
In addition to the image, there's a further visible description, hyperlinked, semi-structured.
  • fallback markup inside the comic image describing the comic strip scene, actors, and dialog.
    • including markup of the plain text post name (p-name) which is otherwise reflected in the comic image.

POSSE Details

Falcon currently supports POSSEing:

  • notes, replies, rsvps directly to Twitter - first 112-120 characters (depending on content), white-space preserved
    • reply threading on Twitter - reply notes are POSSE'd as @-replies with proper threading (currently requires user input of original tweet permalink URL that is being replied to).
    • notes indirectly to Facebook - standalone POSSE'd notes are then also automatically syndicated to Facebook (I (Tantek) have Twitter setup to do this)

Publishing UI

Falcon publishing UI currently consists of the following:

  1. BBEdit (your choice of text editor) write new post in the storage file directly (see below for storage file format)
  2. Terminal scp (update storage file on server)
    • at this point the post is live on the site, including permalink, home page (if among recent posts), Atom feed
  3. minimal verify, PuSH, POSSE web UI that:
    • provides a text input field for a tweet URL that the next post is in-reply-to
    • shows a preview of the next post (notes shown enough to fit in a tweet, auto-linked; only articles' names are shown. Both represent what will be tweeted in the POSSE step).
    • provides a button (Tweet it) which when pressed, submits the form and does all the
      • PuSH sending,
      • POSSEing to Twitter, and
      • saving resultant Twitter syndicated copy URL to storage.

Publishing standards

Falcon's publishing support includes:

PHP support

Falcon has some code to support various PHP configurations (and sometimes misconfigurations, such as missing local session file path).

Legacy support

Falcon supports the following legacy technologies for specific use-cases.


Falcon supports:

  • Atom with ActivityStreams object type annotations.
    • Use-case:'s Atom feed of articles is consumed by Planet Mozilla.
  • PuSH notifications when posts are published
    • Use-case: / Identica subscribers get real-time updates via PuSH notifications from

Bug Reports

None currently, but if you see something broken, add a note here and I'll look into it. thanks! - Tantek Çelik

Working On

The next things I'm working on designing and implementing in Falcon. These are all things where I have made some progress with UX, code etc. and thus am "in the middle of" implementing. Roughly ordered by personal priority.

auto Bridgy POSSE to FB

Rather than manually using the publish form at,

For all:

  • articles
  • notes
  • interactions with (replies to, likes of) FB posts (none so far)

that I post on my own site,
when clicking the "Publish" or "Tweet it" button (which should be renamed, "PuSH and POSSE it" maybe?) :

  1. if there is no rel-syndication link to FB on the post, display a
    <a href=""></a>
    link instead (so Bridgy sees that)
  2. send a webmention to Bridgy publish like:
    curl -i -d "source="
    (need https and www to avoid redirect, which won't POST)
  3. parse the results of the curl, e.g. something like
    "url": "",
    "type": "post",
    "id": "456_789"
  4. save the [URL] in a rel-syndication hyperlink in storage on the post with the link text "Facebook post [id]", *after* the Twitter syndication link

Then anytime I "PuSH and POSSE" an article, note, or a reply/like of a FB post, a copy should automatically show up in my FB timeline.

Once confirmed that this works:

  1. go to Twitter preferences for @t
  2. turn off cross-posting to FB
  3. edit the Falcon#POSSE_Details description above to note POSSEing to FB via Bridgy (instead of via Twitter)
  4. edit the POSSE IndieWeb Examples to note POSSEing to FB via Bridgy (instead of via Twitter)
  5. edit Facebook#POSSE_out_to to move from "from Twitter " to "Bridgy" subsection

webaction buttons in streams

In short two things:

  1. update look of web action buttons to be more Instagram-like
  2. web action buttons on notes/articles in stream (home page) / collection (day and new month archives)
    1. screenshot existing stream presentation (desktop, mobile) and post as example on composite_stream#IndieWeb_Examples
    2. implement web action buttons on notes/articles in stream
    3. screenshot new stream presentation (desktop, mobile) and post as example on composite_stream#IndieWeb_Examples

Update look:

I want to add web action buttons like Instagram has - I really like their grey boxy buttons with both icon and text, so something similar, e.g. in stream text mockup:

... 11:40 on 2014-06-29 ( t4Wq1) using BBEdit [ ♥ Like ] [ ♺ Repost ] [ ↩ Reply ]

I find that Instagram's usage of a boxy grey backgrounded buttons serves also as a nice visual separator between posts there, so I'm hoping to get a similar effect with a line of such buttons under my posts on my stream.

And update the citation UI on permalinks as well to be consistent. Text mockup:

... 11:40 on 2014-06-29 ( t4Wq1) using BBEdit URL: [ http: .... ] HTML: [ <cite class="h-cite"> ... ] t View (Conversation) on Twitter [ ♥ Like ] [ ♺ Repost ] [ ↩ Reply ]

Note: these emoji are not visible on Linux (Fedora 20), nor Windows 7:

  • 🐓 rooster
  • 🐦 bird

And these are not visible on Linux (Fedora 20)

improve replies details

improve reply-context support

Improve reply-context support in reply posts (some of this is easier than the other improve replies features below)

  • Why? Provide readers better reply-context of the URL (or URLs - see multiple-reply) I'm replying to. Better user experience through increased comprehension from the provided context.
  • Currently works for showing all in-reply-to URLs (union of explicit rel-in-reply-to and u-in-reply-to markup). Necessary improvements:
    • Show @-username in reply contexts for replies to Tweets
    • Show icon in reply contexts for replies to tweets and indieweb posts
      • Show icons for replies to indieweb posts using a nicknames-cache and their Twitter icon
        • distinguish presentation of a multi-reply to the same post+POSSE copy, vs multi-reply to different people/posts.
    • vvv Rest of this his harder than other improve replies features, and doing reposts, so reprioritize the remaining "improve replies details" task when I get to this point. vvv
    • Store and show dt-published of original post
    • Store and show full name of author of original post
    • Store and show tweet text / p-summary of original post

post reply to any URL and auto POSSE

Do rel-syndication discovery of POSSE tweets in posting form / UI to support POSSE Replies to Twitter

  • Per:
  • Using:
  • So I can:
    • enter just the URL of an original indieweb post I'm replying to into my posting storage (or UI),
    • have Falcon's posting UI automatically discover the link to the tweet copy of the post
    • add an in-reply-to link from my post to the tweet I'm replying to
    • have my reply POSSE copy thread with the POSSE tweet of the original.
  • Why?
    • automatically thread the POSSE copy of my reply with the POSSE copy of the original indieweb post that I was replying to.
    • remove step of me having to look for the "also on twitter" link on an indieweb post and explicitly copy/paste it into my storage/UI.
    • Provide better user experience for those reading my posts on Twitter by providing them the threaded context right there in their reading experience.

post reply to any tweet and auto indie-post reply

Do original-post-discovery in posting form / UI (approach: use original post endpoint from server)

  • So I can:
    • enter just the URL of a tweet I'm replying to into my posting storage (or UI),
    • have Falcon's posting UI automatically discover the link to the original post (that the tweet is a copy of)
    • add an in-reply-to link from my post to the original post I'm replying to, before the in-reply-to of the tweet
    • while still having my reply POSSE copy thread with the POSSE tweet of the original.
  • Why?
    • automatically link from my posts to more indieweb posts instead of their Tweet POSSE copies - prefer linking to indieweb original content and URLs
    • remove stress of having to check a tweet manually to see if it has an indieweb original version - less thinking about having to find an original permalink myself manually.

send webmentions for posted links

Send webmentions for posted links:

  • Using Discovery in PHP approach to find endpoint then curl to send.
  • Why?
    • Enable syndicating posts to IndieNews (assuming I have rel-syndication links to IndieNews implemented - perhaps as post option in my UI). Help demonstrate IndieNews as a proof of concept of an indieweb-friendly link aggregator.
  • in particular do a HEAD request first, then GET if no endpoints found and type is text/html or application/xhtml+xml.
    • Why?
      • simplest way to both minimize bytes requested by my server and avoid GETting non-HTML links (which I do link to plenty often in my posts)
  • if no webmention endpoints found, do fallback discovery for pingback inside same HEAD/GET results and send pingback, using an approach like
    • Why?
      • To support posting comments on indieweb community member's sites that receive pingbacks but not webmentions, e.g. Laurent's Testing #indieweb federation.
  • in particular to links I'm replying to
    • Why?
      • To participate in federated indieweb commenting on others' sites! (this is a big milestone for any indieweb implementation)
      • To demo real-time comments showing up, e.g. on
      • To comment on IndieNews posts (assuming I have rel-in-reply-to links to IndieNews URLs implemented) as a proof of concept of an indieweb-friendly comment aggregator/threader.
  • show webmention results - Perhaps show a list of outbound links with send result for each (no webmention/pingback endpoint found, or green checkmark webmention/pingback sent, or red webmention/pingback rejected, distinguish webmention/pingback for each)
    • Why?
      • UIs that provide feedback on actions instill more confidence that the actions took place (similar to providing the tweet permalink of a successful POSSE to Twitter).
      • Debug/diagnose possible problems with other indieweb sites (may expand later into part of the whitelist, webmention+howyouknowme protocol/UI)
      • Convenient UI to specifically check (click-on) links with successful webmentions to see if they parsed my reply into their comments section correctly or did something else with it.
      • Might help discover sites with newly added webmention/pingback receiving support.
      • Could help demonstrate/explain how webmentions work

implement reposts of tweets

Implement reposts of tweets:

  • Why? So I can retweet tweets from my own site (rather than directly on Twitter), keeping a copy of the retweet on my own site, while still POSSEing the retweet on Twitter, so the original tweeter sees that I've reposted/retweeted it.

simple repost of tweets:

Recently (2014-06-04..05) I was at a conference where I wanted to retweet a quote someone else captured from one of the speakers rather than make a similar post myself.

However this time I reached the point of not wanting to just retweet on Twitter any more - I wanted to retweet it from my site, thus keeping a copy on my site, while still POSSEing a native retweet on Twitter.

In short this means implementing:

  • Detecting storage of a u-repost-of property
    • treat first instance as canonical / primary, which can be loaded (following redirects) to get the original post
    • additional u-repost-of properties are assumed(required) to be the repost chain all the way to the original post.
    • keeping the retweet chain is useful in case one of the intermediate accounts is deleted
  • Posting UI - alter Posting UI accordingly for reposts of tweets
    • No character count
    • No ellipsing
    • Retweet rather than Tweet button
  • POSSE call Twitter retweet API rather than update API
  • Save POSSE URL - save new retweet tweet id as rel=syndication into storage, so web action buttons work properly
  • Presentation for a repost
    • See 2014/reposts#Repost_presentation for details of what and how to present a repost including:
    • icon of original poster
    • original tweet posting time.
    • some sort of retweet icon to indicate that it was retweeted by me
    • time when retweeted (perhaps near retweet icon and an icon of myself)

mobile recent articles box

There have been enough times that I've referred to recent articles in a mobile context (while walking around with someone) on my or another's mobile device, that it would be useful to move my recent articles box to the top of my site even in the mobile view. Longer term, such a box should simply be a movable Falcon template item.

mobile home template header icons folders

Implement mobile home template header icons folders per Toward A People Focused Mobile Communication Experience: What Next

  • Prototype HTML+CSS+JS for mobile home template header icons folders
    • in a separate standalone minimal home.html - as simple re-usable code (should be easier to create and understand/maintain)
    • Use JS to output inline markup for links to comm protocols that are spammed (e.g. email-ID in facetime: )
    • Consolidate photo and h-card with description at top, followed by Contacts, Create & Meet, Elsewhere links, styled minimally
  • Deploy on personal site by incorporating home.html into live index.html markup
  • Prototype for iOS7 for limited/focused testing on iPod/iPhone and user feedback
  • Generalize to work for FirefoxOS device which should then work well on Firefox for Android (and Android in general).



Contact expanded

When a viewer taps the Contact icon folder it expands as follows, and then the viewer can tap the mode of messaging/communicating they want to use to contact me which immediately opens a new message (txt, FB Messenger, G+ Hangouts, AIM IM), or starts a new call (FaceTime, Skype), or Twitter new direct message window. Directly to communicating - bypassing all comm app home page / activity distractors.

The one change I'd make from these mockups are some of the labels. All of the labels should be verbs, not nouns, indicating the action the user wants to take and thus reinforcing their intention.

E.g. "Messages" should be "txt message", "Messenger" should be "FB message", "Hangouts" should be "GTalk", and the rest seem to read fine as verbs.


iOS6 mockups

Original prototypes done in iOS6, probably not worth implementing, but may contain interesting UI ideas nonetheless:


Contact expanded

The one change I'd make from these mockups are some of the labels. All of the labels should be verbs, not nouns, indicating the action the user wants to take and thus reinforcing their intention.

E.g. "Messages" should be "txt message", "Messenger" should be "FB message", "Hangouts" should be "GTalk", and the rest seem to read fine as verbs.


event posts

Support for publishing event posts, essentially:

  • permalink pages for events with h-event as the root object for the page
  • home page: have them automatically appear as part of my stream/home page at the event start time
  • upcoming box: have the next 3 upcoming events automatically appear on the "next 3 events" box on my home page

process and show webmentions

As part of implementing "event activity (event creation, comments, RSVPs)", Falcon will have to process all webmentions received, parse/store them (with appropriate caching), and make them available for posts to display (as likes, reposts, comments, and RSVPs).

improve rsvp reply notes

Improve rsvp reply notes:

  • implement p-rsvp options of "no", "maybe", and "tracking"
  • use presence of p-rsvp to display an RSVP differently than a simple reply - more calendarish.
  • send a webmention - should get automatically from the above reply webmention implementation, but just explicitly noting this as something that needs to work.

implement reposts of indieweb posts

Implement reposts of indieweb posts, and POSSE syndicated copy:

  • Why? So I can repost native indieweb posts, and if they have a rel-syndication link to tweet, then as part of POSSEing my post, the tweet of the original can be retweeted!


There is some support in Falcon for displaying archive pages but they need more work.

archive pages

  • need better CSS for pages of all posts from a particular

archive navigation

  • need a UI for navigation across and into/out of archive pages. Something better than a big list of years/months links that are all too common on blogs.

archive templates


Beyond that, I find my prioritization changes often enough that I just keep a loose collection of thoughts/ideas/wants/brainstorms that I occasionally iterate on until something reaches the point of - hey, I could finish coding that in a day or two.


Itches are other things I want on my site but haven't started implementing yet. They are a collection of annoyances that have respective features / improvements. As their annoyance level bubbles to the top, they're likely to become concrete "Working On" tasks.

Payment Links

Similar to the mobile communication links, it would be good to have a set of payment links/buttons which show the user different ways to pay, in order of my preference, and then the user can choose which one they can and want to do.

Indie Checkins

Itch: really getting tired of venue griefers/abusers/overmergers on Foursquare. Overmergers: people who take two distinct venues and merge them into one because they have some mistaken idea of what a "venue" is. Overmerging ends up redirect both previous unique URLs to one of them, and it effectively destroys your history at checking into either, because after that, you don't know which it was. It's like wiki vandalism but worse because there is no history and no accountability.

  • Scratch: Indieweb checkins from/on my own site, which then POSSE out to Foursquare (required for me because I'm a heavy Foursquare user and I wouldn't switch over to using my own indieweb checkins without that automatic capability. Mobile web support via Geolocation API is a must.)
  • Scratch: Indieweb venues are essential to make indieweb checkins work and maintain data fidelity. ** Challenge: how to deal with POSSE'd venue references when silo venues are subject to such vandalism as noted in the itch description.

More thoughts on what I want for indieweb checkins on my site:

Levels of access

Four levels of privacy/access that I personally want / have use for.

  1. myself only. use-case: personal/private logging.
  2. passive friend access (i.e. they can see when they're logged into my site, "current location:", but I'm not broadcasting to them on silos). use-case: ok with friends knowing where I am, but it's not important enough to broadcast to them (reduce unnecessary interruptions to my friends).
  3. broadcast to friends only (i.e. POSSE out to Foursquare). use-case: I'm somewhere where I wouldn't mind if friends in the area happened to be informed in real time and show up.
  4. public checkin posts. use-case: public events where there's many more people than just my friends, and I'm ok with anyone knowing that I'm there (e.g. I'm speaking at or attending a conference).

Past discussion sessions

I've led some discussion sessions on this topic and we took notes on what we figured out:

Key realizations:

  • a checkin may just be a note with venue information (and nothing else, maybe text fallback like "at venuename")
  • a checkin with shout may just be a text note with venue information
  • a checkin with photo and shout may just be a note with a photo and venue information
  • Thus the key to implementing checkins is just:
    • figure out how to attach venue information to posts and notes in particular
      • i.e. what to add to h-entry, would a class="p-location h-card" be enough to imply at venue when posting?
    • figure out how to present notes that are checkins as implied by the presence of venue info:
      • only have venue information (with possible text fallback)
      • have an explicit text note with venue information (again with possible text fallback)
      • have a photo (optional text note) with venue information (again with possible text fallback)

I've been abstracting what we've figured out so far into these pages, but much of what was discussed in those sessions has not quite made it into them:

More help/input/contributions/edits welcome!


Having updated and/or deleted a few notes and had to go do so manually on Twitter, I'd really rather have it be more automatic from my site and thus I'd like to implement:

In addition, the UI and code flow for editing/saving (updates), and deletes will help me better understand requirements for the more functional indie wiki pages (as described below).

Indie Wiki


  • feeling icky about hosting my personal wiki on the PBworks wiki silo
  • tired of not being able to edit it on mobile
  • disgusted with the ugly PBworks URLs
  • dislike the PBworks UI

Scratch: have every page on my site by default be a wiki page made "wiki-like" by Falcon, where wiki-like means:

  • editable with web UI on any reasonably modern web browser, not requiring javascript
  • browsable version history (maybe with web sign-in only? no need to index version history)
  • browsable versions (maybe with web sign-in only? no need to index old versions)

Brainstorm started here:

Display Received Webmentions

Process my queue of webmentions at and implement some sort of comments-presentation to show them on my posts.

  1. simple date-time-ordered (oldest first) as comments
  2. display likes+favorites and reposts separately from comments

Accept Webmentions Directly

Write a webmention handler endpoint and support accepting, handling, storing webmentions in addition to displaying them.

Switching rel=webmention handler from to direct handler on site.

Private Groups

Not high on my priority list (though would be necessary to figure out to extract myself from FB).

Use-case: I've made use of private groups a bunch on Facebook in the past year. So I see their value.

I am not sure how the indieweb equivalent would work but I think something like this:

I want to be able to from my own site make a private group work for indieweb folks:

  • Create a private group hosted on my domain (secondary: on an external custom group-specific domain)
  • Add people to it (by domain name)
  • or maybe just Invite people to join it
  • Post to it such that only those in the group can see it (expectation, future members could see it too)

I want to be able to from my own site interact with a silo private group:

  • Watch (reading) posts and other activity on a private group on a silo like a Facebook group.
  • Publish (privately? to my personal site mirror of the private group?)
    • Posts / notes to the private group, and POSSE to the silo private group
    • Replies to posts in the group and POSSE to the silo private group
    • Like posts in the group and POSSE to the silo private group
  • Receive notifications on my homepage of:
    • Mentions of my name in posts or comments in the silo private group
    • Likes in the silo private group of my comments or posts that were POSSEd to the silo private group
    • Comments in the silo private group of my comments or posts that were POSSEd to the silo private group
  • UI for responding to such notifications by creating a reply or liking or writing a new post as described in Publish

Implementation Design

Code Files

Falcon consists of PHP code (some of which is CASSIS) to display posts and code to write/publish/syndicate posts. Falcon code consists of only three files (bolded), some additions to the root .htaccess, and the libraries cassis, relmeauth, and tmhOAuth in the following structure:

URL routing and display: (live at )

  • cassis.js
  • falcon.php
  • index.php
  • whistle.php (see Whistle)
  • .htaccess - only a section therein

write/publish/syndicate: (live at )

Note: as I cleanup, refine, and rewrite useful functions in Falcon in CASSIS, I've been open sourcing them in cassis.js. The following building block functions have been incorporated into other projects:

  • ellipsize_to_word() - particularly useful for POSSEing out to Twitter
  • auto_link() - better plain text autolinker (and embedder) than Twitter, Facebook, and G+.

- Tantek


Falcon currently only uses templates for the home page and feed. The rest of the output markup is hardcoded in falcon.php (Note: that's not good design, all output markup should be in template files. There should be no markup in the implementation code itself.).

falcon.php looks in the same directory for:

  • index.html - to construct a home page with the most recent N (default: 20) posts.
    • .stream - the most recent posts are placed into an ordered list element (<ol class="hfeed">) which is then appended as the last child of the first element with class name of "stream" in the index.html template.
  • updates.atom - to construct a home feed with the most recent N (default: 20) posts.
    • feed "meta" elements as well as a series of <entry> elements representing the most recent posts are appended as the last child(ren) of the last element of the template (which happens to be the <feed> element - not a very flexible design - then again, neither is Atom itself :P ).

Storage format

When displaying the most recent N posts, Falcon looks for YYYY/B.html files in the current directory (YYYY being the current year and B being the current bim) and earlier files as necessary to retrieve N posts or until a previous storage file is not found, whichever comes first.

When displaying a post permalink or archive for a particular year, bim, month, or day, Falcon computes the paths to the necessary file(s) according to year and bim and reads them.

Each bim storage file is treated as XML-Valid HTML5 hAtom and XPath is used to retrieve all .hentry elements in document order inside the first .hfeed element. The .hentry elements are ordered most recently published first.

For each such hentry, the first (in document order) instance of each of the following is retrieved (also using XPath) from the hentry's descendants:

  • .published - element parsed per the Value Class Pattern: Date and time values
  • .entry-title - element parsed for both plain text and nested markup
  • .entry-content - element parsed for both plain text and nested markup
  • .using - element parsed for plain text
  • [rel~=bookmark] - element parsed for its href attribute
  • id - the id attribute of the hentry element itself is also retrieved as plain text

All instances of each of the following is retrieved (also using XPath)

  • .u-in-reply-to - element parsed for its href attribute

All "parsed for plain text" instances trim leading/trailing whitespace but preserve all other whitespace both for note permalink presentation, and for POSSEing notes to Twitter.

Every time an "hentry" is published & syndicated to a 3rd party service (POSSE style of course), falconpost.php appends a child element to the end of the "hentry" with:

  • class="url u-syndication"
  • rel="syndication"
  • href={absolute URL to syndicated copy on another service}
  • innertext - perhaps name of service and service-specific unique post identifier
<a rel="syndication" class="url u-syndication" href="">Twitter post 314548524266172416</a>

This syndication reference is also read by falconpost.php to see which entries have been syndicated to which service(s) (only Twitter is supported currently) when determining which entry to syndicate to which service next.

In addition, falconpost.php stores in-reply-to information for reply notes by appending a child element to the end of the "hentry" with:

  • class="u-in-reply-to"
  • rel="in-reply-to"
  • href={absolute URL to original post being replied to}
  • innertext - "In reply to: " and perhaps name of service and service-specific unique post identifier
<a rel="in-reply-to" class="u-in-reply-to" href="">In reply to: 330099833383833601</a>


Home page

Home page is routed by .htaccess directive to index.php for handling:

DirectoryIndex index.php index.html

index.php then simply includes falcon.php for handling.


Shortlinks are routed by .htaccess directives to whistle.php for handling:

RewriteRule ^b/[0-9A-Z_a-z]{3,5}.?$ whistle.php
RewriteRule ^e/[0-9A-Z_a-z]{3,5}.?$ whistle.php
RewriteRule ^t[0-9A-Z_a-z]{3,5}.?$ whistle.php

Note that each post type's shortlink character code is handled by a separate rule. This is deliberate design flexibility so that each post type can potentially use a different algorithmic short URL.

Permalinks and archives

Any path that starts with a four digit number then a slash then 1-3 digits is presumed to be a year YYYY and the start of a permalink (/YYYY/DDD/tN/) or an archive page (/YYYY/DDD/t, /YYYY/DDD, /YYYY/MM, /YYYY/B) where:

  • "DDD" is ordinal day of the year
  • "t" is one character post type (per Whistle design)
  • "N" is decimal number nth post of that type that day
  • "MM" is for "new month" (per newcal new months)
  • "B" is for bim number

Permalinks and archive pages are routed by .htaccess directives to falcon.php for handling:

RewriteRule ^\d{4}/\d{1,3} falcon.php

Legacy feed

Legacy feed requests are routed by .htaccess directives to falcon.php for handling, e.g.:

RewriteRule ^updates\.atom falcon.php

falcon_normal.png The Falcon logo is a Glider from Conway's Game of Life in a phase that resembles a falcon flying with its wings up and outstretched, and feet down and slightly back swooping downward to pick something up, e.g. a post from the author to go deliver to their indieweb site and syndicate out to other destinations as well.


See also