#Sitecore #SCHackathon 2020 Team Sitecore Daredevil (My solo adventure.)

This was my fourth year competing in the Sitecore Hackathon. This year was a little different for me though. As I had to go in it alone. I am not going to lie; I was a little nervous doing this solo. I thought hey I will try and do what I can, but if after a few hours if I just don’t get it, I will be done. After all I had a lot going on as early in the morning, I would have to stop to do Dad duty. However, this experience made me better and I even discovered some things about myself. So, here is the play by play and what I learned along the way.

Pre-Planning

The last three years I learned a lot of how to prepare as much as I could. You can check out those experiences here. I learned my lesson in the past to install Sitecore beforehand. This year it was the latest version 9.3. Also learned to make sure I had access to my GitHub repo and to download the solution. All good there.


Hours 1-2

For some reason I did not get the topics emailed to me, but that didn’t stop me. I went on Slack to the Hackathon channel and one of the judges sent me them. I looked them over and my first thought was I need a team to do this.

Task were something like this (had to choose just one):

  • Create a meetup website.
  • Create a new site for Sitecore modules.
  • Create a new Hackathon website.

You see these tasks kind of needed a front-end developer to make it look pretty. Not that I can’t do front-end work, but not one of my strengths. However, I was in the same boat as others as I found out in Slack. So, functionality first then I will make it look as pretty as possible. I did need to envision the screen either way and I sketched out something for the meetup website task. Then after an hour of research I said no. I saw someone post in Slack about the KISS (keep it simple stupid) method. One of the best coding philosophies ever. So from the past I have learned go for the path with the least resistance and make it work. I chose to do the Hackathon website. I had ideas on how to make it better and utilize Sitecore out of the box. Just pure raw Sitecore is all I needed.

Hours 3-10

Did I ever mention I have run over ten marathons? If I could do that maybe I could do this I thought. Well in the words of Forrest Gump I was running. Except replace running with coding. Well to be honest I created the templates, layouts and content for the first few hours. Does that count as coding? I had a vision on how I could make the site easy to maintain. I want to mention that I used the icon Sitecore searcher. Thank you Gabrial Streza.

After creating the initial Sitecore stuff it was time to fire up Visual Studio and start integrating. I coded away. With each hour that went by I got a little further. In fact, I didn’t want to stop. I finally got to a point where I had to as I had to make a two-hour drive round trip and be on Dad duty at a sporting event.

Not going to lie. At this point I was really wishing I had a team. When you know you will have to go on little sleep the next day it is good to have someone there with you that you can tag in. Fortunately, just going on Slack helped me feel a little more supported.

Hours 11-13

I slept. Also dreamed about the Hackathon.

Hours 14-19

Drove and went to one of my kids sporting events. Thought about the Hackathon while there and if I will get the documentation done on time. Drove home and then I was back at it.

Hours 20-23

Finish up the code and make the screen look pretty as possible. Okay looks like the 90’s front-end and Netscape only compatible, but the functionality and my vision are there. Let’s package it up. Update the Readme file with installation instructions and screen shots. Okay got that. Now I must do a video. The part I was dreading the most. It was like when Scrooge was going to meet the ghost of Christmas future. So, after trying a few things decided what the heck time to buy Snagit. In one take I had my video. Checked in code and double checked it and checked it in a few more times to make sure it was perfect. Viewed the readme file which contained installation instructions, screen shots, package link and video link. Alright time to call it a day.

Lessons Learned This Year (short list this year)

  • Functionality first. I always knew this, but most of the time with Sitecore projects I prefer the screens done first.
  • Buy Snagit. It is worth every penny.
  • Do a clean install of the package. Not that it would fail, but I am thinking next year have another vanilla Sitecore site at the standby.

Summary

I have to say no matter what happens. I learned a lot about myself and gained some confidence I felt I have been missing. In 24 hours I got to be an architect, lead developer, senior developer and entry level developer. Others may not always believe in you and support you, but for sure you must be your own biggest cheerleader.

My Third #Sitecore Technology MVP Journey. #SitecoreMVP

I debate this every year. Should I write a blog about becoming a Sitecore MVP? I like to blog so why not. It is no secret that I love the Sitecore community and I am honored to be a part of it. Being an MVP last year I was able to help with feedback on a few things before they were released to rest of the community. I felt like the cool kid in class. So here is my goal check and what I would like to do this year.

