Do a complete revamp of Skive Festivals existing flash website using modern web technology to allow for device-independence. The website should be more engaging and the users should stay longer as a result.
Skive Festival is built with best-practises HTML5 markup and CSS3. Compass was used as the CSS pre-processor to increase productivity and take care of old browers."; $content .= "
Media Queries makes the design responsive and " . get_link('#/css-transforms', 'CSS3 transforms') . " handles animations nice and smoothly, even on mobile devices with slower processors. One of the reasons we won " . get_link('#/awards-and-honors', '9+ awards and honors') . ""; $content .= "
The most important part of a music festival website is the artists and the schedule. In that order. Users rarely visit the website more than a couple of times before the festival — Unless you have some kind of on-site community engaging them with forums, polls and such."; $content .= "
Skive Festival handles its community on Facebook and would like to keep it that way for good reasons. Because of this we had to come up with fresh ideas that would trigger people to revisit the website. " . get_link('#/timeline', 'Our dynamic timeline') . ", comment threads that sync with Facebook and the " . get_link('#/like-system', 'favorites system') . " was among our solutions."; $content .= "
Another key part was making the user experience equally immersive on " . get_link('#iphone-and-ipad-support', 'mobile devices') . " and desktop computers. This is very important on a website like skivefestival.dk with loads of traffic coming from mobile devices. Especially under the festival."; render_info_box('Creating user engagement', 'user-engagement', $types, $content); ?> $content = '
I built a custom favorites-system for Skive Festival that allows users to mark artists as favorites. The favorites system serves two purposes:'; $content .= '
1. You\'re able to filter the artist when viewing the artists and schedule page so you can easily decide which days to go based on your favorite artists. It also makes it easy to see if any of them are scheduled to play at the same time.'; $content .= '
2. When you \'like\' an artist the server gets notified and the artist gets a vote. This means you\'re able to see not only your own favorite artists, but the most popular over all. On the artists page you\'re also able to sort artists by \'Most popular\'.'; $content .= '
Because I used HTML5 web storage, users don\'t have to deal with registering profiles, logging in and lost passwords. It just works.'; $content .= '
As a neat usability feature I show a little notification when you like the first artist. This notification tells the user about the favorites filter and how to use it.'; render_info_box('Custom like-system', 'like-system', $types, $content); ?> $content = "
The timeline is an auto-generated dynamic front page that has new content for returning users on every visit."; $content .= "
As a user, you can filter the content by type."; $content .= "
Technically the timeline grabs all artis and news items that were published in the last 90 days. Then it fetches the " . get_link('#/facebook-rss-feed', 'status updates from facebook') . " and puts it all in a big pool that is then sorted chronologically, divided into three sections, one for each month, and styled based on the content type."; render_info_box('Custom-built timeline', 'timeline', $types, $content); ?> $content = "
With about a 300% increase in traffic it's a good idea we moved to faster cloud-based servers. It's also a good thing that everything was highly optimized, gzipped and cached properly using best practises and the awesome features of W3 total cache."; $content .= "
This page optimization led to a " . get_link('#/page-speed', '95/100 score on Google Page Speed') . ""; render_info_box('Huge traffic increase', 'huge-traffic-increase', $types, $content); ?> $content = "
" . get_link('#/timeline', 'The timeline') . " includes updates from Facebook. I use my " . get_link('http://ahrengot.com/tutorials/facebook-rss-feed/', 'Facebook RSS feed', true) . " tutorial to grab the page feed and convert the status updates to PHP Objects using Simple Pie."; $content .= "
Once I have those it's a matter of filtering the posts (We don't want photos, images or polls), figure out their timestamp and mix them with the artists and news in chronological order."; render_info_box('Grabbing the Facebook feed','facebook-rss-feed', $types, $content); ?> $content = "
Using Media Queries, everything is scaled and reordered to best fit the users device, no matter if it's a phone, a tablet or a desktop computer."; $content .= "
Hover effects are disabled on touch screens throughout the site and some buttons are enlarged so they're easier to interact with using a finger."; render_info_box('iPhone and iPad support', 'iphone-and-ipad-support', $types, $content); ?> $content = "
This means you can use the back/forward buttons to navigate between open boxes (Just like you can in these content boxes. Go on, try it!)"; $content .= "
In the first couple of weeks the cloud servers experienced several crashes caused by 'Out of memory' errors."; # $content .= "
After a while the server guys finally looked into the issue and detected a massive DDoS attack from China. For some reason a bunch of hackers we're trying to get root access to the server."; # $content .= "
… Eventually, using a bit of black magic, the hackers were dealt with and the server went back to normal."; # render_info_box('Dealing with hackers', 'dealing-with-hackers', $types, $content); ?> $content = "
Page Speed is Google way to meassure website performace. A score of 95/100 is very good as the average is about 80/100."; $content .= "
Here are a few things I did to to get that score:"; $content .= "
$content .= "
- Cache dynamic content to static HTML files. "; $content .= "
- Load related content with AJAX. "; $content .= "
- Use CDN's where available. "; $content .= "
- Gzip everything server side. "; $content .= "
… and about a bazillion other small tweaks."; $content .= "
A lot of this is thanks to the .htaccess file in HTML5 boilerplate, the awesome W3 total cache plugin and tips on GitHub."; render_info_box('95/100 in Google Page Speed', 'page-speed', $types, $content); ?> $content = "
CSS3 transforms allows you to scale, skew, rotate and translate objects in 2D and 3D space.
The old Skive Festival website was built in Flash. Needless to say this is a pretty poor solution when it comes to search engine indexation. The spiders simply can't crawl flash content very well."; $content .= "
Apart from just converting to best practises HTML5 markup the new website had a bunch of SEO-minded additions. Here are a few of them:"; $content .= "
1. Scoring " . get_link('#/page-speed', '95/100 in Google Page Speed') . ". This has a big impact not only on search rankings but user retainment and general user experience."; $content .= "
2. Auto-generated XML sitemaps that notify Google, Yahoo and Bing when new pages are published. Those sitemaps include data about images, page priority, when the page was last modified and change frequence."; $content .= "
3. Keyword rich titles, URLs and headers."; $content .= "
4. Auto-generated meta, title and " . get_link('#/facebook-open-graph', 'open graph') . " tags for richer snippets on google and Facebook"; $content .= "
5. Carefully handle auto-generated archives to reduce duplicated content."; render_info_box('Search engine optimization', 'better-seo', $types, $content); ?> $content = "
Underneath the slick front end of skivefestival.dk runs the worlds most-used content management system, WordPress."; $content .= "
To learn more about WordPress check out my blog post " . get_link('http://ahrengot.com/likes/the-state-of-wordpress-in-2011/', 'The state of WordPress', true) . "."; render_info_box('WordPress', 'wordpress', $types, $content); ?> $content = "
FWA, FWA Mobile, Awwwards, Dope, etc. etc. etc. On top of that there are a bunch of articles out there highlighting the design and functionality of Skive Festivals new website."; render_info_box('9 Awards and honors', 'awards-and-honors', $types, $content); ?> $content = "
The Open Graph protocol is basically a bunch of meta tags you put in the head section of a web page to alter the preview snippet when that page is shared on Facebook."; $content .= "
You can do some pretty cool stuff with the open graph tags, like enabling " . get_link('http://ahrengot.com/tutorials/custom-video-player-on-facebook/', 'custom branded video players', true) . " to playback right there in the news feed."; $content .= "
Skive Festival uses Open Graph tags to fetch the thumbnail, description and title for any given page if it has any, or fall back to a defaults values. I use that same method on my own website. You'll see that if you try sharing this very page on Facebook."; render_info_box('Facebook open graph', 'facebook-open-graph', $types, $content); ?>
Media queries are used to scale from mobile all the way up to full HD resolution. This approach works great because the same website morphs to fit any screen, instead of having multiple sites targeted at various devices, leaving only one platform to maintain.
Using filters as a global sub-navigtion system we’re able to show a lot of content in an easy-to-understand way that allows for much less subsequent page loading. The filters are context-aware and change depending on the page you’re looking at.
A custom-built liking system allows users to filter the artists making it much easier to plan which days to go based on your favorite artists. The likes are stored on the server so individual users are also able to see the most popular artists overall. The first time you like an artist a notification on the screen tells you how to filter between all artists and favorites.
Fitting any device with responsive design
Using CSS3 Media Queries the contetent boxes wraps to fit nicely on any screen size from mobiles all the way up to full HD.
On mobiles a lot of small details reconfigure to better fit finger-driven navigation. For instance the filter buttons are enlarged and the menu/branding area re-arranges.
Google Analytics tells us that the new website gains about 300% more traffic than the old one and the user feedback has been awesome so far. search rankings are through the roof and people stay longer than before.
On top of that we won a bunch of awards including both The FWA and FWA Mobile.
On the technical side HTML5 Local Storage powers the like-system without requiring the user to log in while AJAX calls to the backend handles the collective amount of likes for each artist. This allows users to sort artists by popularity.
… And to make things even better everything is built on WordPress with a highly customized backend, a ton of tailored widgets and a drag ‘n drop sidebar that changes depending on the current page.
Awards and recognition
- The FWA
- The FWA Mobile
- CSS Design Awards
- Dope Awards
- Design Charts
- HOW Interactive SOTD
… and a dozen or so other awards, blog postings
and even inclusion in a printed book.