Everything I Learned Creating CDK Day - My First Global, Virtual Conference
Tags: awscdk, cdkday, conference
Published: 2020-10-12 12:52:22

On 30th September 2020 we had our first ever CDK Day! 

![CDK Day Logo and Speaker images](https://dev-to-uploads.s3.amazonaws.com/i/uf2xiav26xru5fc808pf.jpg)

<br />
**Some Numbers:**

- Over 6000 views of the on demand video across Twitch and YouTube in first 7 days
- Over 3000 people signed up to attend
- Over 1000 people watched the live stream
- 800 members in the cdk.dev community slack org
- 14 Main Talks, a keynote and a panel discussion involving over 17 speakers
- 4 Hosts
- One adorable pancake loving otter

<br />
**The Viewers:**

![Global Map of Viewers](https://dev-to-uploads.s3.amazonaws.com/i/z06xoasxvfwupl8ugil6.png)
<br />

We did have some image and audio quality issues on the day but on the whole I would deem this event a massive success considering it was our first time ever doing anything like this and we had a budget of £0. 

Now that the event has taken place and the recordings are all available to watch (https://cdkday.com/2020) it seemed appropriate to look back on everything on camera and off camera to make this event happen so some of my learnings can hopefully help the next person.

##The Background
I wrote a [previous post](https://dev.to/aws-builders/launching-a-virtual-global-conference-in-two-weeks-through-aws-community-builders-32f1) detailing the origin story but let's repeat some key points.

We have all been in a global lockdown since March, so on 29th July I felt the need to reach out and bring together a community of people interested in the CDK products. Not just AWS CDK but CDK for Terraform and CDK for Kubernetes.

I sent a quick message (without any planning) to a few of my international friends, I was very excited and basically said "what if we took one day to celebrate everything CDK?". We had a couple of conversations, everyone got very excited and two weeks later we announced CDK Day to the world!

{% twitter 1293581076980477955 %}

##What You Don't See
It is very tempting to look at that situation and think "ok you sent a tweet, so what?" but to get to this point we were launching a product into the marketplace (albeit a free one with the cost being viewers time).

NB: Everywhere in this article I refer to "we" I refer to the full organising committee (Matt Coulter, Sebastian Korfmann, Matt Bonig, Julia Jacobs, Thorsten Hoeger, Pahud Hsieh, Marek Kuczyński, Philipp Garbe, Anubhav Mishra, Richard Boyd, Elad Ben-Israel, Chris Fife, Sudeepa Prakash, Aaron Schwam, Eric Johnson). It was this group as a whole that made all the decisions.

Behind the scenes we needed to do a lot of foundational work:

**1) Name the event**
**2) Create the logo**
**3) Stand up the social media accounts**
**4) Buy a domain and stand up a website**

Believe it or not 1 and 2 were harder than I expected, you are establishing a brand with an opinion and this opinion mightn't reflect your personal one. My entire background is AWS CDK and to me whether you were using AWS CDK, CDKTF or CDK8s you are reusing AWS software in the [constructs programming model](https://github.com/aws/constructs). So I wanted to call the day AWS CDK day, this was a deal breaker from a Terraform CDK perspective because when people read "AWS" and "CDK" beside each other it means the AWS CDK which is not CDKTF or CDK8s.

We eventually settled on just CDK Day and introduced all of the product names into the logo so it was clear this was everything CDK.

This decision had wider implications for 4. We could have worked with AWS to run an official AWS Community Day which comes with an out of the box website, branding kit, marketing team etc BUT then the event needed AWS in the name. So this was an absolute deal breaker and we had to turn down this support. That meant I had to use Tailwind and 11ty to rapidly stand up the website from scratch before the tweet could go out... I wasn't even 100% sure what to put on there but something was better than nothing. I wrote a rough blurb to describe our mission statement, then listed who was involved

![Mission Statement](https://dev-to-uploads.s3.amazonaws.com/i/mdqyjl19w958v4t22tdp.png)

![some of the people involved](https://dev-to-uploads.s3.amazonaws.com/i/eleezm59qt3so6ehuwat.png)

We then decided that we needed two more things before we could announce:
<br />
**5) A place for people to submit talks**
**6) A way for people to signup**
<br />
I wanted to apply the serverless mindset to this, yes I could have custom built both of these things pretty quickly using CDK Patterns I already had at [cdkpatterns.com](https://cdkpatterns.com) but remember we had never ran an event like this before so how could we know better than the established tooling out of the gate?

That is why we settled on eventbrite and sessionize, we may not particularly like eventbrite but it was an established platform with the functionality we needed. So I pulled together these two accounts and got us validated as a non profit event so we weren't charged a penny for their use.

So we are good to tweet now right?... nope
<br />
**7) Who is our anchor host?**

We had four hosts on the day which is amazing but when running an event like this, especially for the first time you need a host that people know/trust and want to listen to for 5 hours. On this one we lucked out that Matthew Bonig was close enough with Eric Johnson to ask him and he said yes!

<br />
**8) Establish a working pattern and cadence**

Before making a public commitment to run an event like this we needed to establish a model for how we would organise it. Our team was fully international so no time zone was ideal and we definitely couldn't physically meet up (even if it had been pre-covid)

I didn't want to have a lot of synchronous meetings, they are great for consensus on a decision but given this was a best efforts volunteer only setup we kept to one 30 minute meeting a week. I also did my absolute best to keep that meeting on time. That was brilliant, I enjoyed those meetings but very early on we realised we would also need a collaborative workspace to share stuff.

In the beginning I created a Google Drive folder which I shared with the group and we were using sheets and docs in there to do this work. The engineers in the group asked if we could use GitHub to track this project instead so Matthew Bonig setup a project for us in his OCF organisation which we used throughout to track items through issues (this worked surprisingly well)

That's us caught up with everything it took to send that tweet... oh wait:
<br />
**9) How long should we have the CFP? When should it open/close?**

We wanted to host this event on a pretty aggressive timeline so that is why we picked 30th September (originally it was the week before, we were super ambitious). 

We had exactly 7 weeks from the announcement tweet to the event which meant that we needed to sort out the speakers as soon as possible so that we could use their talks as the marketing for the event itself and drum up interest. The problem was that since this was a brand new event, closing too soon could be a risk since the best speakers may not hear about us in time. We settled on a two week CFP and agreed as a group that community submissions would come first but if there were content gaps we as an organising committee would step in and deliver a talk to add balance.
<br />
**10) What platform would we use for the event?**

Where would people go on the day to engage with CDK Day? Lucky for us Eric was an established self streamer so he advised us that we could use his StreamYard account to live stream to Twitter, YouTube and Twitch. We did look at other fully managed platforms but given our limited budget we didn't explore them much further.
<br />
**11) How much of the day did we want pre-recorded?**

What is it they say? "never work with animals, children and live tech demos". We knew that the format of pre-recorded talks where the presenter engaged in the live chat was catching on but we also wanted some of the day to feel organic. At this point in time we were all for a 100% live event, later as we saw how global our speakers and attendees were we decided to make a recording the default option for shorter sessions and offer it as optional for any session.
<br />
**12) What time zone would we broadcast in?**

You might assume we just defaulted to USA but we actually used information from the CDK Patterns [twitter followers](https://twitter.com/cdkpatterns) to work out where the most interest in CDK was. We compromised on East Coast USA since it was in the middle of the red zone (and because our Host lives in Colorado so best compromise).

![CDK Patterns followers on a map](https://dev-to-uploads.s3.amazonaws.com/i/5fotxhx3qgvmrtk4d4bf.png)
<br />
**13) Decide where conversations would happen**

We wanted our audience to feel engaged and that meant we needed to make sure no matter what platform they were using to watch CDK Day that everyone went to the same place to ask questions. Sebastian Korfmann had purchased the cdk.dev domain early into our planning so we just leaned into it and said if we get people there during CDK Day then they can stay there afterwards as the active community. We went through a big Discord vs Slack debate but when people voted Slack was the winner - thus the cdk.dev Slack was born.
<br />
**14) Establish and Publish a Code of Conduct**

The thing that can make or break your event for people is how other people treat them. Now that we were going to encourage users across Twitter, Twitch, YouTube and Slack we needed to let everyone know the rules of attendance. We also needed to make clear the consequences for breaking those rules. We needed to establish this early so that speakers wouldn't be put off presenting and attendees wouldn't be put off watching.

There are some great open source CoCs as a starter for 10 but we needed to define how people were actually going to report violations and when they did how we responded as a team. We decided to setup an email address and have a team of people on the day who would focus on any breaches. We published it on the site at https://www.cdkday.com/coc/

##The Two Week CFP Window

How It Started:
{% twitter 1293621573598023683 %}

How It Ended:
{% twitter 1298858464475779072 %}

##What You Don't See

**1) Differing Talk Types**
After the CFP had opened we realised that we didn't want just 30 minute talks but we also wanted shorter lightning talks, I hadn't accounted for this in the sessionize form so we had to ask the people who had submitted talks to add a comment of lightning(10 mins) vs full(20-25). It is definitely something to ask up front for talk submissions.
<br />
**2) Speaker Diversity**
I wanted to try and get as diverse a group of speakers / talk proposals as possible. We had an impressive array of countries represented but overall diversity was not an area we excelled in.

I asked various groups if they would retweet the CFP and some were awesome enough to do so like below:

{% twitter 1295640778966994944 %}

I would have loved to have taken a few corporate sponsors to approach individual speakers and pay them to present at the conference. It is one thing if you volunteer your time to speak but it felt wrong to approach individuals and ask them to speak without compensating them. It is like saying I need you but I don't value you.
<br />
**3) Marketing**
We had two awesome AWS employees helping us get official [AWS tweets](https://twitter.com/awscloud/status/1311104383833305093) promoting the event (shoutout to Aaron Schwam and Sudeepa Prakash) but the CFP was too short and came too soon for them to help us for it.

This meant that I had to pretty aggressively market the event across various platforms but focused on LinkedIn and Twitter (@cdkday, @cdkpatterns and @nideveloper accounts). It also helps when you have a few AWS Heroes in your organising committee who have large followings plus I asked a few friends if they could help get the word out too. We were even lucky enough that this event coordinated with AWS Americas Online Summit where Werner Vogels keynote was about CDK and he told people to signup for our event!

{% twitter 1298196045353148417 %}
{% twitter 1293609286933843973 %}
{% twitter 1311258558307143682 %}

One thing that helped a lot which I think Aaron started was that we ran a multi stage voting process with the community to pick and name a mascot for CDK Day which turned into [Pancakes the otter](https://twitter.com/cdk_pancakes). I think engaging the community on a pre-event activity really brought us together.

Animal Chosen
{% twitter 1296567709702983681 %}
{% twitter 1297163402683580418 %}

Name Decided
{% twitter 1298642600577179649 %}
{% twitter 1299400365503180803 %}

Meet Pancakes
{% twitter 1300086835301974016 %}

##Picking The Talks

We agreed to use the built in ranking mechanism in sessionize as our main filter. The way this works is that you are asked to rank 3 talks 1,2,3 over and over again until you have compared everything enough to have a confident ranking. You can mark certain talks as a must so they go top and you don't have to vote on it anymore.

We had quite a few people do this for all of the talks to try and get a fair ranking process.

Personally I think this tool was super quick to use and very intuitive but I wasn't fully convinced by the outcome. There were talks I ranked first every time that ended up bottom for instance, I spoke to sessionize and they said they are working on the transparency of their ranking process.

To me this tool is one lens and I wouldn't pick your entire schedule based on its top results.

We didn't pick speakers based on who they were (i.e. more followers did not give you more points), we knew that we wanted to cover AWS CDK, CDK8s and CDKTF as much as we could in a varied way. We had to turn down some incredible speakers/talks, the quality was so high that I seriously considered if we could run two parallel tracks. The problem was that this was our very first event and we were still learning so the extra responsibility would have broken us. In the future I think we should look at themes and multiple tracks.

As an aside, for anyone who has never used sessionize before, their inform the speakers functionality works very unnaturally. We had two kinds of talk - lightning and full. I went through and wrote a specific lightning session message then clicked send. Then I picked all the other speakers, changed the message to one for the full session and clicked send. All of the speakers got the full session messaging. Apparently even after clicking send you can modify the message being sent right up until the moment sessionize actually sends it. So if you are sending different inform messages don't send them within a couple of minutes of each other or you could have the same thing happen as me.

##Choosing The Schedule

We decided early that we were going to run one single five hour track rather than attempting anything more complicated on our first attempt.

Scheduling this was more complicated than I thought it was going to be. Originally when we set the schedule, nearly everyone was presumed to present live as opposed to pre-recorded. This meant that multiple speakers time zones were in play. The earlier the time zone, if they wanted to present live they were given an earlier slot on the agenda.

By the time we went live the vast majority of the talks were pre-recorded but that didn't mean we could alter the agenda significantly since we still wanted the speakers to be in their slack channel answering questions.

Next time I would ask at time of CFP if the speaker wants to go live or pre-record but I don't think that would make the schedule a lot easier. The thing that would help is that I would also ask both their time zone and a time range in their day that works best. You mightn't be able to accommodate the time range but it would be great to know.

I also planned a 30 minute slot for lunch which on the day was replaced with a panel discussion out of not wanting to cut transmission and drop viewers. There are other platforms I have seen since the event like hopin.to where the broadcast is only one part of the event - you can have multiple tracks with a main stage, random match making and sponsor booths. I think switching to a platform like that would allow better breaks and maintain audience participation.

##Announcing The Speakers

Rather than announcing all of the speakers at once it seemed like it would build momentum towards the event by announcing them over the course of a couple of weeks. 

I know this is a long scroll but this shows all of the announcement tweets and the date that we announced them. This definitely kept the conversation open in the run up to the event. Different people related to different events and shared within their networks, had we dropped them all at once then topics may have been missed.

{% twitter 1301433096902971392 %}
{% twitter 1301499500037578752 %}
{% twitter 1301528488986513413 %}
{% twitter 1302149293369819138 %}
{% twitter 1302870541343260673 %}
{% twitter 1302944828205027328 %}
{% twitter 1303230440199909376 %}
{% twitter 1303602641881182208 %}
{% twitter 1303676287786135555 %}
{% twitter 1303954637427482624 %}
{% twitter 1304394340912058371 %}
{% twitter 1304333539484274688 %}
{% twitter 1305419721802739713 %}
{% twitter 1305491737419362304 %}

##Working With The Speakers

There is a gap between announcing the speakers and the event itself. In this gap when you are a speaker you can be sitting there thinking "I know they announced me... but I haven't heard anything". That is why for any speaker who wasn't in the organising committee I asked that we assign them a mentor. Matthew Bonig, Thorsten Hoeger and Marek Kuczyński were our mentors.

The purpose of the mentor was:
- To have a named easy to reach contact for any questions
- To feel valued
- To make collecting recordings easier because one person only had to collect a couple
- If going live to coordinate a trial run on StreamYard

I think that this largely worked very well. I had personally already been in contact with all of the speakers so we did have a couple of miscommunications but I was able to step in at those points to smooth things over.

What I would do differently is that I didn't make it clear where to put the talks up front. As long as Eric had a copy I was happy but what I should have done was provided a location for raw recordings which could then be pre-processed for audio quality etc before being passed onto Eric. 

Ideally I would love to provide a tool to speakers to say "run your recording through this for audio quality checks". I also should have drawn up a set of guidance for the presentations themselves e.g. minimum font size. I think all the speakers did an amazing job, I just think I could have done more to help them.

##The Actual Event

All of this pre-work was for our 5 hour live event. 

In terms of the keynote and the hosting on the day, Matthew Bonig led planning these efforts along with the other hosts and speakers who appeared. It was awesome having someone else to focus on that who was in the middle of it rather than having me helicopter parent so to speak when I wasn't going to be on screen with them. I definitely think having someone focus "on screen" and someone focus "off screen" helps.

We did have a team of moderators on the day to moderate the comments across Twitter, YouTube and Twitch. Working out how to add moderators on these platforms was again harder than I expected, the easiest method was on YouTube if they commented you could click beside their name and click "make moderator". On Twitch you could find their user if they follow you and do the same. The amount of comments on the various platforms was an absolute firehose, do not underestimate the amount of effort needed to keep on top of this information. There are not only comments on your official streams but people sharing screenshots, quoting and mentioning you across the platforms.

Whilst I was only on screen for a couple of minutes throughout the day I was backstage with direct chat access to the hosts and speakers all day long. StreamYard was awesome for this.

Full disclosure most of that five hour event was a blur, it was definitely one of those "measure twice, cut once" situations where everyone had a job to do and they all nailed it.

Something that really disappointed me about YouTube was that by default auto closed caption generation is turned off. So even though I enabled it after the event, I would have had to manually add captions. It feels like that setting should be on by default so if you setup a new channel make sure you enable the setting.

##After The Event
We did send out a survey after the event to try and learn from the audience. We used Google Forms for this and we got some good data, this was definitely worthwhile.

One of the biggest asks of the event was "will this be available to watch after the fact?" and the answer was always "yes, YouTube saves the live stream instantly". That wasn't the optimum solution though. The first step was that for the full day video to have chapters on the video allowing viewers to skip to a talk.

I now know adding chapters to a YouTube video just involves editing the video description to add the timestamps followed by a description making sure the first one starts: 

00:00 {name of chapter}
10:00 {name of second chapter}

That is an improvement but what consumers want is for the whole event to be broken up into individual videos. I decided to try the built in YouTube editing tools to do this, they were super awkward and very slow so I switched to iMovie.

This meant I needed to download the 1080p version of the video, the problem was that YouTube would only let me download it in 720p. Twitch to the rescue, luckily Twitch let me download the 1080p video from there which makes it worth streaming to even if you have no viewers there.

Then I was able to splinter and upload the individual videos to YouTube at 1080p quality with auto closed captions. I also created the [CDK Day Rewind](https://cdkday.com/2020) page so that it's easy to watch them all.

##What Have I Learned?

This event started as a small idea, I thought about getting a few people together to run a couple of talks. What I learned is that running a global, virtual event is a lot more work than just finding the speakers. Next time I would:

- Spend more than 2 months planning
- Even if the event is free, find sponsors. We did this whole event for free but charity only runs so far.
- Use a virtual event platform like hopin.to
- pre-process recorded videos
- Add session types to the cfp
- Add live vs pre-recorded to the cfp
- Add time zone and preferred time range to cfp
- Auto generated closed captions are ok but I would love to improve by hiring a sign language interpreter for the whole event
- Work with awesome communities like [Black Tech Pipeline](https://twitter.com/BTPipeline) and [Diversify Tech](https://twitter.com/DiversifyTechCo) to try and promote the cfp with a more diverse audience
- I think this was an awesome first event but this event needs multiple tracks in the future potentially one per product (AWS CDK, CDKTF and CDK8s). It would allow the event to stay a CDK Day but allow space for developers to learn about or avoid the products they don't use. 
- Alternatively to multiple tracks - maybe it rotates product so AWS CDK Day, then CDKTF Day followed by CDK8s Day.

##Tool Rating

**StreamYard** - 7/10
Amazing for multi platform streaming and handling on stage / backstage. Pre-recorded videos seem to be a problem for it though, we had image and audio quality issues

**YouTube** - 9/10
Did exactly what it is supposed to do and I like how it preserves the live chat from the day separate from post recording comments.

**Twitch** - 10/10
People reported better image quality here than YouTube

**eventbrite** - 6/10
We mostly used this as a method for people to sign up so they got reminders about the event and for us to send out the survey afterwards. I had some reports of users not able to access tickets (lucky they didn't need them), it was also very awkward about logo sizes etc

**Sessionize** - 9/10
Very easy to sign up, free once I explained the event was community based. They handled speaker profiles and talk submissions plus scoring and notifying speakers. It also handled schedule creation and allowed me to put the schedule on the website via a plugin. The only drawback was the talk scoring mechanism wasn't very transparent.