<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en_US"><generator uri="https://jekyllrb.com/" version="4.1.0">Jekyll</generator><link href="https://stevenyau.co.uk/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://stevenyau.co.uk/blog/" rel="alternate" type="text/html" hreflang="en_US" /><updated>2026-05-31T15:16:02+01:00</updated><id>https://stevenyau.co.uk/blog/feed.xml</id><title type="html">Steven Yau’s Blog</title><subtitle>Game Maker Geek</subtitle><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><entry><title type="html">My Journey with LLMs and AI Agents: From Skeptic to Adopter</title><link href="https://stevenyau.co.uk/blog/2026/05/24/my-Journey-with-ai.html" rel="alternate" type="text/html" title="My Journey with LLMs and AI Agents: From Skeptic to Adopter" /><published>2026-05-24T00:00:00+01:00</published><updated>2026-05-24T00:00:00+01:00</updated><id>https://stevenyau.co.uk/blog/2026/05/24/my-Journey-with-ai</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2026/05/24/my-Journey-with-ai.html">&lt;p&gt;When AI services like ChatGPT and Claude Code hit the scene, I was impressed by what they could do against LeetCode problems and mini projects but was skeptical that they would be able to handle the complexity of an actual product’s project.&lt;/p&gt;

&lt;p&gt;We had access to several different AI services and tools at day job at &lt;a href=&quot;https://www.gather.town&quot;&gt;Gather&lt;/a&gt; but every time I tried using them for code generation, I wasn’t happy with the results. They didn’t follow existing patterns in the codebase, failed to handle edge cases, or output code that wasn’t even buildable in some cases, especially for automated tests.&lt;/p&gt;

&lt;p&gt;It wasn’t until 2026, I started to see a positive uptick with people on my team and developer friends in usage of AI and LLMs - it felt like something had genuinely changed, especially with the recent release of top of line models from Claude and OpenAI. They were frequently referenced as being a marked improvement on previous models, I decided to give it another go to see what I was missing.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Thinking about AI&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/my-journey-with-ai/thinking-about-ai.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;the-early-struggles-too-much-human-in-the-loop&quot;&gt;The Early Struggles: Too Much Human in the Loop&lt;/h3&gt;

&lt;p&gt;I had a list of small issues in our app that I wanted to deal with for a while, but couldn’t prioritise hands-on time because there was always a higher priority task to deal with in our backlog.&lt;/p&gt;

&lt;p&gt;As I knew these issues well and I knew what the solutions should be, I felt like this was a solid test if using AI would be an overall improvement to my productivity in any way. Gather’s engineering AI tool stack was:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://devin.ai&quot;&gt;Devin&lt;/a&gt; - An AI agent in the cloud that has it’s own virtual computer to work and build projects in using prompts.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cursor.com&quot;&gt;Cursor&lt;/a&gt; - A code editor with AI powered autocompletes and agent mode for prompt based code generation.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://claude.ai&quot;&gt;Claude Code&lt;/a&gt; - An AI agent for prompt based code generation on your local projects.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/gathertown/grapevine&quot;&gt;Grapevine&lt;/a&gt; - Our own internal “ChatGPT” that’s been trained on our knowledge sources in Notion, Slack, GitHub, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Devin was the tool I settled on because it uses own virtual computer and workspace so it meant it could “work” alongside me while I was working on other tasks. It wouldn’t change or interfere with my local workspace in any way.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Devin AI Website screenshot&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/my-journey-with-ai/devin-ai.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It did okay at first. It would create a GitHub PR and our bots would leave feedback, but I had to keep sending that feedback back to Devin to make adjustments. Other times it would generate a PR with a solution that was incorrect or not what I had in mind, and I would have to instruct it to backtrack, give it the direction I wanted, and repeat the process.&lt;/p&gt;

&lt;p&gt;It required too much interaction with me in the loop to get to a reasonable result instead of the holy grail of being completely hands off.&lt;/p&gt;

&lt;p&gt;I didn’t care about how fast it could generate code, but how fast could I produce deliverables that impacts our users. Having me switch problem context between my main tasks and these Devin tasks was slowing me down rather than helping me deliver this value.&lt;/p&gt;

&lt;h3 id=&quot;the-turning-point-playbooks-and-one-shot-workflows&quot;&gt;The Turning Point: Playbooks and “One-Shot” Workflows&lt;/h3&gt;

&lt;p&gt;That’s when I discovered we actually had “&lt;a href=&quot;https://docs.devin.ai/product-guides/creating-playbooks&quot;&gt;playbooks&lt;/a&gt;” already added to our account that weren’t being actively used by us today. (This was a leftover from our previous AI products team. &lt;a href=&quot;https://www.gather.town/blog/new-chapter&quot;&gt;Read more&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;A playbook (which is Devin’s equivalent of Claude Skills) is a mix between a knowledge base and a boilerplate prompt. It gives the agent a repeatable framework or high-level approach on exactly how to deal with the task it’s been given.&lt;/p&gt;

&lt;p&gt;In our case, the playbook splits the workflow into multiple phases. The first phase is research and classification, where the agent investigates the codebase and proposes a plan for me to approve or tweak. Once the plan is approved, it moves onto implementation, does an internal code review and submits a PR to GitHub.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Planning with AI&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/my-journey-with-ai/planning.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Crucially, the playbook instructs the agent to keep an eye on CI tasks and automated tests. If any of those fail, or if a review bot (or even another engineer) leaves feedback, the agent handles it automatically.&lt;/p&gt;

&lt;p&gt;So I tried another ticket, but this time I attached a playbook. The difference was night and day. It managed the full loop, and after a couple of hours, pinged me to say, “I’m done, ready for your human review.”&lt;/p&gt;

&lt;p&gt;I no longer had to be involved in the iteration loops at all and this is where I truly felt like a task could be fully handed off to an agent. I could give it a ticket, go off and do my deep work, and whenever I had a clear gap, be it a few hours or a few days, I could come back in to prompt for changes, review the PR and/or pull it down to test locally.&lt;/p&gt;

&lt;p&gt;And because the playbooks are reusable from task to task, the input I need to give the AI is minimal. I just give it the task and tell it to use the playbook instead of having to re-prompt the guidelines on how to approach the problem, how to deal with our tool stack, or how to handle the automated feedback loop every time.&lt;/p&gt;

&lt;p&gt;The knowledge base aspect of the playbook also ensures the agent follows our specific engineering patterns. It explicitly tells the agent: “This is the specific way we do things. You must run the lint and prettier tasks via these commands.” It provides guidelines on where to look for patterns we use, and just as importantly, examples of what &lt;em&gt;not&lt;/em&gt; to do.&lt;/p&gt;

&lt;p&gt;We also have a team culture that embraces these tools. If a session produces something worth repeating - a useful approach, a pattern that worked well - you can ask the agent to turn that session into a new skill. It will output it directly into your shared collection, ready to be reused by anyone on the team in future tasks. The playbook and skill library essentially grows itself.&lt;/p&gt;

&lt;h3 id=&quot;the-parallel-workflow-compartmentalising-ai&quot;&gt;The Parallel Workflow: Compartmentalising AI&lt;/h3&gt;

&lt;p&gt;I found that the real power of these tools wasn’t just in what or how fast they could generate, but in the impact on how I can structure my work and started treating agents as a parallel workflow.&lt;/p&gt;

&lt;p&gt;As Devin operates in a remote computer, I could easily compartmentalise tasks. I have Devin start working on a few small tasks in the background including planning and suggested solutions while I stayed fully focused on a major task on my main computer.&lt;/p&gt;

&lt;p&gt;This was the turning point for me to adopt AI more into my workflows. The ability to offload small, clearly scoped pieces or work or chores, without the friction of constantly context switching my own workspace, is where I found the real value.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Handing off work to AI&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/my-journey-with-ai/handing-off.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;A good example is a recent week where I was heavily focused on our payment system. Because the payment system is essential to the business and we can’t afford for it to be wrong, this work required my full focus as much as possible. I had to ensure I understood every edge case so we could be confident when it shipped since it directly affects revenue.&lt;/p&gt;

&lt;p&gt;While I was deep in that work, I had a backlog of low-priority tech debt piling up included adding confetti to the virtual office and the need for a licensed tool to generate the image files needed for some art instead of a command line tool everyone can access.&lt;/p&gt;

&lt;p&gt;I gave Devin the spec for this tasks and features, along with examples of how other games and projects had solved similar problems. It asked me a few clarifying questions, and then I let it go off and work in the background. It didn’t matter how long it took, because I was only going to check on it when I hit a natural breakpoint in my payment system work.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Workflow of using Devin in day to day workflow&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/my-journey-with-ai/workflow-timeline.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;That is what my week generally looks like now: one very deep, high-focus task running on my local machine, with a few bits of tech debt clearance running in parallel via an agent in the background.&lt;/p&gt;

&lt;h3 id=&quot;what-makes-a-task-suitable-for-parallel-workflows&quot;&gt;What Makes a Task Suitable for Parallel Workflows?&lt;/h3&gt;

&lt;p&gt;To make this parallel workflow actually useful, a task needs to meet two main criteria:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;I must know the relevant area of the codebase well enough.&lt;/strong&gt; I have to be comfortable reviewing the code output and fully understanding it when it comes back. If I don’t know the system, I don’t have the confidence to review the PR and own the output.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;There must be a very clear definition of done.&lt;/strong&gt; The task needs to have a concrete expected output and a straightforward way to verify it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a task requires constant iteration or experimentation to see what works, it is a bad fit for an autonomous agent.&lt;/p&gt;

&lt;p&gt;For example, we had a task recently where we needed to add a warning when a user deletes a chat channel (stating that all related data will also be deleted). I ended up doing that manually because I didn’t know exactly how I wanted it to look until I saw it on screen.&lt;/p&gt;

&lt;p&gt;Initially, I thought it would just be a bit of text, but that didn’t stand out enough. So I changed it to a box-out with an exclamation mark. That still wasn’t quite right, so I had to tweak the colours further. Because we don’t yet have a clear playbook for UI iteration, and because the task required visual experimentation rather than a strict logical output, handing it to Devin would have been frustrating and slow.&lt;/p&gt;

&lt;p&gt;The confetti script on the other hand, perfectly met the criteria for a parallel task. I knew the area well, I knew exactly what the output should look like, and it was easily testable. Even though the final output was visual but everything prior to that was systems work, making it perfect for a Devin task. If it worked, great. If it was close, I could ask Devin to revise it. If it was completely wrong, I could reject the code entirely.&lt;/p&gt;

&lt;p&gt;In the end, Devin managed to nail everything but the final visual implementation of how the confetti looked, and that required me to manually iterate on it before I was happy to ship it into production.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Gather Confetti Feature&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/my-journey-with-ai/gather-confetti.gif&quot; /&gt;
    &lt;figcaption&gt;Throwing Confetti in Gather 🎉&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;the-hidden-costs-mental-bandwidth-and-team-capacity&quot;&gt;The Hidden Costs: Mental Bandwidth and Team Capacity&lt;/h3&gt;

&lt;p&gt;So, am I actually “faster”? That’s the tough part to measure. I definitely &lt;em&gt;feel&lt;/em&gt; more productive, and I’m definitely shipping more PRs by splitting my workload this way.&lt;/p&gt;

&lt;p&gt;However, there is a flip side that rarely gets talked about: team capacity.&lt;/p&gt;

&lt;p&gt;It’s fine being able to spit out so many PRs and generate so much code, but this code still needs to be reviewed. Our system relies on having one person who hasn’t been involved in the code (or the prompt generation) review the PR before it gets merged to main.&lt;/p&gt;

&lt;p&gt;My review process for AI-generated code is exactly the same as it would be for a human contributor. If the solution isn’t immediately understandable, or if it overreaches its scope, I challenge it. If it still doesn’t make sense, I completely reject the PR and start again, either by taking over the task myself or using a different tool. I never submit code for a human PR review unless I fully understand it.&lt;/p&gt;

&lt;p&gt;In terms of velocity as a company, we have to consider our team’s mental capacity to not only write features but also review them. If I had a whole team of “me’s” doing the same thing, would we have enough capacity to review all the output? Honestly, I’m not entirely sure.&lt;/p&gt;

&lt;h3 id=&quot;what-needs-to-be-in-place-before-this-works&quot;&gt;What Needs to Be in Place Before This Works?&lt;/h3&gt;

&lt;p&gt;I’m actually still trying to find the definitive answer to this.&lt;/p&gt;

&lt;p&gt;My current theory is that a major reason this parallel workflow succeeds for me at work is because we have a large, well-managed codebase. The code quality is high, and the standard of quality has been maintained throughout the years. This means the agents have excellent data to work from. When Devin generates code, it’s pattern-matching against a clean, consistent source rather than pulling fragmented examples from the internet.&lt;/p&gt;

&lt;p&gt;The frontier models certainly help, and the tools built around them are getting better, but my gut feeling-based on my own experience and anecdotal conversations with other developers-is that the underlying quality of the codebase matters immensely.&lt;/p&gt;

&lt;p&gt;The part I’m trying to figure out now is what happens when you don’t have that foundation. If you start from a new codebase, or a messy one, what do you need to put in place for these agents to work well? That’s something I’m currently testing myself on a personal project, and I’m hoping to get a better understanding of it soon.&lt;/p&gt;

&lt;h3 id=&quot;in-the-end&quot;&gt;In the End…&lt;/h3&gt;

&lt;p&gt;Is the 100x or 10x developer actually true? Honestly, I don’t think so. It’s not about the speed of work; it’s about the speed of deliverables that actually reach our users.&lt;/p&gt;

&lt;p&gt;I want to understand why my experience at work has been so different from developers who are experimenting and struggling to get satisfactory results. What is needed to bridge the gap here?&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">When AI services like ChatGPT and Claude Code hit the scene, I was impressed by what they could do against LeetCode problems and mini projects but was skeptical that they would be able to handle the complexity of an actual product’s project.</summary></entry><entry><title type="html">Asking whether a candidate is cheating with AI is the wrong question</title><link href="https://stevenyau.co.uk/blog/2023/01/14/candidate-is-cheating-with-ai.html" rel="alternate" type="text/html" title="Asking whether a candidate is cheating with AI is the wrong question" /><published>2023-01-14T00:00:00+00:00</published><updated>2023-01-14T00:00:00+00:00</updated><id>https://stevenyau.co.uk/blog/2023/01/14/candidate-is-cheating-with-ai</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2023/01/14/candidate-is-cheating-with-ai.html">&lt;p&gt;Original article: “&lt;a href=&quot;https://www.linkedin.com/business/talent/blog/talent-acquisition/why-you-need-company-wide-pov-on-candidate-cheating&quot;&gt;Why You Need a Company-Wide Point of View on Candidate Cheating&lt;/a&gt;”&lt;/p&gt;

&lt;p&gt;Asking whether a candidate is cheating with AI fails to address the real issues that companies have.&lt;/p&gt;

&lt;p&gt;If interview questions can be easily answered by AI, what are we truly assessing? In the realm of Software Engineering, existing resources like ‘Cracking the Coding Interview’ and Interview Cake already equip candidates for FANG-style interview loops.&lt;/p&gt;

&lt;p&gt;Companies need to reassess their interview process and rethink what information they truly want to uncover about a candidate. Adjusting the process can better unveil crucial insights.&lt;/p&gt;

&lt;p&gt;Some of the most effective technical interviews I’ve experienced as a candidate involved engaging in mini projects beyond scoped, leetcode style questions.&lt;/p&gt;

&lt;p&gt;Whether with existing code or APIs, these projects allowed me to showcase problem-solving approaches, planning ability, communication skills, and even provided a glimpse of what collaboration with me would be like.&lt;/p&gt;

&lt;p&gt;Let’s shift our focus and enhance the hiring process by evaluating candidates without imposing artificial restrictions.&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">Original article: “Why You Need a Company-Wide Point of View on Candidate Cheating”</summary></entry><entry><title type="html">A better Fantasy Premier League table</title><link href="https://stevenyau.co.uk/blog/2020/12/30/fixing-the-fpl-table.html" rel="alternate" type="text/html" title="A better Fantasy Premier League table" /><published>2020-12-30T00:00:00+00:00</published><updated>2020-12-30T00:00:00+00:00</updated><id>https://stevenyau.co.uk/blog/2020/12/30/fixing-the-fpl-table</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2020/12/30/fixing-the-fpl-table.html">&lt;p&gt;Me and a bunch of friends have a tradition of playing Fantasy Premier League (FPL) every season with the top 2 would get treated to dinner at the end of season social. Usually involves of fun, competitive banter in our WhatsApp group on the weekends. 😄&lt;/p&gt;

&lt;p&gt;(TL;DR on the FPL: A management game where each user has to create a team of football players in the Premier League within a limited budget. As the players do well, they accrue points on the users’ teams that they are on.)&lt;/p&gt;

&lt;p&gt;We use the official web app at &lt;a href=&quot;https://fantasy.premierleague.com/&quot;&gt;fantasy.premierleague.com&lt;/a&gt; and it suffers from one major issue: we only know how well we’ve done relative to the other users at the end of the match day.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Official FPL Table&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/fixing-the-fpl-table/fpl-official-table.png&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I assume this is for performance reasons given the sheer number of users and tables that they have.&lt;/p&gt;

&lt;p&gt;Throughout the match days, to see how everyone is progressing in terms of points, we used to have keep a mental note on how many points every one got.  This involved constantly going to the table page, clicking on each user, seeing how many points they got this week, etc.&lt;/p&gt;

&lt;p&gt;Working out who captained whom and what football players each user got was also a huge pain.&lt;/p&gt;

&lt;p&gt;This was very tedious and killed some of the flow and banter in our WhatsApp group. 😞&lt;/p&gt;

&lt;p&gt;Then the thought occurred to me.&lt;/p&gt;

&lt;p&gt;“Surely, I could make our own page that would live update the table throughout the day? How hard could it be? 🤔”&lt;/p&gt;

&lt;h2 id=&quot;r--d&quot;&gt;R &amp;amp; D&lt;/h2&gt;
&lt;p&gt;I started to look at how the official FPL page retrieved the data via Chrome Devtools and saw that there were a number of REST API calls being made.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;FPL REST API from Chrome devtools&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/fixing-the-fpl-table/fpl-rest-devtools.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Digging into the response by these APIs, they all return JSON and with relational data sets.&lt;/p&gt;

&lt;p&gt;For example, here is the response from &lt;a href=&quot;https://fantasy.premierleague.com/api/entry/2154506/event/16/picks/&quot;&gt;entry/2154506/event/16/picks&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;FPL picks REST response&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/fixing-the-fpl-table/fpl-picks-rest-response.png&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;As the API URL name suggests, it returns the team player picks for a particular user and gameweek including the cost of player transfers, points accrued prior to this game week, captain and vice captain choice, etc.&lt;/p&gt;

&lt;p&gt;The football players are identified by ‘element id’ which is related to the player data set from the API &lt;a href=&quot;https://fantasy.premierleague.com/api/bootstrap-static/&quot;&gt;bootstrap-static&lt;/a&gt;. This has information such as the player’s name, their injury status and which team they are on.&lt;/p&gt;

&lt;p&gt;After some trial and error, I’d managed to work out how which APIs I could access without needing user authorisation:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;entry/{user-id} - Information about a user such as their name&lt;/li&gt;
  &lt;li&gt;entry/{user-id}/event/{gameweek}/picks - A user’s team player picks&lt;/li&gt;
  &lt;li&gt;bootstrap-static - Information about players and teams&lt;/li&gt;
  &lt;li&gt;event/{gameweek}/live - The current stats of the player such as how many points they have accrued this gameweek&lt;/li&gt;
  &lt;li&gt;entry/{user-id}/history - History of a user and needed to get last gameweek’s scores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The league page used to not need authorisation which allowed to retrieve all the user IDs from a single league ID but that was changed last year. I now hard code the user IDs for our league into the webpage which is fine as the page is specifically for us.&lt;/p&gt;

&lt;h2 id=&quot;minimal-shippable&quot;&gt;Minimal Shippable&lt;/h2&gt;
&lt;p&gt;The first minimal shippable looked like this:&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Minimal shippable page&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/fixing-the-fpl-table/minimal-shippable.png&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The user order is updated throughout the match days and username has a link to their team on official FPL site.&lt;/p&gt;

&lt;p&gt;The high level logic was:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Get every user’s total points from the prior weeks&lt;/li&gt;
  &lt;li&gt;Get every user’s team picks for the current game week&lt;/li&gt;
  &lt;li&gt;Calculate the points for each football player accrued so far this gameweek&lt;/li&gt;
  &lt;li&gt;Apply an point modifiers such as captain choices, chips, transfers, etc&lt;/li&gt;
  &lt;li&gt;Calculate the current score for each user&lt;/li&gt;
  &lt;li&gt;Sort all users into a table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the minimal version working and fulfilling our main point of frustration with the official FPL site, I excitedly uploaded the page to my website host, only to be faced with this error:&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;CORS error&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/fixing-the-fpl-table/cors-error.png&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;🤦‍♂️ It makes sense for there to be a CORS policy in policy as they would want prevent abuse from webpages like mine spamming their servers.&lt;/p&gt;

&lt;p&gt;However, there was still hope as the API was shown to be accessible if I just entered the API address to the browser or use CURL on the commandline. Although I had made the decision earlier to not use a server due to cost, I decided to see if a Node.js server was able to access the APIs.&lt;/p&gt;

&lt;p&gt;I did this via &lt;a href=&quot;https://glitch.com/&quot;&gt;Glitch&lt;/a&gt; as I was still very new to Web Development at the time and had little exposure to the Node and NPM ecosystem.&lt;/p&gt;

&lt;p&gt;Glitch is a fantastic free service where users can host Node.js applications for free and starts/stops instances based on their usage. It also provides an online editor which meant I didn’t have to setup my own local instance.&lt;/p&gt;

&lt;p&gt;After fumbling my way around setting up my own REST API with the express module and accessing the FPL’s API using the request module, I was able to access the FPL’s API without CORS errors and also be able retrieve that information from my web page.&lt;/p&gt;

&lt;p&gt;I effectively created an API ‘relay’ where all the Node.js server did was forward the data from the FPL’s API as is back to the webpage of my custom league table.&lt;/p&gt;

&lt;p&gt;Now we are back in business! 🎉&lt;/p&gt;

&lt;p&gt;This did come with the major drawback of having to wait for the Glitch services to start a new instance when someone accessed the webpage, but this was more than enough for now.&lt;/p&gt;

&lt;h2 id=&quot;feature-development&quot;&gt;Feature Development&lt;/h2&gt;
&lt;p&gt;After I posted the link to the WhatsApp group, it wasn’t long before I started to get feature requests. 😅&lt;/p&gt;

&lt;p&gt;Over several seasons (I have kids, free time is a luxury!), I started to add/remove/improve features to the page, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Showing captain and vice captain choices&lt;/li&gt;
  &lt;li&gt;Listing the whole team&lt;/li&gt;
  &lt;li&gt;Separating the points awarded in the week from the transfer costs&lt;/li&gt;
  &lt;li&gt;The number of players that have played so far in the game week&lt;/li&gt;
  &lt;li&gt;What chip was played (if any)&lt;/li&gt;
  &lt;li&gt;Showing differentials (football players not commonly chosen by the league)&lt;/li&gt;
  &lt;li&gt;Button to quickly update the points&lt;/li&gt;
  &lt;li&gt;Bonus point ‘predication’&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Final FPL page with less details&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/fixing-the-fpl-table/final-page.png&quot; /&gt;
    &lt;figcaption&gt;Minimal and detailed view&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now it is possible to get almost all the information we needed on a single page, without needing to navigate across several pages. 👍&lt;/p&gt;

&lt;p&gt;Keeping the design and layout simple was a conscious decision, with the use of font weight, colour and size for emphasis.&lt;/p&gt;

&lt;p&gt;The important elements of information on the page are bigger and darker, such as the username and total score. Even when there is a lot of information on the page, the name of the users and total score still standout.&lt;/p&gt;

&lt;p&gt;Details like the team picks are in a smaller font but the names of the football players, points and captain choice are in a darker colour so they are easier to pick out at a glance.&lt;/p&gt;

&lt;p&gt;Future planned improvements will include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Auto substitution&lt;/li&gt;
  &lt;li&gt;User rank changes&lt;/li&gt;
  &lt;li&gt;Use/Find an 24/7 Node.js server&lt;/li&gt;
  &lt;li&gt;Speed up the time it takes to make a process all the REST API calls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;closing-out&quot;&gt;Closing out&lt;/h2&gt;
&lt;p&gt;This is one of my favourite side projects to work on, although it is not a large project nor my best code, it solves a problem that me and my friends have. That in itself is hugely rewarding, especially when I see them use it too in the WhatsApp group!&lt;/p&gt;

&lt;p&gt;Enjoyed this blog post? Let me know what you think on &lt;a href=&quot;https://twitter.com/yaustar&quot;&gt;Twitter @yaustar&lt;/a&gt;! 👋&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">Me and a bunch of friends have a tradition of playing Fantasy Premier League (FPL) every season with the top 2 would get treated to dinner at the end of season social. Usually involves of fun, competitive banter in our WhatsApp group on the weekends. 😄</summary></entry><entry><title type="html">Lessons learned from 10 years in the Games Industry</title><link href="https://stevenyau.co.uk/blog/2019/03/26/lessons-from-the-games-industry.html" rel="alternate" type="text/html" title="Lessons learned from 10 years in the Games Industry" /><published>2019-03-26T00:00:00+00:00</published><updated>2019-03-26T00:00:00+00:00</updated><id>https://stevenyau.co.uk/blog/2019/03/26/lessons-from-the-games-industry</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2019/03/26/lessons-from-the-games-industry.html">&lt;p&gt;I was thinking the other day that I wish I had learned before my first job in the games industry.&lt;/p&gt;

&lt;p&gt;Surprisingly, most of it was from working as part of a team, rather than specific areas of knowledge. Although there had been group projects during my time at university, there wasn’t much guidance about how to effectively run them or what to expect when working as part of a team.&lt;/p&gt;

&lt;p&gt;Below are what I consider to be important lessons during my career as a games programmer.&lt;/p&gt;

&lt;h3 id=&quot;keep-the-team-moving-forward&quot;&gt;Keep the team moving forward&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Team working&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/lessons-from-the-games-industry/team-at-desk.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;During my time at EA when I was still a junior, there was a huge amount of effort ensuring that the team (which varied from 50-100 people in size) was always able to move forward and not be blocked from working on the game.&lt;/p&gt;

&lt;p&gt;The core principles were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Everyone is able to test their work locally and quickly.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Everyone is able to run the game at any given time and on any platform.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The game should not break, even when given bad data and all errors should be made clear to the user.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;All work should be tested locally before being given to the rest of the team (e.g. through version control or builds).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Be aware of the potential impact of your work to the team and talk to them about it, especially if you are not sure.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finding bottlenecks and issues (e.g in workflows, processes, performance drops) and raise awareness to help find a solution as a team.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;baby-steps-and-iteration-cycles&quot;&gt;Baby steps and iteration cycles&lt;/h3&gt;

&lt;p&gt;I was introduced to the concept of ‘baby steps’ at EA by my lead/mentor during my time there and it has pretty governed my approach to work since then.&lt;/p&gt;

&lt;p&gt;At its core, it’s designing through iterative prototyping and follow these rules:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Work one small step at a time. Start with the core mechanics or the largest unknown (e.g. a control scheme) and work outwards to build up the game or feature. Move onto the next step once you have ‘finished’ or have answered the unknown.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Don’t be afraid to quickly hack something together if you want to see if something works. Feedback from something that people can play is much more important than the implementation being ‘right’. It can always be tidied once it has been proven.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Let the feedback help drive the design. Although there would be a goal or design in mind at the start, keep it as an iterative process and review/change the design regularly based on feedback from the build.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;everything-is-done-for-a-reason&quot;&gt;Everything is done for a reason&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;E.T. Atari 2600&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/lessons-from-the-games-industry/et-atari-2600.jpg&quot; /&gt;
    &lt;figcaption&gt;E.T. on the Atari 2600. Why was it the 'worst game ever made'?&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Every past piece of work or decision that is done or made would have been for a reason at the time. That reason may have been ‘wrong’ or no longer valid but it will exist. I found that identifying that reasoning helps with finding common ground when looking to move forward.&lt;/p&gt;

&lt;p&gt;This may sound obvious but it is so easy to forget, especially when encountered in the middle of current work and stuff just needs to get done.&lt;/p&gt;

&lt;p&gt;“This is dumb”, “Why is it done this way” and “This is wrong”  have been said more than once by myself. Once I got into that mindset, I would start to get fixated on proving that it was ‘wrong’, potentially even trying to fix it than working on the actual task I was meant to be doing.&lt;/p&gt;

&lt;p&gt;Once I started the mindset of find the reason or context of code via curiosity rather than irritation, it was a much smoother experience. It would often give me a common point of understanding  and  appreciate the decisions and/or context,  which usually lead to better and more complete work from myself.&lt;/p&gt;

&lt;p&gt;A great example is E.T on the Atari 2600. It has and still is being branded the worst game in video game history. However, once you read about the how and why the game was developed, the game mechanics that were implemented and the very short time frame that the developer had, it becomes a lot harder to call it a ‘failure’.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.neocomputer.org/projects/et&quot;&gt;Another developer has since taken the game and fixed some of the gameplay issues and bugs present&lt;/a&gt;; it has become a lot more playable.&lt;/p&gt;

&lt;h3 id=&quot;you-dont-have-to-know-everything&quot;&gt;You don’t have to know everything&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Lots of books!&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/lessons-from-the-games-industry/library.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;With an increasing number of different engines, languages, tools, etc. to help make games, it is almost impossible to know them all from the very start and nor is it expected.&lt;/p&gt;

&lt;p&gt;Most of the time, companies are very understanding of this and will allow some flexibility as long as you have an understanding of the fundamentals, an awareness of the other possibilities and a willingness to learn.&lt;/p&gt;

&lt;p&gt;For some of my previous roles, I outright didn’t know the main programming language or the tool that they were using but managed to demonstrate my core knowledge and previous experience in some way.&lt;/p&gt;

&lt;p&gt;One in particular, I passed an on-site programming test in a language I had not used before with the use of the internet to check the syntax. This was largely due to working with similar languages either in previous roles or in my spare time. They knew that it was the first time I used this language and were willing to train me on some of the nuances on the job.&lt;/p&gt;

&lt;p&gt;I usually try to emphasise more the ‘why’ than the ‘how’ when I explain solutions to problems I get asked for this reason. The ‘whys’ are more likely to cross over to other technologies than explicit code snippets or tool specific techniques with explanation.&lt;/p&gt;

&lt;h3 id=&quot;the-user-isnt-you&quot;&gt;The user isn’t you&lt;/h3&gt;

&lt;p&gt;There’s a good chance that if you have implemented a feature, UX, UI, game mechanic, tutorial or even a how-to document, it most likely only been tested along the ‘happy path’, the path that you expected it to be used or played.&lt;/p&gt;

&lt;p&gt;As soon as it is put into somebody else’s hands, it’s common for them to do something that you hadn’t expected someone to do. E.g. Go backwards on the race track, use two fingers on the touch screen or simply not understand what’s going on.&lt;/p&gt;

&lt;p&gt;And this is simply because the user isn’t you. They have no idea on what the requirements were or how it should be used or played.&lt;/p&gt;

&lt;p&gt;Anticipating the unexpected path is something that gets better with practice, but nothing beats just simply putting it in the hands of someone else or discussing the problem and proposed solution with them. They could be a co-worker or just someone random. One team even went to a local pub and brought drinks for those that would help try their game.&lt;/p&gt;

&lt;h3 id=&quot;use-emojis-and-images-for-tone-and-context&quot;&gt;Use emojis and images for tone and context&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Communication with emoji&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/lessons-from-the-games-industry/emoji-communication.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Team communication can be difficult, especially as teams get bigger and/or are distributed in different locations. Communicating via text with emails, wikis, bug reports and instant messengers have become the norm.&lt;/p&gt;

&lt;p&gt;Unfortunately, it’s very difficult to convey nuance and tone over plain text. It’s all too easy to read something in a different way to how the writer intended it and completely misunderstand.&lt;/p&gt;

&lt;p&gt;Emojis can help a lot with tone and inject some personality.&lt;/p&gt;

&lt;p&gt;Consider the following:&lt;/p&gt;

&lt;p&gt;“What is it with you and Steven using long words that no-one understands?!”&lt;/p&gt;

&lt;p&gt;“What is it with you and Steven using long words that no-one understands?! 🤣”&lt;/p&gt;

&lt;p&gt;One could easily be taken as criticism and the other would more likely be seen as friendly banter.&lt;/p&gt;

&lt;p&gt;A picture is worth a thousand words and GIFs, even more so. I’ve seen people trying to talk to each other on instant messaging without realising they have a different screen in mind.&lt;/p&gt;

&lt;p&gt;An image as the first message of a conversation helps so much in establishing the context.&lt;/p&gt;

&lt;p&gt;If all else fails and a text conversation feels like you are talking past each other, try to get on a call with them or have a face to face chat. I’ve found that most of the time, this clears up misconceptions in record time.&lt;/p&gt;

&lt;h3 id=&quot;wrapup&quot;&gt;Wrapup&lt;/h3&gt;

&lt;p&gt;I really would like to expand on some of these in detail of some of these lessons in a future post. There are lots of juicy details and examples that I would like to share.&lt;/p&gt;

&lt;p&gt;If you have any lessons of your own, please share them with me on twitter &lt;a href=&quot;https://twitter.com/yaustar&quot;&gt;@yaustar&lt;/a&gt;. I would love to hear them!&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">I was thinking the other day that I wish I had learned before my first job in the games industry.</summary></entry><entry><title type="html">How I live streamed on Twitch with my 1Mb home connection</title><link href="https://stevenyau.co.uk/blog/2018/08/16/streaming-on-slow-internet.html" rel="alternate" type="text/html" title="How I live streamed on Twitch with my 1Mb home connection" /><published>2018-08-16T00:00:00+01:00</published><updated>2018-08-16T00:00:00+01:00</updated><id>https://stevenyau.co.uk/blog/2018/08/16/streaming-on-slow-internet</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2018/08/16/streaming-on-slow-internet.html">&lt;p&gt;I previously wrote an article series about my game development live streaming adventures but omitted my first hurdle in starting.&lt;/p&gt;

&lt;h4 id=&quot;problem&quot;&gt;Problem:&lt;/h4&gt;

&lt;p&gt;I had a connection of only 1Mb up and Twitch recommends 3-6Mb for a 720p or 1080p stream broadcast 😱.&lt;/p&gt;

&lt;h4 id=&quot;solution&quot;&gt;Solution:&lt;/h4&gt;

&lt;p&gt;Well, that took a little while to find 😅.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/stream_overlay.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Getting a faster connection would be simplest solution but neither fibre or cable was available to our building. 4G home connection was next on my list but was not viable either due to coverage and/or usage caps.&lt;/p&gt;

&lt;p&gt;Moving home was too extreme for a potentially short experiment. Renting a flat or private office was too expensive. Hot desking was cheaper but not practical as I would be talking most of the time and that wouldn’t go down well in a shared environment.&lt;/p&gt;

&lt;p&gt;I did wonder about borrowing a friend’s place but unfortunately didn’t know anyone close enough within a sensible commute.&lt;/p&gt;

&lt;h2&gt;🤔&lt;/h2&gt;

&lt;p&gt;With the obvious ideas out of running, I started to wonder about feasibility of it all.&lt;/p&gt;

&lt;p&gt;After a few more weeks of pondering, Googling and more crazy ideas (this included having multiple phone lines and bonding them to create one faster line), came the epiphany.&lt;/p&gt;

&lt;p&gt;Realising that I was able to watch full HD videos on my connection and my measly 1Mb upload was just about capable of Skype/WhatsApp/Facebook video calls, I should be able to ‘stream’/remote desktop to myself while video calling back.&lt;/p&gt;

&lt;p&gt;This would allow me to have the benefit of the bandwidth of where the PC was and be able to stay in the comfort of my own home for the broadcast!&lt;/p&gt;

&lt;p&gt;Cloud Gaming providers &lt;a href=&quot;https://en.wikipedia.org/wiki/OnLive&quot;&gt;OnLive&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Gaikai&quot;&gt;Gaikai&lt;/a&gt; have already proven this would work (with some latency) so the theory was sound, I just need to find a way to replicate this for games development environment.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/streaming-slow-internet/game-streaming-services.jpg&quot; /&gt;
    &lt;figcaption&gt;Remember these folks?&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Without the restriction of needing a private space for streaming, I was able to use the local co-working space and rent a corner for a headless PC for about the cost of a broadband connection.&lt;/p&gt;

&lt;p&gt;Now I had to work out what software setup was needed to actually make this work.&lt;/p&gt;

&lt;p&gt;Bear in mind that this was in 2016 so some of the solutions available today weren’t around back then (more on that later).&lt;/p&gt;

&lt;p&gt;I ran through all the mainstream remote desktop software that I could find and they all suffered from one or more of the following issues:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Not all keyboard shortcuts worked from my Mac client to the remote Windows host (e.g. Ctrl + Space to bring up intellisense wouldn’t work)&lt;/li&gt;
  &lt;li&gt;Costs money for a commercial license&lt;/li&gt;
  &lt;li&gt;The framerate was too low to do any realtime editing such as 3D modelling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, I found &lt;a href=&quot;https://www.nomachine.com/&quot;&gt;NoMachine&lt;/a&gt; which could capture the mouse and keyboard input completely, was free and supposedly fast enough to play games with.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/streaming-slow-internet/nomachine-gallery.jpg&quot; /&gt;
    &lt;figcaption&gt;NoMachine remote desktop&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The local LAN tests worked really well. I was surprised that I could play a First Person Shooter game like Counter Strike without too much trouble. Working in an IDE and the Unity3D editor remote was fantastic. There were some compression artifacts on full screen changes, but not enough to make unusable.&lt;/p&gt;

&lt;p&gt;However, as with anything, there was a catch.&lt;/p&gt;

&lt;p&gt;NoMachine required (and still does) a direct connection so for it to work across the internet, the host’s router needs port forwarding to be configured and the WAN IP address to Internet to be known.&lt;/p&gt;

&lt;p&gt;As I was renting space in a co-working office, configuring the router wasn’t an option.&lt;/p&gt;

&lt;p&gt;(This was starting to be a gift that keeps on giving… 😒)&lt;/p&gt;

&lt;p&gt;Knowing that I had to use NoMachine, I looked for to see if this was a solvable problem. This wasn’t something I’ve come across before and it took me a while to narrow down the search terms to find relevant results.&lt;/p&gt;

&lt;p&gt;Turns out that I needed the PC to ‘phone home’ in some way and setup a network tunnel (known as ‘reverse tunnelling’) or have a known server that both the client and host could connect to.&lt;/p&gt;

&lt;p&gt;Top of my list of services to try were:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://ngrok.com/&quot;&gt;ngrok&lt;/a&gt; - exposes a port on the local machine via an URL&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.vpn.net/&quot;&gt;Hamachi&lt;/a&gt; - Mesh VPN service&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/streaming-slow-internet/vpn-tunnels.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Both were free to use and easy to setup on Windows and MacOS. There were several others but they were primary geared towards Linux.&lt;/p&gt;

&lt;p&gt;While they both worked, unfortunately they shared the same problem. A server in the middle was used to route traffic through and for both services, it was located in the US.&lt;/p&gt;

&lt;p&gt;This led to large latency times that when typing, I would be a character or two behind which led to typos and having to mentally cater delayed visual feedback of what I was doing.&lt;/p&gt;

&lt;p&gt;On the bright side, this did lead me down the path that a local VPN service would work and luckily, my home ASUS router had this feature built in.&lt;/p&gt;

&lt;p&gt;Enabled the feature, created a few accounts (both the client and host had to connect) and amazingly, it was working as well as it could be with minimal latency.&lt;/p&gt;

&lt;p&gt;My home Internet connection didn’t have a static IP address but this was solved using a free dynamic service like &lt;a href=&quot;https://www.noip.com/&quot;&gt;noip.com&lt;/a&gt; that would continuously update the DNS of an URL to my IP address.&lt;/p&gt;

&lt;h2 id=&quot;-1&quot;&gt;🎉🎉🎉&lt;/h2&gt;

&lt;p&gt;Finally, there was some light at the end of the tunnel. I could now stream at full HD while being physically at home on a slow connection. How awesome was that? Even I was surprised by this!&lt;/p&gt;

&lt;p&gt;All that was left were some finishing touches to complete the streaming experience and some housekeeping for managing the remote PC.&lt;/p&gt;

&lt;p&gt;I used &lt;a href=&quot;https://www.skype.com/en/home/&quot;&gt;Skype&lt;/a&gt; to ‘forward’ my webcam and voice to the remote PC by calling myself. I’d set the account to auto accept calls from my primary account to streamline the setup process. The only fault would be that the video would occasionally drop but solved by a quick recall.&lt;/p&gt;

&lt;p&gt;For the first week or so, I would walk over to the co-working space to turn the PC before each stream. As you could imagine, I got bored of this pretty quickly and was looking for ways to be able to flip the switch remote.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/streaming-slow-internet/smart-button-2.gif&quot; /&gt;
    &lt;figcaption&gt;Yep, these exist!&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The search brought up products like &lt;a href=&quot;https://www.amazon.co.uk/MicroBot-Push-2nd-Generation-Automation/dp/B071V7Y864/&quot;&gt;smart home button pushers&lt;/a&gt; or home solutions such as using a Raspberry Pi as the switch itself to close the circuit via the GPIO pins.&lt;/p&gt;

&lt;p&gt;In the end, I enabled WakeOnLan on the PC and used an always on Raspberry Pi connected to the same network.    I logged into the Pi using SSH via VPN and used it to send a magic packet to wake the PC.&lt;/p&gt;

&lt;p&gt;Perfect!&lt;/p&gt;

&lt;h2 id=&quot;-2&quot;&gt;🎊&lt;/h2&gt;

&lt;p&gt;The final concern was from a security point of view. As the PC was going to be left in a hot desking, shared space, I was worried that someone could just simply pick up the PC and leave.&lt;/p&gt;

&lt;p&gt;As I didn’t want someone to easily game access to my home network, I didn’t store the home VPN credentials on the device.&lt;/p&gt;

&lt;p&gt;I ended up using Hamachi Mesh VPN for both the Pi and on startup of the PC. This allowed me to have an extra layer of security, so that if either the Pi or PC was stolen, I could just remove the accounts that they use from the VPN group.&lt;/p&gt;

&lt;p&gt;Once the PC was started, I could then remote in and connect to the home VPN for better latency. It’s an extra step during the stream startup process but the peace of mind is worth it.&lt;/p&gt;

&lt;p&gt;And finally, I was done! I had a setup where I could stream and manage the PC remotely and even better, no one was the wiser when viewing the stream.&lt;/p&gt;

&lt;p&gt;These days, it is now a lot easier to create a similar setup. &lt;a href=&quot;https://parsecgaming.com/&quot;&gt;Parsec&lt;/a&gt; now provides a similar remote desktop experience to NoMachine but doesn’t need a direct connection so the home VPN setup is no longer needed and reduces the complexity.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/streaming-slow-internet/parsecgaming.jpg&quot; /&gt;
    &lt;figcaption&gt;&quot;Simple, low-latency game streaming&quot; that also does desktop applications!&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The two major downsides are that it doesn’t capture the keyboard input completely but it comes close enough that I’m now using it over NoMachine when possible.&lt;/p&gt;

&lt;p&gt;The second is that it isn’t installed as a service unlike TeamViewer or NoMachine. This means that unless it is running on an account that it is logged in, the PC is not accessible.&lt;/p&gt;

&lt;p&gt;On top of this, you can now rent a &lt;a href=&quot;https://www.paperspace.com/gaming&quot;&gt;decent spec gaming PC in the cloud&lt;/a&gt; to remote desktop into which would have solved my need for the co-working space.&lt;/p&gt;

&lt;p&gt;Thankfully, I have since moved house to somewhere that has a much faster connection that I wouldn’t have to go through this again if I took up streaming again.&lt;/p&gt;

&lt;p&gt;So as happy as I was to persevere and find a solution to all of this, I’m much happier knowing that I can now just stream at flip of a switch 😁.&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">I previously wrote an article series about my game development live streaming adventures but omitted my first hurdle in starting.</summary></entry><entry><title type="html">Learnings from streaming Games Development on Twitch.tv</title><link href="https://stevenyau.co.uk/blog/2017/03/17/twitch-experience-pt-3.html" rel="alternate" type="text/html" title="Learnings from streaming Games Development on Twitch.tv" /><published>2017-03-17T21:38:45+00:00</published><updated>2017-03-17T21:38:45+00:00</updated><id>https://stevenyau.co.uk/blog/2017/03/17/twitch-experience-pt-3</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2017/03/17/twitch-experience-pt-3.html">&lt;h3 id=&quot;preface&quot;&gt;Preface&lt;/h3&gt;

&lt;p&gt;Between May and July 2016, I was live streaming games development on Twitch to see if it was possible to generate enough revenue to sustain continuous game development.&lt;/p&gt;

&lt;p&gt;I wanted to break out of the hit driven loop of games development and reduce the financial risk which traditionally came with it. This post is talks more about my thinkings, research and the outcome of this experiment.&lt;/p&gt;

&lt;p&gt;If you want to know more about the actual hardware and software stream setup, check out my previous posts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2016/08/24/twitch-experience-pt-1.html&quot;&gt;Part 1 (Hardware)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2016/12/16/twitch-experience-pt-2.html&quot;&gt;Part 2 (Sofware)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Part 3 (Learnings) - This article&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/stream_overlay.jpg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;I’ve been working in games for almost 10 years now, developing AAA games, slot machines, Facebook and free to play (F2P). It got to the point where I was burning myself out professionally working for large companies, getting agitated with procedures and decisions that I couldn’t change and really needed a break from it all.&lt;/p&gt;

&lt;p&gt;Once my project was finished at King, I handed in my notice and started to really think about a question that has been on my mind for some time: What’s after F2P?&lt;/p&gt;

&lt;p&gt;It’s not that I think F2P as a concept is bad as a whole, it’s more that the majority of implementations have treated the player experience more like retail rather than games.&lt;/p&gt;

&lt;p&gt;A typical F2P game is usually crafted and implemented towards encouraging the player to buy items, usually to help progression and/or remove waiting time. I.e to remove friction. Developers try to leverage any opportunity to encourage users to convert ‘free’ users into buying something. Research is shown that once they have made that initially purchase, they are more likely to continue spending in the future.&lt;/p&gt;

&lt;p&gt;This is done to compensate the game being free and as a result, only 1.9% of users spending real money, averaging $24.66 per month according to &lt;a href=&quot;https://www.swrve.com/images/uploads/whitepapers/swrve-monetization-report-2016.pdf&quot;&gt;Swrve’s Mobile Monetisation 2016 Report&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.gamesindustry.biz/articles/2017-01-04-super-mario-run-generates-usd30m-in-two-weeks-newzoo&quot;&gt;Nintendo only saw a 3% conversion rate from free to paid in Super Mario Run over the first 2 weeks of launch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mobile users now have an expectation that apps (especially games) should be free which makes it difficult to not consider F2P in some form or risk losing potential revenue and users.&lt;/p&gt;

&lt;p&gt;I wanted to find out if there was another way for games to generate revenue and also retain the low barrier to entry of F2P.&lt;/p&gt;

&lt;h3 id=&quot;thinking-outside-the-box&quot;&gt;Thinking outside the Box&lt;/h3&gt;

&lt;p&gt;Games development is ultimately a debt first process. They take time and/or money to create and until they reach a playable, presentable state, crowd funding, early access and publishers are not an option.&lt;/p&gt;

&lt;p&gt;It’s not even guaranteed that the game will earn back the cost of development. In a lot of ways, it’s a gamble and there are only so many bets that can be made before running out of time and money.&lt;/p&gt;

&lt;p&gt;A lot of the work in running an independent games studio is managing these bets and keeping a consistent cash flow. Companies such as &lt;a href=&quot;http://www.wired.co.uk/article/how-rovio-made-angry-birds-a-winner&quot;&gt;Rovio&lt;/a&gt;, &lt;a href=&quot;http://www.gdcvault.com/play/1022955/Getting-to-Greenlight-Designing-a&quot;&gt;King&lt;/a&gt;, &lt;a href=&quot;http://venturebeat.com/2015/02/02/how-space-ape-aims-to-become-one-of-the-big-hairy-brutes-of-mobile-gaming-interview/&quot;&gt;Space Ape&lt;/a&gt;, &lt;a href=&quot;http://www.wired.co.uk/article/ilkka-paananen-interview&quot;&gt;Supercell&lt;/a&gt; and &lt;a href=&quot;http://felixonline.co.uk/issuearchive/issue/1469/download/&quot;&gt;Introversion&lt;/a&gt; all have stories on how managing cashflow and new titles.&lt;/p&gt;

&lt;p&gt;While I was brainstorming what I could do to minimise or mitigate the risk, Twitch.tv have started to focus on live streaming non-games such as cooking, art, music and more relevantly, games development and programming.&lt;/p&gt;

&lt;p&gt;I knew that games streamers has become very popular with a quite a few making significant money much in the same way YouTubers have. However at the time, I couldn’t imagine watching people developing games live has the same appeal.&lt;/p&gt;

&lt;p&gt;Yet it looked like it be an interesting way to solve the debt first issue mentioned above. What if the development process could be used to provide entrainment value and viewers could donate and/or subscribe to the channel?&lt;/p&gt;

&lt;h3 id=&quot;doing-the-research&quot;&gt;Doing the Research&lt;/h3&gt;

&lt;p&gt;The possibility was enough to investigate further on what was possible and look into the current state of streaming games development.&lt;/p&gt;

&lt;p&gt;Prior to Twitch, &lt;a href=&quot;https://www.liveedu.tv/&quot;&gt;LiveCoding.tv (now LiveEdu.tv)&lt;/a&gt; started in 2014 and positioned themselves as dedicated site for people to stream themselves coding. I remember visiting the site  around the time it first started and not really understanding the point.&lt;/p&gt;

&lt;p&gt;At the time, there was no revenue stream available beyond donations and the number of viewers was very low.&lt;/p&gt;

&lt;p&gt;Fast forward to March 2016 when I started following a few streams on Twitch, some of the more popular game development streamers on Twitch average between 50-100 viewers per stream. Still relatively small in streamer terms (at time of writing &lt;a href=&quot;https://www.twitch.tv/imaqtpie&quot;&gt;imaqtpie&lt;/a&gt; has over 18,000 viewers on his stream) but encouraging as at time of writing, those streams have increased their average viewer count to 100-200.&lt;/p&gt;

&lt;p&gt;The number of streamers in game development was and still is very low compared to the games section. This meant that even if someone started now, the potential of being noticed by potential viewers is still high.&lt;/p&gt;

&lt;p&gt;What really surprised me was the viewers ‘paying’ for content. During one of HardlyDifficult’s streams, he managed to receive between $100-200 in donations during a 2GB upload to a git repo.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/hardlydifficult_twitch.jpg&quot; /&gt;
    &lt;figcaption&gt;HardlyDifficult Twitch stream&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;At the time, I couldn’t understand why viewers were donating to watch someone watch a loading bar. It just didn’t make any sense.&lt;/p&gt;

&lt;p&gt;One donation managed to trigger a series of others wanting to join in, regardless of what was happening on stream and just left bewildered and hopeful at the same time.&lt;/p&gt;

&lt;p&gt;If viewers were willing to part with money for a git upload, then what would happen when there is actual work being done?&lt;/p&gt;

&lt;p&gt;What I naively didn’t realise at the time and only a lot later in my own experience, those donations are ‘thanks’ for value of the stream so far. It usually has little to do with with the content that is being shown at the time of the donation.&lt;/p&gt;

&lt;p&gt;There are also more revenue streams available beyond donations including subscriptions and ad revenue share. Twitch also continue to look for more ways viewers can support their favourite streamers. The most recent being &lt;a href=&quot;https://blog.twitch.tv/introducing-cheering-celebrate-together-da62af41fac6&quot;&gt;‘Cheering’, donations using Twitch’s virtual currency of ‘Bits’&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/twitch_cheering.gif&quot; /&gt;
    &lt;figcaption&gt;Twitch Cheering&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The caveat is that these revenue streams are only available to &lt;a href=&quot;https://www.twitch.tv/p/partners&quot;&gt;Twitch Partners&lt;/a&gt; where the &lt;a href=&quot;https://www.twitch.tv/partner/signup&quot;&gt;criteria to become one is rather vague&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The key criteria listed is to have an established and growing audience. How big and how fast seems to be judged on a case by case basis. Although from what I have seen, all the live game development streams that become partnered consistently have 50+ viewers.&lt;/p&gt;

&lt;p&gt;Coincidentally, a friend of mine (&lt;a href=&quot;https://twitter.com/DGoodayle&quot;&gt;Danny Goodayle&lt;/a&gt; from &lt;a href=&quot;http://www.justapixel.co.uk/&quot;&gt;Just a Pixel Studios&lt;/a&gt;) was also looking to stream development of his game on Twitch for motivation to finish something.&lt;/p&gt;

&lt;p&gt;As I wasn’t in a position to start my own stream just yet so this gave me a great opportunity to observe how his channel world fare over time.&lt;/p&gt;

&lt;h3 id=&quot;watching-dannys-stream&quot;&gt;Watching Danny’s stream&lt;/h3&gt;

&lt;p&gt;Danny was fed up of starting small projects but never really finishing them. To help him break out of this, he set himself a 30 day challenge to create a playable version of his game that could be submitted to a &lt;a href=&quot;https://steamcommunity.com/greenlight/&quot;&gt;Steam Greenlight&lt;/a&gt; like process to help further fund the development.&lt;/p&gt;

&lt;p&gt;Around the end of the first week, one of his friends suggested to start a &lt;a href=&quot;https://www.twitch.tv/dgoodayle&quot;&gt;Twitch channel&lt;/a&gt; to help with keeping him on track as well as help with motivation.&lt;/p&gt;

&lt;p&gt;He set a schedule to stream every weekday from 9am-5pm (a full working day) and as with any channel, it only started off with a few viewers looking for different content to watch. Over the 30 day period, this grew to between 30-50 concurrent viewers during each stream.&lt;/p&gt;

&lt;p&gt;The game itself looked visually interesting and the genre choice of survival was popular niche. While a lot of the growth was organic within Twitch, there were several factors that helped viewers return to the channel on an almost daily basis:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Advanced features that are interesting to learn more about such as procedural level generation and networking&lt;/li&gt;
  &lt;li&gt;Speed of feature implementation&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://imgur.com/user/dgoodayle/&quot;&gt;Viral images posted on imgur&lt;/a&gt; to drive traffic to the channel&lt;/li&gt;
  &lt;li&gt;Deadline countdown timer on stream overlay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last factor was one of the most important as it provided a ‘story’ to the experience and helped build anticipation towards the end product. The viewer count increased at a higher rate as he got closer and closer towards the deadline and consequently, decreased in streams after the deadline had passed.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/story_of_a_nomad.jpg&quot; /&gt;
    &lt;figcaption&gt;Story of a Nomad&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;making-plan&quot;&gt;Making Plan&lt;/h3&gt;

&lt;p&gt;I set myself a timeframe of 3 months, both to complete a game and to see if live streaming games developing would be worth pursuing further.&lt;/p&gt;

&lt;p&gt;Running on the popularity of ‘&lt;a href=&quot;http://kotaku.com/for-its-three-year-anniversary-twitch-plays-pokemon-ge-1792295552&quot;&gt;Twitch Plays Pokemon&lt;/a&gt;’ and the &lt;a href=&quot;https://blog.twitch.tv/announcing-the-twitch-plays-game-category-55149935ad79&quot;&gt;support by Twitch themselves&lt;/a&gt;, I decided to create a Twitch Plays only game to capitalise on the popularity and for a potential angle to build a relationship for support or promotion with Twitch.&lt;/p&gt;

&lt;p&gt;To make it different from the traditional s where the viewers are voting for a single player input in an existing game, I wanted to create a new game where every viewer has control of their own avatar.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/chatwars_promo.gif&quot; /&gt;
    &lt;figcaption&gt;Chat Wars&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Taking the basic concept of &lt;a href=&quot;https://en.wikipedia.org/wiki/Risk_(game)&quot;&gt;Risk board game&lt;/a&gt; and &lt;a href=&quot;http://www.gamedesign.jp/flash/dice/dice.html&quot;&gt;Dice Wars&lt;/a&gt; where players move to occupy territory, I adapted it to work with the Twitch chat system so all players could move freely in the map during each round.&lt;/p&gt;

&lt;p&gt;The team with the most players on the each area at the end of the round gains control of the island and the game winner is team with the most islands at the end.&lt;/p&gt;

&lt;div class=&quot;iframe-container&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/ZNfDxFJGJo0&quot; frameborder=&quot;0&quot; allow=&quot;encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;I was also looking at popular YouTubers such as &lt;a href=&quot;https://www.youtube.com/user/caseyneistat&quot;&gt;Casey Neistat&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/user/LinusTechTips&quot;&gt;LinusTechTips&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/user/duncan33303&quot;&gt;Austin Evans&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/user/devingraham&quot;&gt;Devin Graham&lt;/a&gt; to see how they sustain themselves outside of the YouTube revenue.&lt;/p&gt;

&lt;p&gt;To help build trust with their viewers, LinusTechTips had uploaded a &lt;a href=&quot;https://www.youtube.com/watch?v=t73wXF8IF-8&quot;&gt;video that breaks down how they make money&lt;/a&gt; from their videos. These include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Amazon affiliate links&lt;/li&gt;
  &lt;li&gt;Project sponsors&lt;/li&gt;
  &lt;li&gt;Pre-roll ads in the videos (both technology and non-technology related)&lt;/li&gt;
  &lt;li&gt;Event coverage&lt;/li&gt;
  &lt;li&gt;Branded merchandise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While sponsorship was common on games streams, I haven’t yet seen one for a development stream yet. I assume either the streamers hadn’t yet attempted to approach potential sponsors or that the viewership was too small for them to consider.&lt;/p&gt;

&lt;p&gt;That said, it was something I wanted to attempt as it could really help provide a stable increase in the revenue with the right sponsors.&lt;/p&gt;

&lt;p&gt;TL;DR, my plan was:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Build an audience developing a s game&lt;/li&gt;
  &lt;li&gt;Attempt to get in touch with Twitch to pitch them my game&lt;/li&gt;
  &lt;li&gt;Approach potential sponsors&lt;/li&gt;
  &lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;so-how-did-it-go&quot;&gt;So, how did it go?&lt;/h3&gt;

&lt;p&gt;The whole experience was an incredible amount of fun but unfortunately didn’t go according to plan. I did manage to complete the game by the deadline and it was released to the world but didn’t meet the rest of my other targets:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Averaged 10 unique viewers per stream&lt;/li&gt;
  &lt;li&gt;0 sponsors&lt;/li&gt;
  &lt;li&gt;2 concurrent users playing the game when released&lt;/li&gt;
  &lt;li&gt;Donations £17 (GermGamesTV: £10.00, &lt;a href=&quot;https://www.twitch.tv/ericmuir123&quot;&gt;ericmuir123&lt;/a&gt;: £5.00, &lt;a href=&quot;https://www.twitch.tv/thatrainman&quot;&gt;ThatRainMan&lt;/a&gt;: £1.00, &lt;a href=&quot;https://www.twitch.tv/portrawr&quot;&gt;Portrawr&lt;/a&gt;: £1.00)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.wasdkeyboards.com/index.php/products/code-keyboard/code-87-key-mechanical-keyboard-1621.html&quot;&gt;WASD Code Keyboard&lt;/a&gt; donation from &lt;a href=&quot;https://www.twitch.tv/xforcep&quot;&gt;XForceP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see, the numbers didn’t show that this was sustainable for the long run in terms of making a reasonable living.&lt;/p&gt;

&lt;p&gt;Here are some of the observations I made:&lt;/p&gt;

&lt;h4 id=&quot;making-a-twitch-plays-only-game&quot;&gt;Making a Twitch Plays only game&lt;/h4&gt;

&lt;p&gt;I got so wrapped up in the positive press from Twitch about s and the popularity from ‘s Pokemon’, I made the classic mistake of not checking if I have a player base.&lt;/p&gt;

&lt;p&gt;About halfway to three quarters way into the project, I decided to check out the &lt;a href=&quot;https://www.twitch.tv/directory/game/Twitch%20Plays&quot;&gt;Twitch Plays Channel&lt;/a&gt;. It turns out there are only 300 or so players and 90% of them are playing the Pokemon stream.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/twitch_plays_section.jpg&quot; /&gt;
    &lt;figcaption&gt;Twitch Plays Section&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This meant that there was a very low possibility that viewers would even see the game let alone play but as I was so far into the project, I couldn’t really stop as my current viewers were vested in the progression of the development already.&lt;/p&gt;

&lt;p&gt;As the game could only be played via a Twitch stream, I couldn’t sell it either or have a WIP build for viewers to play. The latter was huge blow for me as it’s very hard to become interested in something you can only see the development of but can’t play yourself.&lt;/p&gt;

&lt;p&gt;Additional revenue could potentially be gained by selling advertising space in the game stream but as you can see from the numbers above, the number of players never reached point where I could approach companies.&lt;/p&gt;

&lt;h4 id=&quot;streaming-everyday-increases-your-chance-of-viewership&quot;&gt;Streaming everyday increases your chance of viewership&lt;/h4&gt;

&lt;p&gt;I underestimated the importance of streaming every day. My streaming schedule was 3-4 times a week for 6 hours I don’t think that was enough.&lt;/p&gt;

&lt;p&gt;If I kept a Mon-Fri schedule (potentially for less hours), the channel would be more likely to be picked up by new viewers if they knew it was going to be back the next day. I had a public streaming calendar but that’s an extra click away. The expectation from viewers is that streamers are there every day.&lt;/p&gt;

&lt;h4 id=&quot;building-a-story-for-the-channel&quot;&gt;Building a ‘story’ for the channel&lt;/h4&gt;

&lt;p&gt;Unlike Danny’s stream, I had no public ‘story’ or theme to my channel for my viewers to emotionally invest in. Danny always made it quite clear that he wanted to force to make and release something by setting an arbitrary time limit.&lt;/p&gt;

&lt;p&gt;I really should really have made my aims more transparent and open up part of my personal life to help build that connection.&lt;/p&gt;

&lt;h4 id=&quot;viewers-want-to-contribute-to-the-game&quot;&gt;Viewers want to contribute to the game&lt;/h4&gt;

&lt;p&gt;Some of the more popular streams such as &lt;a href=&quot;https://www.twitch.tv/hardlydifficult&quot;&gt;HardlyDifficult&lt;/a&gt; and &lt;a href=&quot;https://www.twitch.tv/robtheswan&quot;&gt;RobTheSwan&lt;/a&gt; expressed that their viewers could contribute to the game in terms of art, game mods, testing, server hosting or even code.&lt;/p&gt;

&lt;p&gt;One of my regular viewers, &lt;a href=&quot;https://www.twitch.tv/zalosath&quot;&gt;Zalosath&lt;/a&gt; offered to help out with creating some of the sprites being used in the game which saved me quite a bit of time,&lt;/p&gt;

&lt;h4 id=&quot;the-chat-is-generally-self-sufficient&quot;&gt;The chat is generally self sufficient&lt;/h4&gt;

&lt;p&gt;Unlike games streaming where there are natural breaks between rounds, it isn’t with development. Generally you are always working or thinking about something so it’s really hard to engage with the viewers on chat without breaking chain of thought.&lt;/p&gt;

&lt;p&gt;Usually the viewers do a good job of managing themselves but occasionally you will get a new viewer that wants to know more about the project. At that point, it is worth stopping to answer them as the first impression is going to be the most memorable.&lt;/p&gt;

&lt;h4 id=&quot;streaming-takes-up-more-energy-then-you-think&quot;&gt;Streaming takes up more energy then you think&lt;/h4&gt;

&lt;p&gt;When I first started, I attempted to do a full working day’s worth of hours streaming (about 8). After doing this for a week, I realised this was too much as at work, you will take physical and mental breaks.&lt;/p&gt;

&lt;p&gt;When streaming, I was fully focused on the work and that took a toll on me mentally. I found myself much more fatigued than expected, more so than after a day of work. Additionally, I didn’t factor the time needed outside of the stream to maintain Twitter, tweaking the overlay, etc so I was working 10 hours days for the first couple of weeks.&lt;/p&gt;

&lt;p&gt;I almost instantly dropped the number of hours to something much more manageable and made sure that I took regular breaks during the session using &lt;a href=&quot;http://elenzil.com/progs/breaktimer/index.html&quot;&gt;Programmer’s Break Timer&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;what-would-i-change-if-i-did-this-again&quot;&gt;What would I change if I did this again?&lt;/h3&gt;

&lt;p&gt;Even though it was almost a year ago since I stopped, I always kept thinking about what would I have done differently if I consider game development streaming again.&lt;/p&gt;

&lt;h4 id=&quot;develop-a-game-that-i-could-sell&quot;&gt;Develop a game that I could sell&lt;/h4&gt;

&lt;p&gt;This is the big one. Now knowing that the stream itself wouldn’t  generate as much revenue as I had hoped for before, I would now work on a game that I could either sell, contain IAPs or even was ad supported.&lt;/p&gt;

&lt;p&gt;Having more potential revenue streams is always desirable and also creating a packaged product would give me a potential long tail.&lt;/p&gt;

&lt;h4 id=&quot;have-the-build-available-to-be-played-by-viewers&quot;&gt;Have the build available to be played by viewers&lt;/h4&gt;

&lt;p&gt;Similar to the point above, having a version of the game available to play by the viewers would help increase engagement and also give me quicker feedback loops.&lt;/p&gt;

&lt;p&gt;Initially I was planning to use a Continuous Integration system such as &lt;a href=&quot;https://jenkins.io/&quot;&gt;Jenkins&lt;/a&gt; to make regular builds available for downloads or make accessible to paid viewers only.&lt;/p&gt;

&lt;p&gt;However, since my last job at &lt;a href=&quot;https://playcanvas.com/&quot;&gt;PlayCanvas&lt;/a&gt;, I’ve been impressed in the performance of HTML5 applications/games and also the accessibility it can provide.&lt;/p&gt;

&lt;p&gt;Any game I develop for HTML5 could be played through virtually any browser on any device and on any OS. Viewers wouldn’t have to go through the friction of downloading and installing the game, it would just be available via a URL link.&lt;/p&gt;

&lt;p&gt;With that in mind, my next game is likely to done with HTML5 as even if I didn’t want to make it a browser game, it can still be packaged as a standalone app with &lt;a href=&quot;https://electron.atom.io/&quot;&gt;Electron&lt;/a&gt; and &lt;a href=&quot;https://cocoon.io/&quot;&gt;Cocoon.io&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;develop-less-on-screen&quot;&gt;Develop less ‘on screen’&lt;/h4&gt;

&lt;p&gt;This is a bit controversial as ideally, you would stream for as long as possible. Realistically, it’s very difficult to always be engaging with the viewers when trying to do deal with a difficult task and visa versa.&lt;/p&gt;

&lt;p&gt;Two ways I can think of to tackle this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Stream frequently but for less time (e.g 3 hours). Use other social channels like Twitter, Discord, SnapChat etc to provide intermittent updates during the rest of the day.&lt;/li&gt;
  &lt;li&gt;Stream the same hours but put aside some hours of the day as ‘quiet time’ where the focus is on the work and not the viewers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these would allow me to have time to myself to really focus on being productive and then I could use the time with the viewers to focus on design and/or more visual elements of the game.&lt;/p&gt;

&lt;h4 id=&quot;make-my-business-plans-more-transparent-to-the-viewers&quot;&gt;Make my (business) plans more transparent to the viewers&lt;/h4&gt;

&lt;p&gt;Ideally, I would like to make my thoughts and plans as transparent as possible. There’s always interest in blogs like &lt;a href=&quot;http://devmidgard.com/&quot;&gt;devMidgard’s &lt;/a&gt; and &lt;a href=&quot;https://www.truevalhalla.com/blog&quot;&gt;TrueValhalla’s&lt;/a&gt; where they break down their earnings each month and how they intend to move forward with their plans.&lt;/p&gt;

&lt;p&gt;It’s rare to get this information but it’s incredibly useful to know from an independent/company owner perspective. Similar to how the &lt;a href=&quot;https://www.youtube.com/watch?v=t73wXF8IF-8&quot;&gt;video from LinusTechTips&lt;/a&gt; that I linked earlier is useful to anyone thinking on creating their own YouTube channel.&lt;/p&gt;

&lt;h3 id=&quot;ending-note&quot;&gt;Ending note&lt;/h3&gt;

&lt;p&gt;If you managed to read this far, thank you! I hope this has given a bit of an insight on streamer’s side of Twitch and if you considering doing something like this yourself, save you from making the same mistakes I did.&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">Preface</summary></entry><entry><title type="html">My Twitch experience as a Live Games Developer — Part 2: Software Setup</title><link href="https://stevenyau.co.uk/blog/2016/12/16/twitch-experience-pt-2.html" rel="alternate" type="text/html" title="My Twitch experience as a Live Games Developer — Part 2: Software Setup" /><published>2016-12-16T10:38:45+00:00</published><updated>2016-12-16T10:38:45+00:00</updated><id>https://stevenyau.co.uk/blog/2016/12/16/twitch-experience-pt-2</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2016/12/16/twitch-experience-pt-2.html">&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;During the summer, I wanted to experiment with live streaming games development to see if it could become a workable career path in the same way as live streaming playing games has become over the past few years.&lt;/p&gt;

&lt;p&gt;On paper, it shouldn’t really work. Watching someone write code for hours at a time isn’t exactly the most exciting of prospects for a viewer and yet before I started this, some of the top game dev streamers on Twitch were averaging 50-100 concurrent viewers.&lt;/p&gt;

&lt;p&gt;This wasn’t huge by any means but was promising as most of the viewers were engaged with the streamer or with the rest of chat. This contrasted the game playing streams with thousands of viewers who lurk or fill chat with emotes.&lt;/p&gt;

&lt;p&gt;I wanted to see if it was possible to create a games development Twitch stream with enough viewers to generate a big enough revenue to become a full time job. Inspiration came from the &lt;a href=&quot;https://www.youtube.com/watch?v=AdXvZgIV1Q0&amp;amp;list=PLIhLvue17Sd7F6pU2ByRRb0igiI-WKk3D&quot;&gt;Double Fine Adventure documentary series&lt;/a&gt; where the company created revenue documenting how they developed the game, which would normally be the byproduct of games development.&lt;/p&gt;

&lt;p&gt;You can find my profile on &lt;a href=&quot;https://www.twitch.tv/yaustar&quot;&gt;Twitch&lt;/a&gt;, past broadcasts on &lt;a href=&quot;https://www.youtube.com/playlist?list=PLKj94Cw_aI_V9VQ40uV_AZYk_vjTk4EH0&quot;&gt;YouTube&lt;/a&gt; and &lt;a href=&quot;http://bit.ly/2aONT2f&quot;&gt;stream highlights&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Over the next month or so, I will be writing about the whole period over a series of posts covering different areas. These will include the hardware setup, the software/services used and my experience of being a live streamer alongside what I would change.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2016/08/24/twitch-experience-pt-1.html&quot;&gt;Part 1 (Hardware)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Part 2 (Software) - This article&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2017/03/17/twitch-experience-pt-3.html&quot;&gt;Part 3 (Learnings)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;screen-capture&quot;&gt;Screen Capture&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://obsproject.com/&quot;&gt;Open Broadcaster Software (OBS)&lt;/a&gt; is the default choice for anyone new to streaming or even to screen capture. It’s well supported, mature, extendable via plugins and completely free.&lt;/p&gt;

&lt;p&gt;Usability is a bit rough around the edges but is more then enough for someone to get started with. The popularity of the tool also means that there are plenty of guides and help on Internet if you run into problems.&lt;/p&gt;

&lt;p&gt;OBS now has two versions, OBS Classic (Windows only) and OBS Studio (cross platform).&lt;/p&gt;

&lt;p&gt;OBS Studio development is still in progress as it has been rewritten from the ground up to enable further development of features and more importantly, multi-platform support.&lt;/p&gt;

&lt;p&gt;I personally used OBS Classic as there was a specific plugin that I wanted to use (more on that later) as there wasn’t a feature advantage at the the time.&lt;/p&gt;

&lt;p&gt;Some streamers have favoured &lt;a href=&quot;https://www.xsplit.com/&quot;&gt;XSplit&lt;/a&gt; over OBS for usability and they offer &lt;a href=&quot;https://www.xsplit.com/buy?pp=WWW_NAVBAR&quot;&gt;different subscriptions tiers for features&lt;/a&gt;, ranging from free to $4.17 a month at time of writing.&lt;/p&gt;

&lt;h4 id=&quot;obs-settings&quot;&gt;OBS settings&lt;/h4&gt;

&lt;p&gt;I use the following settings for OBS:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Base resolution at 1440 x 900 (16:10) at 30fps with no down scaling&lt;/li&gt;
  &lt;li&gt;QuickSync Encoder at default settings&lt;/li&gt;
  &lt;li&gt;Bitrate 1800 kb/s&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img alt=&quot;OBS Settings&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/obs_settings.jpg&quot; /&gt;
    &lt;figcaption&gt;OBS Settings&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The alternative setup is to use the H.264 software encoder reportedly can produce &lt;a href=&quot;https://obsproject.com/forum/threads/gtx-970-nvenc-quick-sync-bitrates-x264-and-more-probably.35251/&quot;&gt;same or better quality encoding at lower bitrates&lt;/a&gt; then either QuickSync or Nvidia NVENC at the cost of CPU usage. Ideally you need a hefty CPU like an Intel i7 or use a second dedicated PC purely for encoding.&lt;/p&gt;

&lt;h4 id=&quot;plugins&quot;&gt;Plugins&lt;/h4&gt;

&lt;p&gt;There are two plugins that I used throughout all my streams, &lt;a href=&quot;https://obsproject.com/forum/resources/clr-browser-source-plugin-obs-classic-only.22/&quot;&gt;CLR Browser plugin&lt;/a&gt; and &lt;a href=&quot;http://www.obsremote.com/&quot;&gt;OBS Remote&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;CLR Browser is incredibly powerful as it allows you to place a browser window any where on your stream which opens up accessibility to use any web page including ones that are self developed.&lt;/p&gt;

&lt;p&gt;In my case, I couldn’t find a simple clock plugin to show the local time. Using basic Javascript and HTML, I quickly put together a webpage which displayed the time using Javascript and used the CLR Browser to overlay it on the stream.&lt;/p&gt;

&lt;h4 id=&quot;overlaycomposition&quot;&gt;Overlay/Composition&lt;/h4&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Stream Overlay&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/stream_overlay.jpg&quot; /&gt;
    &lt;figcaption&gt;OStream Overlay&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I ended up spending too much time on overcomplicated overlay for my stream. The original idea was to keep new viewers on the stream long enough to find something of interest that they could engage in rather then channel jump to another stream.&lt;/p&gt;

&lt;p&gt;My attempt was a scrolling ticker of RSS feeds that pulled headlines from related news sites such as Wired, GamesIndustry.biz and Gamasutra. I was hoping that during a quiet period in the stream such as when I was working through a problem, that the viewers would be able to pass some of the time reading the headlines. The idea was taken from the tickers on news programmes where they display general information over top of the current news story.&lt;/p&gt;

&lt;p&gt;Unfortunately, I have had mixed feedback on it. A couple of viewers said that they found it interesting and others say it was a little distracting to the main content. I’m still on the fence about this as I do need something to keep the audience engaged while I’m in deep thought and currently thinking of other solutions.&lt;/p&gt;

&lt;p&gt;Over time and from watching other streamers, I found that all I really needed was desktop capture, a face cam and chat on screen.&lt;/p&gt;

&lt;p&gt;The actual content matters more and is something I completely overlooked when I prepared the channel. The time I spent creating the overlay should have been spent on preparing and creating great content.&lt;/p&gt;

&lt;h4 id=&quot;clock&quot;&gt;Clock&lt;/h4&gt;

&lt;p&gt;The clock was a late addition to the overlay as I often was asked my local time. It was easier to say when I would be back from breaks as I could give a time rather than saying, ‘Be back in 10’.&lt;/p&gt;

&lt;p&gt;As mentioned above in the overlay section, the clock is within Javascript code as a web page.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;startTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;today&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;today&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getHours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;today&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getMinutes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;today&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;checkTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;checkTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;checkTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt; 
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#FFF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      
      &lt;span class=&quot;nt&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; 
        &lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;44px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tahoma&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sans-serif&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;bold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt; 
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;onload=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;startTime()&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;txt&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;clock&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;donationrecent-followers-ticker&quot;&gt;Donation/Recent Followers Ticker&lt;/h4&gt;

&lt;p&gt;At the bottom of my overlay, I have scrolling text that shows my top donations, recent donations, recent followers and a custom message.&lt;/p&gt;

&lt;p&gt;I was using &lt;a href=&quot;http://u.muxy.io&quot;&gt;Muxy&lt;/a&gt; as an all in one service that covered analytics, donations/tips page and on-stream alerts for follows, donations, etc.&lt;/p&gt;

&lt;p&gt;(Twitch have added &lt;a href=&quot;https://help.twitch.tv/customer/portal/articles/2449458&quot;&gt;‘Cheering’ which allows users to donate ‘bits’&lt;/a&gt; since I last streamed which Muxy does not have an on-stream alert yet).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://u.muxy.io/dashboard/ticker&quot;&gt;Muxy has a program that can be generate text files&lt;/a&gt; with different groups of information such as Follower Count, Top Tippers, All Tippers etc. These can  be overlaid in the stream via a Text Source on OBS very easily.&lt;/p&gt;

&lt;p&gt;As I wanted a single line of scrolling text, I had to write a Python program that took the contents of text files I wanted to use and copied it to a single line in a new text file. Once I had that, I could then use the file as a scrolling Text Source on the overlay in OBS.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;muxy_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;C:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;TwitchFolder&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Muxy&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;root_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;C:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;TwitchFolder&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;total_donations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;muxy_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;total_donation_amount.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_donations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; | &quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;total_donations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;all_time_donators&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;muxy_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;all_time_top_cumulative_donors.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;all_time_donators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; | &quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;all_time_donators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;recent_donations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;muxy_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;recent_donators.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;recent_donations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; | &quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;recent_donations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;recent_follows&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;muxy_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;recent_followers.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;recent_follows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; | &quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;recent_follows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;special_mentions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;root_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;special_mentions.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;special_mentions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; | &quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;special_mentions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;ticker&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;MuxyTicker.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'w'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ticker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ticker_string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;screen-size&quot;&gt;Screen Size&lt;/h3&gt;
&lt;p&gt;Typically on Twitch, 1080p (30fps) and 720p (30fps) are the most common resolutions and framerates that are used as they are the most common monitor resolutions and console output. This is also due to limitations with residential broadband upload speeds for the streamer and download speeds for the viewer.&lt;/p&gt;

&lt;p&gt;Sometimes streamers will drop the resolution to 720p when they do have bandwidth to cope to increase the framerate to 60fps for a smoother viewing experience.&lt;/p&gt;

&lt;p&gt;I bucked the trend to use an unorthodox resolution of 1440 x 900 which is an unusual screen resolution since there is no monitor with this resolution.&lt;/p&gt;

&lt;p&gt;I was considering I was watching game development streams and after talking to a few other viewers, most would put the stream on a second screen with the chat open while working on their own work.&lt;/p&gt;

&lt;p&gt;Given the most common screen size is 1080p (although 1440p and 4K is becoming increasingly popular), after taking the chat and window toolbar into account, there isn’t a lot of screen estate left for the stream itself.&lt;/p&gt;

&lt;p&gt;Since no-one would be watching the stream full screen, it seemed to be a waste to stream at 1080p 16:9 resolution so I started experimenting with different resolutions and aspect ratios.&lt;/p&gt;

&lt;p&gt;I found that the 16:10 aspect ratio filled the screen space best and a 1440x900 resolution was low enough that there wouldn’t be too much scaling and I large enough for me to comfortably work in.&lt;/p&gt;

&lt;p&gt;I found that the 16:10 aspect ratio with a resolution of 1440x900 filled the screen space within the browser best without being too small to work in.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Screen Size in Browser&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/browser_screen_size.jpg&quot; /&gt;
    &lt;figcaption&gt;Screen Size in Browser&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;working-with-audio&quot;&gt;Working with Audio&lt;/h3&gt;

&lt;p&gt;To help with managing the audio sources such as separating the music stream from the general desktop audio, &lt;a href=&quot;http://vb-audio.pagesperso-orange.fr/Cable/&quot;&gt;VB-Cable&lt;/a&gt; really helped. It allowed me to control audio levels of  within OBS rather then having to swap between different applications to adjust volume.&lt;/p&gt;

&lt;p&gt;It’s really straightforward to use as when installed, it comes up as an output device and redirects to an input source that OBS can add.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Virtual Cables Output Device Setup&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/virtual_cables_output_device.jpg&quot; /&gt;
    &lt;figcaption&gt;Virtual Cables Output Device Setup&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Virtual Cables OBS Input Device Setup&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/virtual_cables_input_device.jpg&quot; /&gt;
    &lt;figcaption&gt;Virtual Cables OBS Input Device Setup&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;During test recordings of the stream, I saw that the audio was just slightly out of sync with the camera. This is a common issue with a lot a streams that I have seen but easily fixable by adding a small audio delay within OBS.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Adjusting the Microphone Audio Offset&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/obs_audio_delay.jpg&quot; /&gt;
    &lt;figcaption&gt;Adjusting the Microphone Audio Offset&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;bots&quot;&gt;Bots&lt;/h3&gt;

&lt;p&gt;I previously thought bots were essential so I spent a long time researching and setting one up. In practise, they were more problematic by timing out users with their default rulesets such as posting just a link or emotes.&lt;/p&gt;

&lt;p&gt;With a small viewership, it is more than manageable to deal with users yourself and/or appoint a few moderators to help out. &lt;a href=&quot;https://blog.twitch.tv/moderators-are-the-sword-now-automod-is-the-shield-df3d8aae32a9#.6rto92pzk&quot;&gt;Twitch have also recently announced ‘AutoMod’&lt;/a&gt; to prevent hurtful and troll like messages from reaching the chat at all.&lt;/p&gt;

&lt;p&gt;That said, the one good use for bots for any viewership size, is the ability to assign custom commands such as ‘!software’ and ‘!design’ to deal with FAQs from the chat.&lt;/p&gt;

&lt;p&gt;With time, the regular viewers will use those commands to help answer the new viewers’ questions as well.&lt;/p&gt;

&lt;p&gt;The one I used was &lt;a href=&quot;https://beta.nightbot.tv/&quot;&gt;NightBot&lt;/a&gt; and it was really straightforward to use. Adding new commands was a breeze and it was hosted in the cloud which gave me one less headache to deal with.&lt;/p&gt;

&lt;p&gt;It is thin on features though so if you need something more extensive, &lt;a href=&quot;http://twitch.moobot.tv/&quot;&gt;Moobot&lt;/a&gt; and &lt;a href=&quot;http://vivbot.com/&quot;&gt;Vivbot&lt;/a&gt; are popular alternatives.&lt;/p&gt;

&lt;h3 id=&quot;epic-pen&quot;&gt;Epic Pen&lt;/h3&gt;

&lt;p&gt;This was one of the best software tools I had for the stream as it allowed me to draw and highlight parts on my desktop like a virtual whiteboard.&lt;/p&gt;

&lt;p&gt;It allowed me to describe and explain parts of my game design, high level logic, algorithms, etc much more effectively than without.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://epic-pen.com&quot;&gt;Best of all, it is free to use&lt;/a&gt;! It is Windows only but there is a &lt;a href=&quot;https://www.deskscribbleapp.com&quot;&gt;paid Mac equivalent called Deskscribble&lt;/a&gt; that has similar features.&lt;/p&gt;

&lt;div class=&quot;iframe-container&quot;&gt;
    &lt;iframe src=&quot;https://player.twitch.tv/?video=v69984349&amp;amp;autoplay=false&quot; allowfullscreen=&quot;true&quot; scrolling=&quot;no&quot; autoplay=&quot;false&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h1 id=&quot;programmer-break-timer&quot;&gt;Programmer Break Timer&lt;/h1&gt;

&lt;p&gt;One of the toughest parts of streaming is remembering to take computer breaks. General guidance from &lt;a href=&quot;https://www.nidirect.gov.uk/articles/safe-computer-use&quot;&gt;Health and Safety Executive&lt;/a&gt; is to take 5-10 minute break for every 50-60 minutes of computer use. It is so easy to get caught up in the stream and not realise that you have been sitting and staring at the screen for hours.&lt;/p&gt;

&lt;p&gt;I found this little tool, &lt;a href=&quot;http://elenzil.com/progs/breaktimer/index.html&quot;&gt;Programmer Break Timer&lt;/a&gt; which keeps me aware of time. It’s a simple tool that alerts you when a set time has passed which really helped me to take the necessary breaks away from the desk.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Programmer Break Timer&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/obs_audio_delay.jpg&quot; /&gt;
    &lt;figcaption&gt;Programmer Break Timer&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;chat-client&quot;&gt;Chat Client&lt;/h3&gt;

&lt;p&gt;The default chat client in Twitch is fine as a casual viewer but can get unwieldy to use when using it as a broadcaster with dozens or hundreds of users.&lt;/p&gt;

&lt;p&gt;This is where &lt;a href=&quot;https://nightdev.com/betterttv/&quot;&gt;BetterTTV&lt;/a&gt; and &lt;a href=&quot;http://chatty.github.io/&quot;&gt;Chatty&lt;/a&gt; can help.&lt;/p&gt;

&lt;p&gt;BetterTTV is a browser extension that adds extra features on the existing Twitch Chat, most notable are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Recent chat history on chat load&lt;/li&gt;
  &lt;li&gt;Desktop notifications when people send messages, mention you in chat and when channels you follow go live&lt;/li&gt;
  &lt;li&gt;Broadcast dashboard that prioritises chat and auto-updates channel statistics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally I prefer the standalone, cross platform client Chatty for two main reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Displays when users enter and leave the chat&lt;/li&gt;
  &lt;li&gt;Clicking on any name in the chat shows all the messages they have posted so far in the session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are incredibly useful from a broadcaster’s perspective in engaging with multiple viewers. Knowing that I had the ability to backtrack through a conversion with a particular user during a session took off some mental strain and allowed me to focus on the stream.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;View from Chatty&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-2-3/chatty_view.jpg&quot; /&gt;
    &lt;figcaption&gt;View from Chatty&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It is also worth noting that Twitch Chat is just IRC in the backend and &lt;a href=&quot;https://help.twitch.tv/customer/portal/articles/1302780-twitch-irc&quot;&gt;it is possible to use any IRC chat client&lt;/a&gt; like the popular &lt;a href=&quot;http://www.mirc.co.uk/&quot;&gt;mIRC&lt;/a&gt; or &lt;a href=&quot;http://colloquy.info/&quot;&gt;Colloquy&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;background-music&quot;&gt;Background Music&lt;/h3&gt;

&lt;p&gt;There are three approaches that streamers take with background music:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;No background music at all so the viewer is free to play their own&lt;/li&gt;
  &lt;li&gt;Use only copyright and/or royalty free music&lt;/li&gt;
  &lt;li&gt;Play anything regardless of copyright&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is an even split in opinion with streamers and viewers about playing background music with some saying it’s a distraction to both the viewer and streamer. Others find the silence during bouts of deep thought uncomfortable and prefer some ambience.&lt;/p&gt;

&lt;p&gt;Personally, I’m in the latter and generally play non vocal tracks at a low volume. The lack of vocals make the music less distracting and the low volume ensure it is just ambience.&lt;/p&gt;

&lt;p&gt;If you do choose to play music in the background and would like to keep or upload the broadcasts on sites like YouTube and Twitch, use music that you have permission to broadcast. If not, the sites will generally mute the areas of the video that it flags as copyright breach rendering the broadcast useless.&lt;/p&gt;

&lt;p&gt;Brands and sites like &lt;a href=&quot;http://nocopyrightsounds.co.uk&quot;&gt;No Copyright Sounds&lt;/a&gt; (NCS) are great to use as like the name says, they are free to use without limitations and are very popular with YouTubers as background music.&lt;/p&gt;

&lt;p&gt;Twitch, realising this would be a problem that streamers would have, has a &lt;a href=&quot;http://music.twitch.tv&quot;&gt;pre-cleared selection of music available to use on their site&lt;/a&gt; which is awesome.&lt;/p&gt;

&lt;p&gt;Another record label, &lt;a href=&quot;https://www.reddit.com/r/Twitch/comments/2etgh6/we_want_collaborators_royalty_free_music_for/&quot;&gt;Outertone allowed use of their music, royalty free for YouTubers and streamers&lt;/a&gt; which is very generous. They have a wider range of music then NCS and I found having a mix of both in the same playlist gives a nice variance in the background.&lt;/p&gt;

&lt;p&gt;My &lt;a href=&quot;https://soundcloud.com/labs-of-awesome-395262407/sets/royalty-free-songs&quot;&gt;streaming playlist is publicly available&lt;/a&gt; for anyone to use  on SoundCloud. Just be sure to turn on ‘shuffle’ as SoundCloud will play related tracks after it reaches the end of the playlist which does include copyrighted music.&lt;/p&gt;

&lt;h3 id=&quot;gif-grabber&quot;&gt;Gif grabber&lt;/h3&gt;

&lt;p&gt;Everyone loves gifs! They work really well on social media for demoing your work and viewer engagement. There tools available are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.screentogif.com/&quot;&gt;ScreenToGif&lt;/a&gt; - Available for Windows, feature rich allowing for captioning, clip trimming and more.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://giphy.com/apps/giphycapture&quot;&gt;Giphy Capture&lt;/a&gt; - Available for Mac, features clip trimming and resizing.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.cockos.com/licecap/&quot;&gt;LICEcap&lt;/a&gt; - Open source, available for both Mac and Windows, simple to use but lacks editing features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During my time streaming, I was using LICEcap as I saw it being used by some of the streamers I watched. Since it was cross-platform and I work on both Mac and Windows, it didn’t occur to me to look for alternatives.&lt;/p&gt;

&lt;p&gt;It was only recently that I found Giphy Capture and GifCam and the clip trimming feature is incredibly useful. It was really difficult to get the timing right with LICEcap and usually ended up with some extra frames at the beginning.&lt;/p&gt;

&lt;h3 id=&quot;next-article&quot;&gt;Next article&lt;/h3&gt;

&lt;p&gt;My next post will be the final in this series which will cover my original intentions, motivation and experience of being a streamer.&lt;/p&gt;

&lt;p&gt;If you would like me to cover something specific, let me know below by tweeting me . See you in the next one!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/blog/2017/03/17/twitch-experience-pt-3.html&quot;&gt;Part 3 (Learnings)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">Introduction</summary></entry><entry><title type="html">My Twitch experience as a Live Games Developer — Part 1: Hardware Setup</title><link href="https://stevenyau.co.uk/blog/2016/08/24/twitch-experience-pt-1.html" rel="alternate" type="text/html" title="My Twitch experience as a Live Games Developer — Part 1: Hardware Setup" /><published>2016-08-24T13:38:45+01:00</published><updated>2016-08-24T13:38:45+01:00</updated><id>https://stevenyau.co.uk/blog/2016/08/24/twitch-experience-pt-1</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2016/08/24/twitch-experience-pt-1.html">&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Over the last few months, I wanted to experiment with live streaming games development to see if it could become a workable career path in the same way as live streaming playing games has become over the past few years.&lt;/p&gt;

&lt;p&gt;On paper, it shouldn’t really work. Watching someone write code for hours at a time isn’t exactly the most exciting of prospects for a viewer and yet before I started this, some of the top game dev streamers on Twitch were averaging 50-100 concurrent viewers.&lt;/p&gt;

&lt;p&gt;This wasn’t huge by any means but was promising as most of the viewers were engaged with the streamer or with the rest of chat. This contrasted the game playing streams with thousands of viewers who lurk or fill chat with emotes.&lt;/p&gt;

&lt;p&gt;I wanted to see if it was possible to create a games development Twitch stream with enough viewers to generate a big enough revenue to become a full time job. Inspiration came from the &lt;a href=&quot;https://www.youtube.com/watch?v=AdXvZgIV1Q0&amp;amp;list=PLIhLvue17Sd7F6pU2ByRRb0igiI-WKk3D&quot;&gt;Double Fine Adventure documentary series&lt;/a&gt; where the company created revenue documenting how they developed the game, which would normally be the byproduct of games development.&lt;/p&gt;

&lt;p&gt;You can find my profile on &lt;a href=&quot;https://www.twitch.tv/yaustar&quot;&gt;Twitch&lt;/a&gt;, past broadcasts on &lt;a href=&quot;https://www.youtube.com/playlist?list=PLKj94Cw_aI_V9VQ40uV_AZYk_vjTk4EH0&quot;&gt;YouTube&lt;/a&gt; and &lt;a href=&quot;http://bit.ly/2aONT2f&quot;&gt;stream highlights&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Over the next month or so, I will be writing about the whole period over a series of posts covering different areas starting with the hardware setup and later, the software/services used and my experience of being a live streamer itself.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Part 1 (Hardware) - This article&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2016/12/16/twitch-experience-pt-2.html&quot;&gt;Part 2 (Software)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2017/03/17/twitch-experience-pt-3.html&quot;&gt;Part 3 (Learnings)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Where the magic happens!&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-1/twitch_experience_1.jpg&quot; /&gt;
    &lt;figcaption&gt;My desk layout&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;pc&quot;&gt;PC&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Phenom MATX Cube case&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-1/twitch_experience_2.jpg&quot; /&gt;
    &lt;figcaption&gt;The streaming PC with a gorgeous Phenom MATX Cube case&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Being completely new to this, I had no idea what the minimum hardware was needed for streaming. Google gave varying results and most people wanted to stream playing games rather than development which has different requirements of the hardware.&lt;/p&gt;

&lt;p&gt;My main concern was that my current PC build was very much on the low end. It was built for the living room as a Steam Machine and was looking for the cheapest way to get it ready for games development and to stream with.&lt;/p&gt;

&lt;p&gt;(For reference, my PC spec was: &lt;a href=&quot;http://amzn.to/2b5SqSK&quot;&gt;Intel Core i3 4170&lt;/a&gt; (Dual Core with Hyper Threading), 8 GB RAM, 256 GB SSD with a ATi 5870)&lt;/p&gt;

&lt;p&gt;The two most common methods used by streamers are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Nvidia NVENC supported card (Nvidia’s onboard video encoder)&lt;/li&gt;
  &lt;li&gt;Encode on the CPU using x264&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As I have an ATi card, the first option was out and encoding on the CPU also wasn’t viable as games development can have all the cores of the CPU under full load during building of the game which will lead to frame drops/lower stream quality.&lt;/p&gt;

&lt;p&gt;At this point, I was considering all the possible solutions including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Upgrading to a Nvidia graphics card&lt;/li&gt;
  &lt;li&gt;Upgrading to an Intel Core i7&lt;/li&gt;
  &lt;li&gt;Buying a second PC to do the encoding&lt;/li&gt;
  &lt;li&gt;Buying a capture card with hardware encoding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of which required me to spend money that I ideally wanted to be saving as none of these were particularly cheap. It wasn’t until a few weeks later of looking through eBay, Gumtree and the like that I found a solution that required no extra hardware.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://obsproject.com/&quot;&gt;Open Broadcaster Software (OBS)&lt;/a&gt;, the most common software used to transcode and stream to Twitch, supported Intel’s Quick Sync. Quick Sync is hardware video encoding and decoding technology integrated on the on board graphics that is normally part of Intel’s i series of CPU. All I had to do to was enable the Integrated Graphics Processor (IGP) on the motherboard’s BIOS settings and select the Quick Sync option under ((check where this is on OBS)).&lt;/p&gt;

&lt;p&gt;I was initially confused as the option in OBS was greyed out and it took me a while to think of looking in the BIOS settings where the IGP was disabled when I installed the graphics card.&lt;/p&gt;

&lt;p&gt;Being able to use Quick Sync gave me several benefits as I no longer had to upgrade the PC specifically for streaming, there was no significant impact on the main hardware used for games development (the CPU and GPU) and the encoded stream quality was excellent.&lt;/p&gt;

&lt;h3 id=&quot;lighting-and-camera&quot;&gt;Lighting and Camera&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Desk lamp&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-1/twitch_experience_7.jpg&quot; /&gt;
    &lt;figcaption&gt;The masking tape may not look pretty but does the job holding stuff together!&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I kept the lighting setup really simple, &lt;a href=&quot;http://amzn.to/2bnZ4ox&quot;&gt;LED daylight desk lamp&lt;/a&gt; under the webcam with a diffuser in place for a general fill light and whatever lighting the room provides. Not perfect but good enough taking into account that little of the stream screen estate used for the face camera.&lt;/p&gt;

&lt;p&gt;It also helps that the &lt;a href=&quot;http://amzn.to/2bcpQMc&quot;&gt;Logitech C920 webcam&lt;/a&gt; I choose had auto white balance and auto focus and coped incredibly well with a range of lighting conditions including low light.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.laptopmag.com/reviews/accessories/logitech-hd-pro-webcam-c920&quot;&gt;This review from Laptop Mag&lt;/a&gt; is what really sold it to me with the comparison of image quality between the built in webcam and the C920 and it was definitely worth spending the little extra to save time and space dealing with multiple light sources.&lt;/p&gt;

&lt;p&gt;The webcam is taped to a cheap mic boom arm from Amazon and positioned it at an angle so I’m not always looking at it straight on. It doesn’t look great from an aesthetics point of view, but it was cheap, stable and wasn’t visible to anyone watching the stream.&lt;/p&gt;

&lt;p&gt;I found the off centre camera angle gave the viewers the feeling that they are sitting with me rather than directly in my face and personal space. It also allowed me to distinctly show on stream when I am concentrating something on screen and when attention is directed to the viewers.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Webcam view&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-1/twitch_experience_3.jpg&quot; /&gt;
    &lt;figcaption&gt;View from the webcam&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;chair-and-desk--ergonomics&quot;&gt;Chair and Desk / Ergonomics&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Humanscale Freedom Task office chair&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-1/twitch_experience_5.jpg&quot; /&gt;
    &lt;figcaption&gt;My Humanscale Freedom Task office chair which I got on eBay for around £200&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The desk and chair are the best and underrated non-tech investments in a setup that you could make especially if you spend a significant amount of time at the computer.&lt;/p&gt;

&lt;p&gt;Given that I would be streaming for up to 8 hours a day, I had to ensure that my physical setup was as ergonomic as possible. I cannot stress how important this is for anyone that works at a desk and any discomfort should be looked at. It all builds up over the years leading to constant aches and pains so dealing with this early can reduce this a lot later down the line.&lt;/p&gt;

&lt;p&gt;My existing setup was already pretty decent prior to streaming. I had an IKEA motorised standing desk, an ergonomic HumanScale Freedom Task chair (brought off eBay), &lt;a href=&quot;http://amzn.to/2bgb3UD&quot;&gt;Kensington Trackball&lt;/a&gt; and &lt;a href=&quot;http://amzn.to/2bhCUzB&quot;&gt;Grifiti Wrist Pad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I previously used my computer a couple of hours at a time and it was only after a few days of full-time streaming (6-8hr sessions) that I realised I had neither configured my chair properly nor considered the distance to the screen, as I was frequently getting back and shoulder aches.&lt;/p&gt;

&lt;p&gt;I found myself either straining my eyes at the screen or leaning forward with an elbow on desk which caused me to slouch my back.&lt;/p&gt;

&lt;p&gt;Once I moved my chair, keyboard etc closer to the desk and screen, succumbed to the fact I was getting older and increased the font size by a couple of sizes, it was so much more comfortable to work and really wished I’d done it a lot sooner.&lt;/p&gt;

&lt;p&gt;If you are looking at upgrading your desk setup, I strongly recommend getting a desk that is height adjustable (&lt;a href=&quot;http://www.ikea.com/gb/en/catalog/products/S49084965/&quot;&gt;doesn’t have to be motorised&lt;/a&gt; or &lt;a href=&quot;http://www.ikea.com/gb/en/catalog/products/S89110934/&quot;&gt;be a standing desk&lt;/a&gt;) as it makes the setup much more flexible &lt;a href=&quot;http://lifehacker.com/5727784/how-to-find-your-ideal-desk-height&quot;&gt;to find the right height for you&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chair-wise many people swore by certain brands and models such as HumanScale, Steelcase and Herman Miller Aeron, all of which are common at tech companies but are eye-wateringly expensive (upwards of £800) and out of range for the average consumer. However, they are usually readily available on eBay, Gumtree, etc at a quarter of the price, as offices tend to cycle through chairs and the older ones are sold/given to resellers or refurbishers. &lt;a href=&quot;http://thewirecutter.com/reviews/best-office-chair/&quot;&gt;Wirecutter has a great guide to existing chairs on the market today&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://lifehacker.com/5755870/how-to-ergonomically-optimize-your-workspace&quot;&gt;Get your desk setup right and your body will thank you years down the line&lt;/a&gt;. There are also &lt;a href=&quot;http://www.artofmanliness.com/2015/05/19/hunched-back-exercises/&quot;&gt;some exercises you can do to help you de-hunch and stretch out the back&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;headset-and-microphone&quot;&gt;Headset and Microphone&lt;/h3&gt;

&lt;figure&gt;
    &lt;img alt=&quot;AKG K240&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/twitch-experience-1/twitch_experience_6.jpg&quot; /&gt;
    &lt;figcaption&gt;Retro inspired AKG K240 with ModMic attachment&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Headsets are more down to personal choice. I wanted comfort more than anything else as I would be wearing a set for hours at a time and ideally open back so I could hear myself speak and keep voice levels constant.&lt;/p&gt;

&lt;p&gt;In the end, I purchased the &lt;a href=&quot;http://amzn.to/2bkqMB6&quot;&gt;Semi Open, Over Ear AKG K240 Studio&lt;/a&gt; as I quite liked the retro look and thought that the gold accents would stand out quite nicely on stream. I also replaced the ear pads with &lt;a href=&quot;http://amzn.to/2aRKGUw&quot;&gt;Brainwavz Hybrid Memory Foam Earpad&lt;/a&gt; for extra comfort.&lt;/p&gt;

&lt;p&gt;Other sites such as &lt;a href=&quot;http://thewirecutter.com/leaderboard/headphones/&quot;&gt;Wirecutter&lt;/a&gt;, &lt;a href=&quot;http://www.trustedreviews.com/best-headphones_round-up&quot;&gt;Trusted Reviews&lt;/a&gt; and &lt;a href=&quot;http://www.whathifi.com/best-buys/best-headphones&quot;&gt;What Hi Fi&lt;/a&gt; have good roundups for headsets at various budgets and form factors.&lt;/p&gt;

&lt;p&gt;As for the mic, that was really difficult to decide on. Every video, article and roundup recommended the &lt;a href=&quot;http://amzn.to/2bnVTsG&quot;&gt;Blue Yeti&lt;/a&gt; with a shock mount. A couple of roundups also suggested &lt;a href=&quot;http://amzn.to/2bks2Fo&quot;&gt;Blue Snowball iCE&lt;/a&gt; as a cheaper alternative.&lt;/p&gt;

&lt;p&gt;The Yeti &lt;a href=&quot;https://www.youtube.com/watch?v=9E006QLHt0Y&quot;&gt;reviews incredibly well&lt;/a&gt; from my research, boasting many features such as controls on the device, different recording patterns (Omnidirectional, Stereo, etc) and headphone monitor jack.&lt;/p&gt;

&lt;p&gt;The problem was that they were very sensitive and had a huge range which normally is great but as my streaming setup is in the living room, I actually wanted something with a much shorter range.&lt;/p&gt;

&lt;p&gt;I ended up buying the &lt;a href=&quot;http://amzn.to/2aS0tmo&quot;&gt;Unidirectional ModMic 4.0&lt;/a&gt; after watching video reviews on &lt;a href=&quot;https://www.youtube.com/watch?v=dVFKbVPTdG8&quot;&gt;Linus Tech Tips&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=8v7f9JuZESM&quot;&gt;Hardware Canucks&lt;/a&gt;. As far as I can tell, the audio quality isn’t as good as the Yeti but good enough for streaming as the voices are still clear, the range is shorter and it is also a fair bit cheaper. Just make sure you get a &lt;a href=&quot;http://amzn.to/2aS6O1a&quot;&gt;USB Sound Adaptor&lt;/a&gt; to get rid of the background hiss.&lt;/p&gt;

&lt;p&gt;If I had a dedicated room or area for the stream, I would have gotten the Yeti, as it is more versatile as a recording device and the recording quality is noticeably better.&lt;/p&gt;

&lt;p&gt;I’ve also seen a &lt;a href=&quot;https://www.twitch.tv/dragonslumber/profile&quot;&gt;streamer use a Rock Band Mic&lt;/a&gt; that was placed in a mug with a t-shirt to act as shock mount and it worked surprisingly well in terms of audio quality.&lt;/p&gt;

&lt;h3 id=&quot;next-article&quot;&gt;Next Article…&lt;/h3&gt;

&lt;p&gt;The next article in the series will cover the software and services used for my streaming setup. In the meantime, you can check out my directory of other regular game development streamers where there are some very interesting projects going.&lt;/p&gt;

&lt;p&gt;Or if you want to know anything more about my setup, please tweet me  and I’m more then happy to answer!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/blog/blog/2016/12/16/twitch-experience-pt-2.html&quot;&gt;Part 2 (Software)&lt;/a&gt;&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">Introduction</summary></entry><entry><title type="html">Open Plan Offices are here to stay, so how do we make them more productive?</title><link href="https://stevenyau.co.uk/blog/2016/06/09/open-plan-offices.html" rel="alternate" type="text/html" title="Open Plan Offices are here to stay, so how do we make them more productive?" /><published>2016-06-09T10:38:45+01:00</published><updated>2016-06-09T10:38:45+01:00</updated><id>https://stevenyau.co.uk/blog/2016/06/09/open-plan-offices</id><content type="html" xml:base="https://stevenyau.co.uk/blog/2016/06/09/open-plan-offices.html">&lt;p&gt;Mention open plan to office workers and usually you get a few grumblings in return. Typically, these are about general noise or distractions around the office and have been the same complaints for almost as long as these type of offices have been around.&lt;/p&gt;

&lt;p&gt;Below are some of the solutions I’ve either experienced or have implemented that really helped keep the team focused on the project.&lt;/p&gt;

&lt;p&gt;(Disclaimer: This article is written from my experiences working in open plan offices as a games programmer over my career, so some of these suggestions may not be applicable to all offices. Feedback is welcome and I am really interested in how other workplaces have improved their environment).&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Header image&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/open-office-make-better-header-image.jpeg&quot; /&gt;
    &lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;everyone-should-have-the-right-equipment-for-the-job&quot;&gt;Everyone should have the right equipment for the job&lt;/h3&gt;

&lt;p&gt;Although this is true for all office environments, in an open space, small everyday grumblings can spread quickly through the office become a bigger distraction. There is no ‘one size fits all’, so ensure that people have the right equipment that fits them rather having a standardised set.&lt;/p&gt;

&lt;p&gt;This could involve getting different ergonomic chairs for everyone, properly spec’ed PCs/laptops/monitors specialised for the role or ensuring that people have suitable and comfortable headsets for the environment (wired/wireless/noise cancelling/etc). Given the many parts that make up someone’s workspace, it is may be easier to let them buy what they need and reimburse afterwards (&lt;a href=&quot;https://www.quora.com/How-does-a-company-like-37signals-handle-things-like-employee-health-care-and-withholdings_&quot;&gt;at Basecamp, everyone has a company card for business expenses including equipment&lt;/a&gt;).&lt;/p&gt;

&lt;h3 id=&quot;have-good-amount-of-space-between-desks&quot;&gt;Have good amount of space between desks&lt;/h3&gt;

&lt;p&gt;Lack of privacy is one of the productivity’s biggest killers and the usual setup in offices is to cram as many people in one areas as possible. Not only does this increase ambient noise, it can feel claustrophobic having that many people around each other.&lt;/p&gt;

&lt;p&gt;Spacing desks apart helps alleviate this feeling, reduces distractions and increases a sense of privacy.&lt;/p&gt;

&lt;h3 id=&quot;keep-desks-as-far-away-from-foot-traffic-as-possible&quot;&gt;Keep desks as far away from foot traffic as possible&lt;/h3&gt;

&lt;p&gt;Having a constant flow of people moving pass your desk can be incredibly distracting and can take you out of your zone.&lt;/p&gt;

&lt;h3 id=&quot;keep-teams-desk-areas-separate-to-minimise-cross-team-disruption&quot;&gt;Keep teams’ desk areas separate to minimise cross team disruption&lt;/h3&gt;

&lt;p&gt;There will be times where a team will be audibly and visibly busy (e.g servers have crashed and customers can no longer log onto their account), which is acceptable as it’s an issue that can involve the majority of the team.&lt;/p&gt;

&lt;p&gt;The problem is if another team is nearby, they will be affected by an issue that is unrelated to the work that they do purely by location. By separating teams, either by space or a sound proof barrier, they are focused on their own tasks and they are also free to own their space around them without affecting other teams.&lt;/p&gt;

&lt;p&gt;In the cases where space is at a premium, look for ways to muffle sound from or prevent it from travelling, such as tall plants, soft walls/barriers, audio isolation or high back office sofas (which can nicely double as phone booths for a quick call).&lt;/p&gt;

&lt;h3 id=&quot;provide-a-separate-breakout-area-for-each-team&quot;&gt;Provide a separate breakout area for each team&lt;/h3&gt;

&lt;p&gt;Every team will need at least one area (pending on the team size) where people can collaborate without disturbing the rest of team. To do this, it has to be separated from the main work area at least acoustically. This can be a large meeting room where there are sufficient facilities where users can bring in their laptops or remote desktop to their machine. This is to encourage spontaneous use of the area rather than a place that has to be set up deliberately.&lt;/p&gt;

&lt;h3 id=&quot;keep-the-environment-of-the-office-consistent&quot;&gt;Keep the environment of the office consistent&lt;/h3&gt;

&lt;p&gt;The environment of the office is one of the hardest areas to control as everyone has different preferences. The best that can be done is to to ensure that temperature and lighting is consistent throughout so there aren’t any cold/hot/dark/light spots throughout the office. If this cannot be done due to the existing building layout, then supply fans/heaters/lights to help compensate.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.trello.com/organize-workspace-maximum-productivity/&quot;&gt;Trello has a great article with the extent that the environment can have on people’s productivity alongside other suggestions to help&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an example of some of these ideas in practice, I have included an annotated photo of one of &lt;a href=&quot;https://www.wework.com/&quot;&gt;WeWork’s co-working spaces below&lt;/a&gt; (assuming those glass walls are sound proof). The only addition I would suggest is having the option of blinds for the offices for extra privacy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img alt=&quot;We Work offices&quot; src=&quot;/blog/assets/images/loading.gif&quot; data-echo=&quot;/blog/assets/images/open-office-make-better-wework-example.jpeg&quot; /&gt;
    &lt;figcaption&gt;One of WeWork’s Offices (annotations mine)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Ultimately, creating a good open office is about doing what you can to minimise distractions and give the teams room to focus on their work. If you have a suggestion or improved your own office in another way, please tweet me . I really would like to keep updating this article as a central resource to improving the everyday open office!&lt;/p&gt;</content><author><name>Steven Yau</name><email>findme@stevenyau.co.uk</email></author><summary type="html">Mention open plan to office workers and usually you get a few grumblings in return. Typically, these are about general noise or distractions around the office and have been the same complaints for almost as long as these type of offices have been around.</summary></entry></feed>