Last year’s goals:

  • Write some more good quality blogs. (I believe I did this. I really hope my DEF blogs have helped at least one person.)
  • Attend all the local Sitecore meetups including one in Milwaukee. (Chicago didn’t have much for meetups, but drove the 2+ hours to go the Milwaukee meetup. I also got to present at one. Yay!)
  • Reach out help others in Slack and Sitecore Stack Exchange. (I love helping others so I won’t stop trying.)
  • Create Sitecore Runner Buttons and bring them to the Symposium. (Sadly I didn’t get to go this year, but if you want a button I can send you one. :()
  • Using my new MVP status network with the Sitecore family better. (I hope I did a good job with this, but I can always do better.)
  • Participate in the Sitecore Hackathon again. (Did that with a successful submission finally.)
  • Make a VLog. (I still have to make this happen.)
  • Finish that update on my DEF Reddit Module in the Sitecore Marketplace. (All updated and code shared.)

This Year’s Goals:

  • Helping others. I love doing this and feel I can do a better job.
  • Continue updating my blog and sharing my knowledge with the Sitecore community.
  • Come up with a good idea that hasn’t been done before with Sitecore (I got this, can’t share yet until I know it works.)
  • Speak again at a meetup. I was shy once. Hard to believe. I love speaking now in front of others.
  • Make that darn VLog. For my new idea I will need to.
  • Attend the Sitecore Symposium in Chicago. I can take the train. Even if it costs me vacation time and I have to pay for it I will be there.
  • Keep updating my DEF Reddit Module.

cookiecakemvp2020

Ways Retailers and Brands Built With #Sitecore Can Compete Against Amazon

There are many ways to compete against Amazon. The digital market is still wide open for competition. Using Sitecore you have tools that can get your brand out in front of a wider audience with many more engagements and customer purchases. You can target customers based on their needs that would be a good fit to buy your brand. As a race director I have learned a few tricks on how to compete with other races. Participants want the experience of a good course, lots of support and some nice bling. Marketing in the digital world is not that much different. So, here are top five things that you can do to compete against Amazon and can be implemented with the custom site with a Sitecore CMS. Recently I got the chance to take a class on Sitecore’s commerce server. A lot of the features mentioned below are ready for use with little customization.

Drive Brand Awareness

There are many visuals and tools you can use to drive brand awareness. Here are some that are often used.

  • Infographics – Infographics embedded in various places will catch the attention of potential customers getting to engage more with your brand.
  • Social Media Tagging – Tagging related brands will not only make the brand company you tagged grateful it will also engage that company’s followers. In turn the brand company you tagged may tag you on another post.
  • Social Media Contests – Having a giveaway is a great way to build up your contact list and get potential customers interested in your brand.
  • Social media ad boosting – Many may see your ad but paying a little extra for your ad gets it in front of a wider range audience. We have all seen the sponsored ads in Facebook that we tend to click on.
  • Partner with others that compliment your products – This goes along with social media tagging, but there are other things you can do to partner. You can present a case of working together with another brand that makes your brand a must buy when using the other brand. For example, a company that sells rags for cleaning may partner with a company that makes chemicals used in cleaning.
  • Email Marketing – This is one of the best ways to keep your customer list up to date on new products and specials you may be running. It also keeps you on the customer’s mind when it is time for them to go shopping for your product brand.
  • Blogging – Talking about your brand and giving real life cases for it can be accomplished easily with blogging. Blogs also can be shared on many social sites as well. Building up followers for your blog will get many to engage as you publish new ones or a series of blogs about a certain topic.
  • Search Engine Optimization – A good site will be search engine friendly. Make sure each page in your site in the meta data describes the page well so search engines know to pick it up and show it in the expected results. Also having other complimentary brands link to your site helps search visibility as well.

Offer Fast Shipping

One of Amazon’s main selling point is their fast shipping for prime members. Many sites have now offered free shipping over a certain amount. A big difference between shipping from Amazon and a specific site is the personal touch a site gives to the order. If there is an issue the customer knows they can go directly to that company. Digital advertising of shipping is a keyway to get potential customers to order directly from you.

Dynamic Pricing – Shoppers are very price savvy these days. Checking competitor prices on brands you sell will keep you competitive with your competition’s prices. Amazon has done this to stay competitive and using dynamic pricing along with shipping deals can make sure a potential customer will buy from you.

Auto Delivery – Selling anything that will keep customers continuing to buy from you is a great way to keep current customers and make them happy, so they don’t run out of a product they continually buy. For instance, some vitamin shops will offer a 10% discount and free shipping when you use their auto-ship program. Ensuring you never run out.

Membership Pricing and Deals – It is always good to be part of the club. Having customers that are part of a free membership program will help you target their needs easier. When you have specials, they can be the first one that is notified based on their preferences.

Milwaukee #Sitecore October Meetup Recap. @layeronemedia #mkesug @ParagonInc

This was my second Milwaukee meetup and this one like the last one did not disappoint. I drove 2+ hours to get there both ways, but it was worth it. So here is the summary in pictures.

Food First

Presentation 1

The first presentation was “Keeping Content Editors In Mind When Implementing”​ presented by Andrew Schwabe. He talked about one of the most forgotten things when creating a website. The content editor. He emphasized to think of the customer as the content editor on how you could make their experience better. Lots of great tips such as getting the experience editor changes in front of them before the front-end done. So, they can get a feel of how they will change things. Also figuring out what the customer really needs and wants to change instead of giving them extra steps to do one thing.

Presentation 2

—————————————

The second presentation was “Introduction to Sitecore JavaScript Services (JSS)​” by Phil Busch. This was one of the first times I have seen JSS in action and it did not disappoint. We started from PowerShell, then Visual Studio and then finally in Sitecore. One of the biggest things I learned is that you have to change your mind set and be more front-end focused then back-end focus which is normally the case when most Sitecore developers are coding.

Next meetup is Chicago meets Milwaukee. Always a good time at that one.

Top 5 Presentations at the #Sitecore Symposium I Would Want to Attend #SitecoreSym

Unfortunately, this year I won’t be attending the Sitecore Symposium. However, if I was these are the top 5 presentations I would want to see.

1. Managing technical debt while implementing Helix principles – Day 1

This one appeals to me as I see about half the clients, I work with trying to move their existing site into a Helix solution. Sometimes It is a straightforward process, but most of the time it is not. This class would be great to learn some techniques that I can apply to my clients. I would also ask the question of at what point is it better to just start from scratch (new solution and Sitecore instance) versus trying to get a square into a circle? You can find more about this session here.

2. Face recognition, AI, and personalization: Data-driven marketing in a brick-and-click store – Day 1

I will be honest. I use face recognition several times a day with my iPhone. Whether it is to unlock the phone, put in a saved password, make a purchase etc. There is no doubt this something that will be integrated more and more and leveraging Sitecore as part of that is key to changing with the times. I would love to see how a web cam can be used with face recognition. I would have a lot of questions on it and I am sure from this class I could discover things I haven’t heard of before. You can find out more here.

3. New editing experience in Sitecore: What it means for developers – Day 2

I would say at least 60% of clients I work with use the experience editor. I am so old I remember it was once called page editor. I have done many overrides and changes to the EE and really have gotten a good feel for it. With the new changes in Horizon I know it would be critical to learn them. So, I can better serve my clients. You can find out more here.

4. Netflix next with Sitecore Cortex – Day 2

This class combines two of my favorite things. Netflix and Sitecore. I haven’t done much with Sitecore Cortex, but this class would give me some good ideas and how to use it. I am hoping this class will be available online so I can follow the steps. You can find out more here.

5. Data integration: Get your head in the cloud – Day 3

For people that follow my blog and me on Twitter know I like data integration with the Data Entity Framework. This class leverages the Sitecore Item Service API and Azure WebJobs and Functions. From the description “This is a scalable, secure, and robust approach to data integration.”. You can find out more here.

Have fun if you are attending (especially my fellow MVPs). If it is your first time there make sure you take it all in and network with the Sitecore family. There is so much to learn. It is such an awarding experience.

#Sitecore Data Exchange Framework Revisited (Reddit to Sitecore Feed)

I did a blog series on DEF and I did a few more follow up blogs. You can find the previous blog on DEF here. After I updated my Reddit Feed example to the latest DEF and doing a presentation on it I decided to do an updated blog.

You can find the my Sitecore Market Place module here. You can find the code in GitHub here.

So, let’s get started.

Overview (what is covered in this blog):

  • What is Data Exchange Framework?
  • How Can it be Used?
  • Sitecore Setup
  • Backend Setup
  • How to Run
  • Scheduling Data Exchange Framework Batch Jobs
  • Final Thoughts

From Sitecore:

Sitecore Data Exchange Framework is designed to facilitate the transfer of data between systems. It allows you to define the logic needed to read data from a source system, transform that data into a format that is compatible with a target system, and write the transformed data into a target system. Developers can build connectors that allow 3rd party systems to serve as source and target systems.

How can it be used?

  • Importing Data from One Source into Sitecore (example rss feed, reddit feed etc…).
  • Exporting Data from Sitecore into Another System (external SQL tables)
  • Reading and Processing xDB contacts.
  • Anything data related. The possibilities are endless.

Sitecore Setup

Below is the overview on how the Data Exchange tenant was setup.

Expanding the Pipeline Batch, you will see the following:

So, let’s start dissecting this stuff.

Sitecore Setup – Value Accessor Sets

  • Used to map field values from the source (Reddit).
  • Used to map source values from Sitecore.

Each Accessor set has a field. I made these fields the same names I was getting from the feed. It made things a little easier to remember.

For the Sitecore field you will use the fields of a template you create. In this case it will be a Reddit item template.

The field value is going to point to the item template of the Reddit feed item. I kept the field naming consistent with the feed.

To bring those together we will use a value mapping set. This will make the connection from the Reddit feed field to the Sitecore field. In this example Title of the Value Accessor Set for the Reddit feed chosen.

In this example created a template that contains settings needed for the field. Template inherits from the endpoint base template. For the Sitecore endpoint I created and used the default values.

The converter type points to a created method in the code behind. The method is used to retrieve the blog path.

Converter Type is defaulted.

Backend Setup – Overview

This is a snapshot of each folder that was created and the corresponding class file.

RedditFeedFieldValueAccessorConverter.cs

The Supported Ids above, the template id ({68BD9AAD-635F-40F3-9ACD-711662C59EEC}) being set refers to the following template. This template inherits from the Value Accessor template installed by the DEF package.

So how this corresponds to Sitecore is simple. A Value Accessor Set item is created and the items underneath it uses this template. In the RedditFeedFieldValueAccessorConverter class it is setup to get the value of that field using the combination of the template and the field name defined in the RedditFeedFieldValueValueAccesorItemModel. You will see how this is tied into other parts of the DEF process as we go along.

In the code you will notice a ValueReader and a ValueWriter are set. The ValueReader is used to read in the feed and match the fields for each Reddit blog item. The field definition is contained in the stringValue. The ValueWriter defines a new PropertyValueWriter class. That class is part of the DEF and used to convert the field values. (This code was changed in 2.1 versus previous versions so you might see this done differently if using an earlier version).

RedditFeedValueReader.cs

This class will process the Reddit Post item and match field name with value. Title, AuthorName, SelfText etc… are field names in the Reddit feed. I believe you can name these differently, but I prefer to keep the same name as it is in the Reddit post item.

RedditEndPoint.cs

The Reddit End Point will have the information for the Blog Path in Reddit. The TemplateId defined points to the RedditEndPoint template. Settings are returned and added to the plugin. The plugin is required to be implemented by the pipeline converter and processor.

This is the model plug in code:

This is values of the Reddit Endpoint. You can see that the Converter Type points to the RedditEndPoint class.

More about this later, but as you can see in the Reddit Pipeline Step the Reddit Endpoint is selected. Now you can see how this all ties together.

Looking in Sitecore you can see where the Converter Type points to the Endpoint Converter and the Processor Type which will get called and receive the end point information and do the Reddit Feed processing.

RedditEndPointConverter.cs

The converter is one of the most crucial parts of the DEF. This is what ties together the pipeline step of the DEF. The SupportedIds value is the template id of the Reddit Pipeline step. As you can see the endpoint settings are passed into the pipeline step.

RedditItemsProcessor.cs

In Sitecore under Pipelines\Reddit Pipeline\Reddit Pipeline Step you will see under Processor Type the RedditItemsProcessor defined.

The next images shows the code for the processor. You will see that the Required EndpointPlugin is defined for RedditSettings.

Endpoint, PipelineStep and PipelineContext should all have values at this point. As you will notice the ILogger parameter is used to set up any custom logging.

If you look at the method RedditFeed, what that does is create a new Reddit class using RedditSharp. It then uses the blogpath setting from the endpoint to retrieve the blog feed.

A collection of reddit feed blogs is then created. It will use fieldnames we defined earlier to match the Reddit feed fields to the fields defined for the new Reddit Sitecore item.

How to Run

Below you will find a Pipeline Batch that was created to run all the necessary steps to process and import the data into Sitecore.

Below are the steps that get run under Pipelines. You can also see above that the Reddit Pipeline is selected.

One of the things I found difficult with DEF now that I have used it quite a bit is getting the correct settings right on each step. I got some help from an expert on Slack. So hopefully this will help someone else.

The first setting Iterable Data Location is important because that is your data that was read in. The Data Location is usually set to Pipeline Context Source.

The Identifier Value Accessor is set to your unique key for your data. Identifier Object Location is usually set to Pipeline Context Source.

Resolved Object Location will usually be set to Pipeline Context Target.

See setting below for mapping. Source and Target are common.

Finally you have the Item Location that will be used to map to the Sitecore Endpoint.

When you first click on the Pipeline Batch you will notice a group of buttons on the ribbon. If something is not correctly setup these buttons will be disabled. To run the Pipeline Batch just click on the Run Pipeline Batch button. While it is running the button will grey out and you will see the Stop Pipeline Batch button enabled. After it is finished running the Run Pipeline Batch will be enabled again.

Results

If you need information on scheduling the DEF process check out my previous blog here.

Final Thoughts

  • The Data Exchange Framework should always be considered when importing/exporting data in Sitecore.
  • It does not completely replace tools such as RAZL as the process would be more manually intensive.
  • The possibilities are endless.

I hope this guide helps those who need to get started with the Data Exchange Framework.

Add Needed JavaScript Code to Any Page in #Sitecore

Many Sitecore sites need different tracking scripts on their website, but for different environments. For instance you might have multiple Azure sites hosting the same site, but in different environments that could be tracked (Dev, QA, Stage, Prod for instance). The proper script should generate for each site instance. This is one way to solve the issue, but I am sure there are other solutions.

In Sitecore I created a Script Settings Folder template. Each folder item contains a Script Setting item. You can have multiple.

I have a configuration filed that contains the settings of the host names for each environment.

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
     <sitecore>
     <settings>
     <setting name="DEV_SERVER_NAME" value="QA.Server.com" />
     <setting name="QA_SERVER_NAME" value="DEV.Server.com" />
     <setting name="PROD_SERVER_NAME" value="Prod1.Server.com,Prod2.Server.com " />
     </settings>
    </configuration>

In the code below in a view (default in this case) the following code is added. The code will compare the current host to what is in the settings and render the appropriate scripts.

string headscripts = "";
string bodyscripts = "";

//Get Parent Item of Script Folder
var scriptdir = Sitecore.Context.Item.Database.GetItem(8DD8956D-7477-41A8-A879-8D3003995F7E);

//Get Hostname from Sitecore to Match the Current Enviroment
string[] hostname = Sitecore.Context.Site.HostName.Split(new char[] { '|' });

//The reason for a string array is because you may have multiple servers like prod that use the same scripts
string[] devservername = Sitecore.Configuration.Settings.GetSetting("DEV_SERVER_NAME").Split(new char[] { ',' });
string[] qaservername = Sitecore.Configuration.Settings.GetSetting("QA_SERVER_NAME").Split(new char[] { ',' });
string[] prodservername = Sitecore.Configuration.Settings.GetSetting("PROD_SERVER_NAME").Split(new char[] { ',' });
string scriptsettingitem = string.Empty;
if(devservername.Intersect(hostname).Any())
{
    scriptsettingitem = "DEV";
} 
else
if (qaservername.Intersect(hostname).Any())
{
    scriptsettingitem = "QA";
}
else
if (uatcdservername.Intersect(hostname).Any())
{
    scriptsettingitem = "PROD";
}
//Synthesis was used in the syntax below, but use whatever works for you. 
if (!string.IsNullOrEmpty(scriptsettingitem))
{
foreach (var childfFolderItem in scriptdir.InnerItem.Children.AsStronglyTypedCollectionOf<IScriptSettingsFolderItem>())
{
   if (childfFolderItem.Name == scriptsettingitem)
   {
    foreach (var scriptitem in childfFolderItem.InnerItem.Children.InnerChildren.AsStronglyTypedCollectionOf<Foundation.Interfaces.Models.I_ScriptSettingBaseItem>())
    {
       headscripts = headscripts + scriptitem.HeadTag;
       bodyscripts = bodyscripts + scriptitem.BodyTag;
     }
break;
   }
}
}

So simple for the most part. What are some other ways to get this done? I would like to learn some other techniques for this.

Milwaukee #Sitecore Meetup Recap. @ParagonDev @layeronemedia #mkesug

This meetup was a big honor for me. I got to present for the first time ever at a public Sitecore meetup. I was nervous going into it for several weeks, but I did my best to prepare. Special thanks go to Joe Ouimet and Derek Dysart for giving me the opportunity to present and putting the meetup together. Also for Paragon Consulting for the awesome food and drinks and Layer One Media for hosting.

I did my presentation on the Sitecore Data Exchange Framework. My goal was to show the demo of my Reddit feed process and get others thinking about how they could use the DEF. I believe I accomplished that and hopefully I wasn’t too confusing. My code and marketplace module are out there so they can be used as a starting point. Also I will probably do an updated DEF blog series for the latest version.

So here we are in tweets and pictures for presentation 1:

Hey my favorite Paragon local sales person from Paragon joined me.

Presentation 2 had me excited. Anything that involves Alexa and Sitecore I am interested in. The topic was “Expanding the reach of your Sitecore Content with Voice-Activated Assistants”. It was presented by Benjamin Adamski and Jeroen de Groot. They did a fantastic job explaining all the benefits and where things are headed.

IMG_8176.jpgIMG_8174.jpgIMG_8178.jpg

Well Milwaukee it has been great. I hope to make the next one.

IMG_8182.jpg

#Sitecore Experience Editor Fixing Datasource Error 404.15 (Too Many Children)

Recently I came across an error that I have not seen before. It seemed this error was only happening on one item. This might be something you never come across or eventually will. Either way there is a good way to prevent it.

The error I saw was below. This happened when you tried to add a datasource to a specific rendering. Not the most descriptive, but it looks like Sitecore returns a big query string of an item’s children.

After examining the rendering I noticed the query that was used in the datasouce location would actually query all children.

The easy fix was to create a components folder and keep the datasource items in there. Then the query could be changed to the following which would only look for that folder. No more errors. Of course, you can expand on the query such as adding the specific templates of the datasource.

query:./child::*[@@templateid='{02A83AA1-F53E-46E5-9BD8-A1601A1E245A}’]

#Sitecore #SCHackathon 2019 Battle of the Team X-Men Developers @ParagonDev

A third year in a row participating in the Sitecore Hackathon with my coworkers at Paragon. I have learned from the previous years I have done this not to make the same mistakes, mostly. See Top 5 Reasons of Failure and Top 5 Reasons the Experience Was Better. However, nothing is ever smooth in the world of web development. So here is a quick summary and lessons learned for next time.

Pre-planning:

We made sure we could get into the GitHub repos. All was good there.

Hours 1-2:

Got the hackathon rules and we started coming up with ideas. I am just going to fix my install for 9.1 that I should have done beforehand that I cannot figure out why it is not working. Well I hopefully can get that finished soon. Okay we came up with some decent ideas and time to start documenting those ideas.

Hours 3-4:

Oh look 9.1 is still not quite installed. My teammates probably want to send me over to Magneto’s team at this point. However at least our idea is solid, but wait a minute…

Hours 5-6:

We need a new idea as all our ideas were already done in different variations. Hey, look at that finally got Sitecore 9.1 working.

Hours 7-12:

Alright we have an idea that solves a problem. Let the coding begin!

Hours 13-17:

Okay finished coding. Let’s surprise our teammate with the new idea we came up with while he was taking a break. He thinks it is a good idea and documentation has begun.

Hours 18-21.5

Video created, documentation created, GitHub repo checked. Let’s finish this up and get it checked in.

Finish:

Time to sleep.

Summary and Lessons Learned

Well I haven’t learned all my lessons. I should have not assumed 9.1 would install as easy as 9.0. In my defense I did have food poisoning the day before and still feeling it. Despite that setback and getting an idea off the ground we made it in time this year. Win or lose I love doing this contest every year. It is a good time to bond with co-workers who I may not normally work and learn new things. One big thing we learned this year was keep the idea simple. That 24 hours comes quick. Solve a problem with your idea, but make sure you can do it in a good time. Documentation takes longer than you think.

Going into the Sitecore Hackathon:

Finishing: