<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Swoon Digital</title>
  <subtitle>Swoon Digital is an online software development company that specializes in building custom software solutions for businesses.</subtitle>
  <link href="https://www.swoon.com.au"/>
  <link href="https://www.swoon.com.au/feed.xml" rel="self"/>
  <updated>2025-11-25T00:00:00Z</updated>
  <id>https://www.swoon.com.au</id>
  <author>
    <name>Adrian Gray</name>
    <email>adrian@swoon.com.au</email>
  </author>
    
    <entry>
      <title>Hello World</title>
      <link href="https://www.swoon.com.au/hello-world/"/>
      <updated>2017-09-29T00:00:00Z</updated>
      <id>https://www.swoon.com.au/hello-world/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;TLDR; HTML5 game developer blogging about making Japanese language educational games for kids.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hey, I’m starting a new thing with kids games that combines all my passions. My family, Japan, coding, and helping people learn. I’ll cut to the chase, here’s my side project – making &lt;a href=&quot;https://drlingua.com/&quot;&gt;Japanese Hiragana games&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There’s been a heap of occasions I’ve started a blog because that’s what you’re “meant to do”. I never really got why I was supposed to do it, or what I was doing it for, so every single time I started one it was basically sill born, and sat there with two or three posts until I eventually deleted it. However, things have changed. Let me wind back a bit to give you some context.&lt;/p&gt;
&lt;p&gt;I make kids educational games as my day job. It’s with a great company full of super smart people making great stuff to help educate kids online. Ironically, we don’t have much of a web presence &lt;a href=&quot;http://dev.blake.com.au/&quot;&gt;Blake eLearning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My lovely wife is Mitra, who makes the world a better place, and we have two sons; Toby in 2nd grade, and Dylan in Kindy. The school they go to is very strong with languages, and Mitra and I had to pick a language for them. We both wanted them to learn Japanese, we’ve travelled there together, love the country and culture, and agree it’s an awesome language for them to study. But homework is a problem we didn’t think about.&lt;/p&gt;
&lt;p&gt;If we’d picked a European language it would be easier to get an idea of what their homework was. But as neither Mitra nor I speak Japanese, and the homework is coming home in Japanese, we were in trouble!&lt;/p&gt;
&lt;p&gt;The bright side of that is we both wanted to learn Japanese, and it was kind of thrust upon us – which is probably better, as we’re both super busy, so finding time to slot it in was probably never going to happen. So we’re trying to catch up to Toby enough to help him with his homework, and to keep ahead of Dylan so we’re there for him.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hang in there, we’ve almost caught up!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I noticed about 6 months ago that Toby wasn’t very enthusiastic about his Japanese so, being someone who makes games, I thought it would be fun to make a Japanese themed game with him in it. So I did, Hiragana Ninja (and yes, that’s Toby):&lt;/p&gt;
&lt;div class=&quot;flex flex-row justify-center items-center&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://www.swoon.com.au/assets/images/blog/hiragana-ninja-screen.jpg&quot; alt=&quot;Hiragana Ninja game screen&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That got him a bit more interested in learning Hiragana, and I always meant to do more, but, you know… busy busy…&lt;/p&gt;
&lt;p&gt;And then recently Mitra and I realised we needed to learn Japanese quickly, so we both got stuck into it. As part of that I wrote a game for associating Hiragana and Romanji, then posted it to Reddit thinking I could later add Hiragana Ninja to the site and have two games going and maybe eventually turn in into something.&lt;/p&gt;
&lt;p&gt;It was more popular than I thought it would be and I got some great suggestions for ways to improve it. Then I found out that the domain name I used (&lt;a href=&quot;http://hiragananinja.com/&quot;&gt;hiragananinja.com&lt;/a&gt;) was already something cool in the Japanese learning space &lt;a href=&quot;http://hiragananinja.tk/wp2/&quot;&gt;Hiragana Ninja&lt;/a&gt; (Doh! I never thought to check other TLDs, I had assumed that if I got the .com so easily, there would be nothing else using that name. Once I found out, I rebranded it to &lt;a href=&quot;https://drlingua.com/&quot;&gt;DrLingua.com&lt;/a&gt;, got my good friend Dave to do some wicked art for it, posted the game on a new site, and here we are.&lt;/p&gt;
&lt;div class=&quot;flex flex-row justify-center items-center&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://www.swoon.com.au/assets/images/blog/kana-game-kana-bento.jpg&quot; alt=&quot;Kana Bento - Japanese Kana game&quot; title=&quot;Kana Bento | Japanese Kana Game&quot; /&gt;&lt;br /&gt;
&lt;a href=&quot;https://drlingua.com/japanese/games/kana-bento/&quot;&gt;Kana Bento - Japanese Kana Game&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;All caught up&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, about this blog. I’ve had a “masterplan” in my head for a few years, and never started it. It seems I have now, almost accidentally, started on the path. I can’t reveal any details yet for a few reasons, but I can talk about everything I’m doing, and the tech issues I run into along the way here – mostly as a way to get debrief myself.&lt;/p&gt;
&lt;p&gt;This blog will be mostly geeky stuff about HTML kids game development, web dev, JavaScript, React, Gatsby, SEO, and other geeky web stuff. If you’re just interested in the games, there’s nothing here for you. You should go to &lt;a href=&quot;https://drlingua.com/&quot;&gt;Dr lingua&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, &lt;em&gt;hello world&lt;/em&gt;!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Gatsby conditionally using Google Analytics only on a live site</title>
      <link href="https://www.swoon.com.au/gatsby-conditionally-using-google-analytics-only-on-a-live-site/"/>
      <updated>2017-09-30T00:00:00Z</updated>
      <id>https://www.swoon.com.au/gatsby-conditionally-using-google-analytics-only-on-a-live-site/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;TLDR; How to conditionally include GA only when domain name matches a string.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby&lt;/a&gt; has a module to add Google Analytics (GA) to a site with no fuss &lt;a href=&quot;https://www.npmjs.com/package/gatsby-plugin-google-analytics&quot;&gt;gatsby-plugin-google-analytics&lt;/a&gt;. It works great for the simple cases. It automagically only adds GA when the environment is set to &lt;em&gt;production&lt;/em&gt;, so when you’re in development mode no extra views are sent to GA. Great!&lt;/p&gt;
&lt;p&gt;But I always check my site both locally (using Python’s SimpleHTTPServer), and then I deploy to &lt;a href=&quot;https://firebase.google.com/&quot;&gt;Firebase&lt;/a&gt; and check again that everything is OK. This sends spurious page views to GA, which bugs me. The simplest way I found around it is do a quick hack to the gatsby-plugin-google-analytic source code. Here’s the steps:&lt;/p&gt;
&lt;p&gt;Add ‘react-ga’ to your packages if you don’t already have it.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;    yarn add react&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;ga&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have installed gatsby-plugin-google-analytics, remove it from your packages and rerun the package install.&lt;/p&gt;
&lt;p&gt;Remove the plugin entry from gatsby-config.js, it should look something like:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;gatsby-plugin-google-analytics&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;trackingId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;UA-12345678-90&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now create a gatsby-browser file in your main directory, and add the following (obviously, swap in your GA code, and domain name):&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ReactGA &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;react-ga&#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; domain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;foo.com&#39;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;NOPE&#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hostname&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;drlingua.com&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;YOUR-GA-ID-HERE&#39;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ReactGA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onRouteUpdate&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;state&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	ReactGA&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pageview&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pathname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that should be it. You can look at the code from anywhere othan than the production site and you should not send any extra GA page views, unless the domain string you entered is included in the host name of the site.&lt;/p&gt;
&lt;p&gt;I know, this should probably be do as a PR for &lt;a href=&quot;https://www.npmjs.com/package/gatsby-plugin-google-analytics&quot;&gt;gatsby-plugin-google-analytics&lt;/a&gt;. I will if I get a minute…&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Pages Indexed But Not In Search</title>
      <link href="https://www.swoon.com.au/pages-indexed-but-not-in-search/"/>
      <updated>2017-10-01T00:00:00Z</updated>
      <id>https://www.swoon.com.au/pages-indexed-but-not-in-search/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;TLDR; By early stuffing around with &lt;a href=&quot;http://drlingua.com/&quot;&gt;DrLingua.com&lt;/a&gt;, I borked Google and Bing…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Google and Bing are taking a long time (well, it seems like along time) to show any results from my site in search. Both engines list &lt;a href=&quot;https://drlingua.com/&quot;&gt;DrLingua.com&lt;/a&gt; as indexed, but no results show with a &lt;em&gt;site:drlingua.com&lt;/em&gt; search. I figure there’s one of two likely possibilities.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I stuffed it up. I did the site first as http on the local server, then moved it to https, then changed all the URLs (took out a ’#’ fragment identifier from Reacts &lt;em&gt;hash router&lt;/em&gt;). I think the search engines are likely going (WTF?!#) and waiting a week or so for things to settle down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I noticed the domain name has been previously registered. It may have been someone who use black hat SEO. That would be pretty crappy to clean up, but I don’t think that’s the case. There were no backlinks when I started it, and neither Google nor Bing’s webmaster tools are giving me any warnings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Somehow I don’t think that calling Google would help. Even though we were hanging out today with another family and the dad is a Googler… At the moment it’s no problem. As long as the content has been indexed it’s unlikely that someone else will be able to steal the content, and I’m happy to wait for it to be available in the search engines for a week or so. It’s just that it a bit annoying having no idea why it’s delayed, and not being able to do anything about it.&lt;/p&gt;
&lt;p&gt;One of the problems is I’m getting a hundred or so visits a day from China. I hope this is people using the &lt;a href=&quot;https://drlingua.com//japanese/games/kana-bento/&quot;&gt;Kana game&lt;/a&gt;, if so, great! But I’m dubious.&lt;/p&gt;
&lt;p&gt;Google Analytics shows the results coming from search. But I’m not in Google, Bing, or Baidu (I checked), I’m assuming the results aren’t from a search engine and it’s either some sort of a scam, or some weird GA spoofing that I don’t understand. I’m guessing it the Baidu spider, but I just don’t have the data to go on yet. Maybe once my site is properly returning in results I’ll get a better idea… Maybe…&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Addendum 1&lt;/strong&gt;: I just noticed Google Analytics now has an “Exclude all hits from known bots and spiders” flag. Well, guess that will sort out whether it’s the Baidu spider. ¯&#92;&lt;em&gt;(ツ)&lt;/em&gt;/¯ (It’s been a while since I GA’d)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Addendum 2&lt;/strong&gt;: Looks like it’s not spiders or bots, just a fair few people playing the games in China. Nice!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Addendum 3&lt;/strong&gt;: The site is now live on Bing! I resubmitted the sitemap. It had been sitting there for over a week as &lt;strong&gt;pending&lt;/strong&gt;. I resubmitted the sitemap last night, and it’s live today. I know that &lt;strong&gt;correlation is not causation&lt;/strong&gt;, but…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s a different thing for Google though – Google search console shows results are indexed (they have been for a week), but a search for site:drlingua.com gives me no results. Still a wait and see thing. I may drill my Google friend with a few questions over dinner next week – even though he works in maps and has nothing to do with search…&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    </entry>
    
    <entry>
      <title>Back on Google</title>
      <link href="https://www.swoon.com.au/back-on-google/"/>
      <updated>2017-10-10T00:00:00Z</updated>
      <id>https://www.swoon.com.au/back-on-google/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;TLDR; Don’t remove a site from Google’s index if you want it in seach results 😃&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The mystery of not being in Google, solved? I’ve been busy working on the second game for &lt;a href=&quot;https://www.swoon.com.au/back-on-google/drlingua.com&quot;&gt;Dr Lingua&lt;/a&gt; – which is now feature complete – I just have a couple of bugs I found during testing to fix. Since the game is almost ready to launch, but I’m reluctant to launch it until the site shows up in Google, today I had more of a dig into my missing Google results.&lt;/p&gt;
&lt;p&gt;The short story is that when I moved from the site from using the hash router (with URLs like &lt;a href=&quot;http://foo.com/#/bar&quot;&gt;foo.com/#/bar&lt;/a&gt;) to statically generating the site (with URLs like &lt;a href=&quot;http://foo.com/bar&quot;&gt;foo.com/bar&lt;/a&gt;), I wanted the old redundant pages cleared from Google – since it was pretty much just one page, and so new, I didn’t think it was worth a redirect. I assumed requesting to remove URLs in Google’s Search Console would kill the old (broken) URLs and allow the new valid ones to appear as they god scraped. Today I came across a post with suggested removing a site from the index keeps removing any new pages submitted for months afterwards… That sounds possibly relevant!&lt;/p&gt;
&lt;p&gt;I went into Google Search console and cancelled the (old) removal. Half an hour later the pages were &lt;strong&gt;back on Google&lt;/strong&gt;. Now, I know, correlation is not causation, but I’m 99% sure that’s what the problem was, I find the theory and timing compelling. So I’m calling that the problem, and saying everything is fixed now.&lt;/p&gt;
&lt;p&gt;Now to get that next game launched!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Time to learn SEO</title>
      <link href="https://www.swoon.com.au/time-to-learn-seo/"/>
      <updated>2017-10-12T00:00:00Z</updated>
      <id>https://www.swoon.com.au/time-to-learn-seo/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;TLDR; It seems SEO has to be my primary channel, but I don’t really understand SEO. Time to change that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’ve been making things online a looong time. My first website was online in 1996, and I’ve done dozens since. And I don’t know SEO. I mean, I know the basics, have a title with desired keywords, have good text, use tags for the images, get inbound links, that sort of stuff. But it’s mainly in the abstract. I want my new project to work out, and that’s going to need some pretty decent traffic to make it work.&lt;/p&gt;
&lt;p&gt;My theory is I put out some very cool stuff that people really like, and I’ve gotten some great feedback from Japanese teachers for my &lt;a href=&quot;https://drlingua.com/japanese/games/kana-bento/&quot;&gt;Hiragana drag and drop game&lt;/a&gt;, and the new game is going very well to. But what happens then? I’m like the South Park underpants gnomes…&lt;/p&gt;
&lt;div class=&quot;flex flex-row justify-center items-center&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://www.swoon.com.au/assets/images/blog/profit.jpg&quot; alt=&quot;Kana Bento - Japanese Kana game&quot; title=&quot;Kana Bento | Japanese Kana Game&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I’m pretty sure step 2 is something to do with marketing. It doesn’t matter how cool the stuff you’re making is if no one knows about it. The thing about kids learning languages is that they change every year. That offers great opportunities, but it also means that traditional marketing is out of the question for me – my budget is, let me see… Oh, that’s right, nothing! I think that Google is probably full of people looking for things like this, so that’s where I want to try reaching them. Which means I have to make my site visible in Google.&lt;/p&gt;
&lt;p&gt;I’ve started with the very basics of SEO, but I know there’s a whole world of stuff I don’t understand yet. I actually know the main question is: “What are people looking for?”. I’m making some guesses, but until I start to see some data, they will remain guesses. So, while I start gathering data, I’m going to spend the next few weeks really digging into SEO a bit more. I think from then on it’s going to be a thing I do some of every week. Worst case scenario, and this turns into nothing, then hey, at least I’ll have some my SEO chops!&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Optimising for SEO</title>
      <link href="https://www.swoon.com.au/optimising-for-seo/"/>
      <updated>2017-10-16T00:00:00Z</updated>
      <id>https://www.swoon.com.au/optimising-for-seo/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;TLDR; Try to have your keyword focus before you make the page, and be prepared for surprises.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think I’ve done a fairly decent introductory dive into SEO over the last week. Man, was that a shock, almost everything has changed. But it’s a lot better now. It seems like the old junk of keyword stuffing, link farms and hacked blog comments, is basically dead now. It seems Google have done really well with minimising search spamming, and are getting things well under control. But it also means thinking more about how to put things online.&lt;/p&gt;
&lt;p&gt;I’m making things that people are liking, and I’m getting some really good feedback from Japanese language teachers that are using my games in their classes. I have access to a decent number of Australian teachers via Facebook, but once I’m out of he Australian teachers zone, I really have to think about how to build a network of teachers. Teachers are always looking for good content, and search engines are a good way to find them, so SEO seems like a good way to go.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I should point out, teachers aren’t my ‘big picture’ idea for this site. I’m more than happy making games that teachers are using in their classes. On top of that I get some really good feedback from teachers, which is amazingly valuable. My intent is to keep anything I put online here for free should stay free forever. If it helps kids learn, excellent!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My main learnings from SEO over the last week are combined with finally getting some search data in – me realising that I’ve done things totally wrong 😃&lt;/p&gt;
&lt;p&gt;Take ‘Kana Bento’, a game in which you select a kana alphabet to drag onto a grid of another kana set. Excellent for familiarisation with different kanas. But no one is searching for ‘kana bento’, or ‘kana drag and drop’. Well, maybe someone is, but I’m not seeing them. I am, however, seeing searches for ‘Hiragana drag and drop’, ‘drag-n-drop katakana’, and many similar combinations, none of which I am anywhere near the top of the rankings for.&lt;/p&gt;
&lt;p&gt;My solution – split the game up. I’ve made some minimal changes to the code, and now have three games (OK, so it’s just one game being passed different starting parameters). One is a Hiragana drag and drop, one is a Katakana drag and drop, and the other lets you pick the kanas to use before the game starts. This is better for everyone. Teachers can send a link out and kids don’t have to pick options to get the game running correctly, and I can optimise the games for their respective kanas.&lt;/p&gt;
&lt;p&gt;That’s not going to make a huge difference in the numbers coming to my site. But a the moment I’d be happy with an extra 50 people a week, so this little example of getting more targeted content should be an excellent (small) way to get into, and test, SEO optimization.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>GatsbyJS sitemap excluding pages</title>
      <link href="https://www.swoon.com.au/gatsbyjs-sitemap-excluding-pages/"/>
      <updated>2017-10-18T00:00:00Z</updated>
      <id>https://www.swoon.com.au/gatsbyjs-sitemap-excluding-pages/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;Oops, I screwed up with that previous SEO update. Let’s hack the sitemap module for a quick and easy custom sitemap&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I ran into and SEO thing on &lt;a href=&quot;htts://drlingua.com&quot;&gt;Dr Lingua&lt;/a&gt;. I have a game that does &lt;a href=&quot;htts://drlingua.com/japanese/games/kana-grid/&quot;&gt;drag-n-drop hiragana and drag-n-drop katakana&lt;/a&gt;. It works well, and Japanese language teachers are using it in their classes. That’s great. To make it better for them and, I thought to help with SEO, I split it into three games. The original game, one starting with Hiragana, and one starting with Katakana.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I didn’t think through all the SEO ramifications. By splitting it into three pages, I was diminishing the page value of each page, especially when it comes to inbound links.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let say we have page A, and 100 inbound links. Yay. OK, now to make it better for users, I add pages A1 and A2 with almost the same content. I get 100 more inbound links, but the links now split between the three different pages, instead of 200 going to A, I may have A: 140, A1: 40, A2: 20. Well, that’s kind of sucky. Time for a couple of changes.&lt;/p&gt;
&lt;p&gt;First, I set A1 and A2 to have A as the &lt;a href=&quot;https://support.google.com/webmasters/answer/139066?hl=en&quot;&gt;canonical link&lt;/a&gt;. That should ensure all SEO juice from A1 or A2 flow back to A. But there was still a problem, by mentioning Hiragana drag and drop on the Hiragana version, I was diluting the strength of that keyword throughout the site, which lowered it from A. Next thing was to remove page A1 and A2 from the index.&lt;/p&gt;
&lt;p&gt;Adding a meta tag to A1 and A2 of&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;meta name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;robots&quot;&lt;/span&gt; content&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;noindex&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;means that the pages &lt;em&gt;should&lt;/em&gt; be removed from the index. But there was still a problem, GatsbyJS’s site map generator adds all pages to the sitemap.&lt;/p&gt;
&lt;p&gt;I know Google is way smart, and won’t index the pages because I added the noindex meta tag, right? To be doubly sure I wanted to remove any references to these pages from the sitemap, and some other ‘utility’ pages while I was at it.&lt;/p&gt;
&lt;p&gt;I don’t have the time to get up to scratch with GraphQL at the moment, or build up a decent understanding of the GatsbyJS dev API, and do things the right way (thought I intend to when I get a bit of time). Instead I quickly hacked the sitemap module.&lt;/p&gt;
&lt;p&gt;In node_modules/gatsby-plugin-sitemap/internals.js I created a simple array holding the pages I want to exclude from the sitemap like so:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; exclude &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;/404/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/contact/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/A1/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/A2&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I then ran a quick filter over allSitePages.edges to exclude those pages before passing them into the map function:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;…&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; allSitePage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;edges&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;edge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;exclude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;edge&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;node&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;edge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;…&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sitemaps now generate on a build as usual, those pesky pages are no longer referenced, and all is good with the world (well, not really, but I’ll take a little win).&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Repeatic SRS side project live</title>
      <link href="https://www.swoon.com.au/repeatic-srs-side-project-live/"/>
      <updated>2018-03-08T00:00:00Z</updated>
      <id>https://www.swoon.com.au/repeatic-srs-side-project-live/</id>
      <content type="html">&lt;p&gt;I’ve been a bit busy over the last few months nights and weekends. I’m working on an app for english pronunciation with an expert in that field, and I made a thing to help my kids with Japanese.&lt;/p&gt;
&lt;p&gt;Repeatnic is a &lt;a href=&quot;https://repeatnic.com/&quot;&gt;spaced repetition system for Japanese&lt;/a&gt;. I’ve used Anki and a heap of other spaced repetition things with Japanese but I wasn’t happy with any of them. My kids bring back vocab words each week to learn, and it was too hard for them to use an existing SRS (they’re 7 and 8). So I wrote one for them. I’ve also been using it, and I think other people might find it of use so I added another couple of languages.&lt;/p&gt;
&lt;p&gt;I’ll be pretty busy with that, but I’ll try to find time to post here as I make updates and changes to Repeatnic.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>English Pronunciation App beta</title>
      <link href="https://www.swoon.com.au/english-pronunciation-app-beta/"/>
      <updated>2018-08-04T00:00:00Z</updated>
      <id>https://www.swoon.com.au/english-pronunciation-app-beta/</id>
      <content type="html">&lt;p&gt;I hit a few speed bumps with the Japanese spaced repetition app, which ironically, I think I have solved through another side project - An &lt;a href=&quot;https://pronounceweb.com/&quot;&gt;English pronunciation practice app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pronounce Web is a project I’m working on with an English language pronunciation teacher. We’ve currently got over 60 training video in post production, and a heap of audio ready to record. It’s going to be pretty slow to roll out, it’s a side project after all, but it’s a good cause so I’ll enjoy it.&lt;/p&gt;
&lt;p&gt;My best find on the is a way to prerender a React app, resolving a number of flaky SEO issues with React Helmet - &lt;a href=&quot;https://github.com/stereobooster/react-snap&quot;&gt;React Snap&lt;/a&gt; which so far looks to solve all the problems I was having with React Helmet.&lt;/p&gt;
&lt;p&gt;More to come…&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>The Start of EdScreening</title>
      <link href="https://www.swoon.com.au/the-start-of-edscreening/"/>
      <updated>2021-10-10T00:00:00Z</updated>
      <id>https://www.swoon.com.au/the-start-of-edscreening/</id>
      <content type="html">&lt;blockquote&gt;
&lt;p&gt;I’ve been gone from the blog for a while. For years I’ve cycled through a process of setting a blog up, writing a few posts, and then abandoning it for years. Oops, I did it again… For posterity I’m leaving the old posts up this time. As a reminder to myself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’ve been working for about a year on a pretty awesome project EdScreening. It’s a SAAS to help parents and teachers better understand neurodivergent children. I’m sure it will come up a lot as it goes through different stages, but for a super quick intro…&lt;/p&gt;
&lt;h3&gt;Why EdScreening?&lt;/h3&gt;
&lt;p&gt;A friend approached me with an idea. Her daughter was having problems at school. She had seen a heap of specialists, but no one was able to tell her what was going on. Eventually she found an expert on 2e (twice exceptional) kids, who did a screening on multiple fronts to spot any neurodivergent aspects the daughter was showing. To cut a long story short, her daughter radically improved at, and started enjoying, school.&lt;/p&gt;
&lt;p&gt;We talked about making this approach more broadly accessible so other people would have access. We could try to make it a business, while doing something with a potential to help millions of kids. Count me in!&lt;/p&gt;
&lt;h3&gt;Where’s it at?&lt;/h3&gt;
&lt;p&gt;My first iteration used NextJS. It’s a great framework, but the whole serverless thing was wrong way on a few fronts – most strongly with authentication and access issues. But it was suitable for the MVP.&lt;/p&gt;
&lt;p&gt;We got it though doing pilot educational screenings OK. We will soon have enough pilot samples thorough, which then go through our academic advisors for validation and calibration.&lt;/p&gt;
&lt;p&gt;I was planning on a major update of the NextJS app between the pilot stage and the actual launch, but I changed my mind, and swapped the whole thing over run on Rails / Heroku. I’m so much happier working on it now. I should have just started on Rails initially, but I wanted to play with a new hotness…&lt;/p&gt;
&lt;div class=&quot;flex flex-row justify-center items-center&quot;&gt;
&lt;img src=&quot;https://www.swoon.com.au/assets/images/blog/edscreening-screen-shot.webp&quot; alt=&quot;EdScreening screen shot&quot; width=&quot;400&quot; class=&quot;centre&quot; /&gt;
&lt;/div&gt;
&lt;h3&gt;Where’s it going?&lt;/h3&gt;
&lt;p&gt;After the pilot is complete, and analysis done, we will have enough data to generate reports. The report is being designed by Erin at &lt;a href=&quot;https://www.this-is-workshop.com/&quot;&gt;Workshop&lt;/a&gt; (who is lovely and a total pleasure to work with). Once the report is ready I’ll update the site and send people who did the pilot screening links so they can do full screening. After that, we launch. I can’t wait!&lt;/p&gt;
&lt;h3&gt;And to see where it all went wrong…&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.swoon.com.au/2022/12/08/lessons-learned/&quot;&gt;Lessons Learned&lt;/a&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Ship 30 for 30</title>
      <link href="https://www.swoon.com.au/ship-30-for-30/"/>
      <updated>2021-12-07T00:00:00Z</updated>
      <id>https://www.swoon.com.au/ship-30-for-30/</id>
      <content type="html">&lt;p&gt;I’ve read a few books on habit formation, starting with James Clear’s &lt;a href=&quot;https://jamesclear.com/atomic-habits&quot;&gt;Atomic Habits&lt;/a&gt;, which was tremendously insightful. Using the steps of cue, craving, response, and reward, seems a logical path to habit formation. That said, I haven’t built any habits using the methodologies. Until now…&lt;/p&gt;
&lt;p&gt;My habit of setting up blogs, and doing nothing with them, is going to change. From today. I’m embracing some of the concepts from &lt;a href=&quot;https://ship30by30.com/&quot;&gt;Ship 30 by 30&lt;/a&gt; and mixing that with Atomic Habits, to see how that goes. Here’s the theory.&lt;/p&gt;
&lt;p&gt;Ship 30 by 30 has a &lt;a href=&quot;https://startwritingonline.com/&quot;&gt;short email course&lt;/a&gt;, with some great ideas I resonate with, but I do think some ideas are promoted for the upsell to the paid course. The ideas of improving your writing, building the habit, writing to clarify your ideas, and using writing to link up with like minded people all sound great. They mesh with my thoughts on the matter (and my confirmation biases… However, I think the trashing of blogs and the essentialness of writing in a community, are more related to the long course they are selling.&lt;/p&gt;
&lt;p&gt;Don’t get me wrong, I would love to do the long course, and think it’s probably a better idea to start writing regularly in a more structured, and accountable, way. But I’m in a place where I don’t care for people to hear what I have to say yet – it’s still too unformed – so I’m happy to twiddle away on my blog with no readers. That said, I’m stealing the 250 words a day for 30 days concept, and kicking it off today.&lt;/p&gt;
&lt;p&gt;What will I write about? No idea. I imagine it will be more of a journal at I stumble along at the start. I’m not a “thought leader” and, though I’m working on a startup, I’m not a Founder of any note, in fact, I haven’t made a single dollar online, yet.&lt;/p&gt;
&lt;p&gt;So here’s where I’m at currently. Father, husband, working a full-time job as a game developer, building EdScreening on nights and weekends. I’m planning on, belatedly, starting Rob Walling’s &lt;a href=&quot;https://robwalling.com/2015/03/26/the-stairstep-approach-to-bootstrapping/&quot;&gt;Stairstep approach&lt;/a&gt; with a mostly hands-off T-Shirt store, and have a few micro sass ideas waiting for me to have some time to get them started. And I’m writing 250+ words a day for the next 30 days.&lt;/p&gt;
&lt;p&gt;Wish me luck 😃&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>What is Neurodiversity</title>
      <link href="https://www.swoon.com.au/what-is-neurodiversity/"/>
      <updated>2021-12-08T00:00:00Z</updated>
      <id>https://www.swoon.com.au/what-is-neurodiversity/</id>
      <content type="html">&lt;p&gt;The sooner the better. I wish I’d learned that earlier.&lt;/p&gt;
&lt;p&gt;When I was young I was very entrepreneurial. I’d buy out the favourite lollies at the shop across from the school when supplies were low. Then sell them at a 100% markup at school. I’d clean cars, mow lawns, deliver papers, recycle bottles, you name it, I was in there. But slowly, life started to happen.&lt;/p&gt;
&lt;p&gt;I went to college to study computer engineering, then dropped out after a couple of years as the work seemed horrible – I’d been writing computer games before college, and loved it, but the college I went to aimed at churning out developers for the public service. All we did was work on “black box” code, we had some input and had to transform it into some output, but had no broader context. It was boring as hell and killed all my passion for computers. I imagine my life would be very different now if I had just stuck with game development 30 years ago…&lt;/p&gt;
&lt;p&gt;Today I am back as a developer, but between then and now I’ve worked in the public service, done a degree in philosophy, travelled the world a few times, worked as a video guy, worked as a 3D animator, worked as a game developer, been involved in a couple of startups, got married, got a mortgage, and had kids.&lt;/p&gt;
&lt;p&gt;Now I’m back trying to get my own thing going. I always had it in the back of my mind, I was just &lt;em&gt;waiting for the right time&lt;/em&gt;. When I just had some cash built up, when I just had the contacts, when I just… It never really happens. But the main thing I’ve learned is that the right time is now. The right age is now. The time will never be perfect, you will never have everything lined up, just get started.&lt;/p&gt;
&lt;p&gt;As soon as you get started you begin seeing things in a different way, you look at things differently, you listen to conversations differently. Even if it’s just a T-Shirt shop on Shopify, for an hour a week, start &lt;strong&gt;something&lt;/strong&gt;, and you’ll see the world in a different way.&lt;/p&gt;
&lt;p&gt;Lastly, the other fundamental thing I have learned, that took me way too long, is that all those people who say start marketing as soon as you start building are right. In fact, start the marketing before starting a business, get to know what people are experiencing, talk to them, then start to solve their problems.&lt;/p&gt;
&lt;p&gt;But do it now.&lt;/p&gt;
&lt;p&gt;30 by 30 #3&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Best Age to Start a Business</title>
      <link href="https://www.swoon.com.au/best-age-to-start-a-business/"/>
      <updated>2021-12-09T00:00:00Z</updated>
      <id>https://www.swoon.com.au/best-age-to-start-a-business/</id>
      <content type="html">&lt;p&gt;The sooner the better. I wish I’d learned that earlier.&lt;/p&gt;
&lt;p&gt;When I was young I was very entrepreneurial. I’d buy out the favourite lollies at the shop across from the school when supplies were low. Then sell them at a 100% markup at school. I’d clean cars, mow lawns, deliver papers, recycle bottles, you name it, I was in there. But slowly, life started to happen.&lt;/p&gt;
&lt;p&gt;I went to college to study computer engineering, then dropped out after a couple of years as the work seemed horrible – I’d been writing computer games before college, and loved it, but the college I went to aimed at churning out developers for the public service. All we did was work on “black box” code, we had some input and had to transform it into some output, but had no broader context. It was boring as hell and killed all my passion for computers. I imagine my life would be very different now if I had just stuck with game development 30 years ago…&lt;/p&gt;
&lt;p&gt;Today I am back as a developer, but between then and now I’ve worked in the public service, done a degree in philosophy, travelled the world a few times, worked as a video guy, worked as a 3D animator, worked as a game developer, been involved in a couple of startups, got married, got a mortgage, and had kids.&lt;/p&gt;
&lt;p&gt;Now I’m back trying to get my own thing going. I always had it in the back of my mind, I was just &lt;em&gt;waiting for the right time&lt;/em&gt;. When I just had some cash built up, when I just had the contacts, when I just… It never really happens. But the main thing I’ve learned is that the right time is now. The right age is now. The time will never be perfect, you will never have everything lined up, just get started.&lt;/p&gt;
&lt;p&gt;As soon as you get started you begin seeing things in a different way, you look at things differently, you listen to conversations differently. Even if it’s just a T-Shirt shop on Shopify, for an hour a week, start &lt;strong&gt;something&lt;/strong&gt;, and you’ll see the world in a different way.&lt;/p&gt;
&lt;p&gt;Lastly, the other fundamental thing I have learned, that took me way too long, is that all those people who say start marketing as soon as you start building are right. In fact, start the marketing before starting a business, get to know what people are experiencing, talk to them, then start to solve their problems.&lt;/p&gt;
&lt;p&gt;But do it now.&lt;/p&gt;
&lt;p&gt;30 by 30 #3&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Reluctant Shiny Object Syndrome</title>
      <link href="https://www.swoon.com.au/reluctant-shiny-object-syndrome/"/>
      <updated>2021-12-10T00:00:00Z</updated>
      <id>https://www.swoon.com.au/reluctant-shiny-object-syndrome/</id>
      <content type="html">&lt;p&gt;I’ve been working on EdScreening for over a year now. Every night and weekend. I’m overworked, exhausted, and close to burnout.&lt;/p&gt;
&lt;p&gt;And now I’m looking to start a new side project.&lt;/p&gt;
&lt;p&gt;My problem is that I like to have full control over my side projects, and I’ve kicked this one off with a small team of co-founders. To be clear, I never would have got this started by myself, there’s far too much domain expertise involved well outside of my domain.&lt;/p&gt;
&lt;p&gt;My domain is the web. I’m comfortable with making and marketing things on the web. EdScreening rests on ongoing academic research which the domain expert is extremely good at. It will have a lot of B2G aspects which I’m happy for other people to be in control of. There will also be a lot of biz dev things that I’m excited to have off my plate. But I understand making things for the web.&lt;/p&gt;
&lt;p&gt;The problem here is the Venn diagrams of people’s domain expertise. I can’t do the web stuff in isolation. The product exists only on the web. By necessity, everyone has an interest in how the site looks, the site copy, how it’s marketed, the site voice, and so on. I’m currently struggling with people wanting extra screeners (products) being built, and my own desire to kick into marketing mode the second the first product is launched.&lt;/p&gt;
&lt;p&gt;This stems from a number of my previous failures, most of which can be locked down to a failure to market before, and after, launch. It’s very tempting, as a developer, to think “this is great, people will find it and love it”, and then wait… And no one comes. I’ve had happen more than a few times. I’ve learned my lesson, but the other team members haven’t. So we want to move this in different directions once it’s launched.&lt;/p&gt;
&lt;p&gt;One side effect of this is that I am now looking at getting started on a tertiary project, one I have full control over. Just a toe in the water at the moment, and a few emails, preparing if the main project goes south.&lt;/p&gt;
&lt;p&gt;I think I can talk people around to focus on marketing for a couple of months. If I can’t, I will have to go with consensus for a while but will have to slow down on new products on EdScreening, as I will be launching a new project pretty quickly if I can’t see any traction happening.&lt;/p&gt;
&lt;p&gt;Step one here is to see if we can come to an agreement on a roadmap for the next few months. Let’s see how that goes.&lt;/p&gt;
&lt;p&gt;Reluctant shiny object syndrome.&lt;/p&gt;
&lt;p&gt;30 by 30 #4&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>A Complete Lack of Nostalgia</title>
      <link href="https://www.swoon.com.au/a-complete-lack-of-nostalgia/"/>
      <updated>2021-12-11T00:00:00Z</updated>
      <id>https://www.swoon.com.au/a-complete-lack-of-nostalgia/</id>
      <content type="html">&lt;p&gt;An episode of NPR’s &lt;a href=&quot;https://www.npr.org/2021/10/13/1045812865/the-nostalgia-bone&quot;&gt;Throughline&lt;/a&gt; came my way via the &lt;a href=&quot;https://www.npr.org/podcasts/510307/invisibilia&quot;&gt;Invisibilia&lt;/a&gt; podcast this morning and it gave me a realisation. I have a complete lack of childhood nostalgia.&lt;/p&gt;
&lt;p&gt;Nothing from my childhood is appealing to me. Life keeps getting better since I left my childhood behind.&lt;/p&gt;
&lt;p&gt;As a kid I was bullied, I never felt like I fitted in, I never had friends, and I didn’t understand what was wrong with me. The bullying stopped after high school, but emotionally I carried it inside me for a long, long time. After my first time at University (computer engineering), I travelled through Asia for 9 months, one of the best times of my life, before coming back to Australia, moving to Sydney, and studying Philosophy at a university.&lt;/p&gt;
&lt;p&gt;I was much happier then and built a good group of friends. But I still carried a deep unease from my time at high school. It’s only through things I have recently learned, through my son, that things are starting to make sense.&lt;/p&gt;
&lt;p&gt;He’s gifted and with high functioning autism (previously called Aspberger’s syndrome). He’s logical, rational, a bit of a geek, and refuses to bow to social conventions to be something he’s not. He’s like a fucking mirror of me as a kid. Luckily we found out early, and have signed him up for some programs on social skills.&lt;/p&gt;
&lt;p&gt;I never want him to pretend to be someone he isn’t. I want him to learn how he can be himself, while still having a healthy social life. It’s taken me a long time to learn that can be as simple as not pointing out when someone else is wrong, not believing that others will think the same way as you once you explain things to them, and learning that it’s OK to sometimes do things you don’t want to do if it makes others happy (a bit of meditation helps here).&lt;/p&gt;
&lt;p&gt;Hopefully, he can form the childhood memories I never had and develop a nostalgia for his idyllic childhood. Me, I’ll keep looking forwards, and save my nostalgia for my post-high school life.&lt;/p&gt;
&lt;p&gt;30 by 30 #5&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Mythical E-commerce Opportunity</title>
      <link href="https://www.swoon.com.au/mythical-e-commerce-opportunity/"/>
      <updated>2021-12-12T00:00:00Z</updated>
      <id>https://www.swoon.com.au/mythical-e-commerce-opportunity/</id>
      <content type="html">&lt;p&gt;I randomly came across an e-commerce opportunity yesterday, and I’m not sure I know what to do with it.&lt;/p&gt;
&lt;p&gt;While listening to a podcast with an e-commerce success story, they mentioned starting in a space hard for physical goods. I found that was interesting and, as usual, did some keyword research around some topics.&lt;/p&gt;
&lt;p&gt;I came across a niche with unbelievable numbers. &lt;strong&gt;32,000&lt;/strong&gt; monthly searches in Australia with &lt;strong&gt;zero&lt;/strong&gt; keyword difficulty. Of the top 30 related terms, the highest difficulty rating was &lt;strong&gt;two&lt;/strong&gt;. This is for a product that sells for between $70 - $700.&lt;/p&gt;
&lt;p&gt;It’s for a particular piece of furniture. My wife has, for years, wanted to start a business around designer objects, and this fits right into that space. So it’s one hell of an intersection.&lt;/p&gt;
&lt;p&gt;That said, I don’t want to do e-commerce with any level of seriousness. It’s not a space I find appealing. Also, I have code chops, and would much prefer to work on a SASS.&lt;/p&gt;
&lt;p&gt;My current thinking is a compromise. I plan to set up a WordPress site, work the SEO around the term, and maybe find some affiliate opportunities around it. At least plant a flag, and reserve some space for later.&lt;/p&gt;
&lt;p&gt;The best thing about this item is it’s not a new trend. Looking back over Google trends, it’s been stable for at least ten years. Staking a claim seems a pretty low-risk bet, and if I can get the traffic that I think is there, I may have to be a bit more serious about it.&lt;/p&gt;
&lt;p&gt;At least this new object isn’t too shiny!&lt;/p&gt;
&lt;p&gt;30 by 30 #6&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Into the Startup Space</title>
      <link href="https://www.swoon.com.au/into-the-startup-space/"/>
      <updated>2021-12-13T00:00:00Z</updated>
      <id>https://www.swoon.com.au/into-the-startup-space/</id>
      <content type="html">&lt;p&gt;EdScreening was accepted into a startup space. Now I need to figure out why I applied.&lt;/p&gt;
&lt;p&gt;When someone mentioned the idea to me, I couldn’t think why I should apply. I’m used to a bootstrapped mindset. But the idea gained appeal over time.&lt;/p&gt;
&lt;p&gt;The space is &lt;a href=&quot;https://www.uts.edu.au/current-students/opportunities/uts-startups&quot;&gt;UTS Startups&lt;/a&gt;, which looks like a great space. He’s the list of pros as I see it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Energy&lt;/strong&gt; – startups have a different energy, and I enjoy that vibe&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community&lt;/strong&gt; – I’ve heard enough people say connections and community are super important, and this looks like a great place for a like-minded community&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Investors&lt;/strong&gt; – I’m starting to think that once we have proven product/market fit and a scalable marketing channel, it may be a good idea to hook up with some investors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meetups&lt;/strong&gt; – This place hosts talks and networking meetups for different topics around the startup space, which may be super cool to attend&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt; – It’s a five-minute walk from my kids’ school. Next year that will be more important, as Toby starts high school, and his schedule won’t match Dylan’s.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Downsides, none that I can think of. There’s no cost and they don’t take any equity. There is an obligation to help other founders out, and do an occasional talk, but I’m thinking that’s more of a positive than a negative as it kicks in learning.&lt;/p&gt;
&lt;p&gt;But, most significantly, this seems like a real step forwards. A shift in mindset. I think this will shift my thinking on EdScreening and be highly motivating.&lt;/p&gt;
&lt;p&gt;30 by 30 #7&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Why I&#39;m not a Stoic</title>
      <link href="https://www.swoon.com.au/why-im-not-a-stoic/"/>
      <updated>2021-12-14T00:00:00Z</updated>
      <id>https://www.swoon.com.au/why-im-not-a-stoic/</id>
      <content type="html">&lt;p&gt;The Stoics were brilliant at finding meaning in life. Just not mine.&lt;/p&gt;
&lt;p&gt;For a number of years, I read the Stoics pretty thoroughly and was super impressed with the insights they came up with, and how they are still relevant today. So much so that the current dominant take on psychology, Cognitive Behavioural Therapy (CBT), is based on Stoic thought. So what’s the essence?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We only get raw data input from the world. It’s our choice of how we place significance on it&lt;/li&gt;
&lt;li&gt;We find meaning in directing our life towards our chosen path&lt;/li&gt;
&lt;li&gt;We cannot choose the outcome of what we can do, only choose how we approach it&lt;/li&gt;
&lt;li&gt;Like is not best lived by goals, but by continually improving our thoughts&lt;/li&gt;
&lt;li&gt;Happiness comes from our thoughts, not our external circumstances&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s kind of it. I 100% agree with all of those points and think the world would be a better place if more people lived that way.&lt;/p&gt;
&lt;p&gt;However…&lt;/p&gt;
&lt;p&gt;Stoic psychology is what gets all the focus and discussion, rightfully so as it seems a healthy mindset and approach to life. I try to use these principles daily as rules of thumb. But I’m not a Stoic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stoicism has three main components: logic, physics, and ethics.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Today people mainly talk about ethics, the development of inner calm, and self-discipline.&lt;/p&gt;
&lt;p&gt;Stoic logic was foundational in the development of logic and is still in use in Universities, but rarely used outside of the classroom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Their physics though, is a bit shit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In a nutshell (much paraphrasing follows), “For life to have meaning, we should live life in the way life is intended to be lived”. Huh? OK, let’s try again, “A person lives a life well if they live according to their place in nature. Their place is as the rational creature. They should live rationally.” WTF? OK, it all makes sense when you understand the Stoics thought of the Universe as a rational substance (logos). Wait, what?&lt;/p&gt;
&lt;p&gt;Stoics believed Zeus created/was the Universe, and mankind’s place in that universe was to be rational and to live well meant to live rationally. Some people water it down and say the Stoics may have meant ‘nature’ when they said Zeus. But it all boils down to the same point. For Stoicism to make sense as a whole philosophy requires believing in a rational, directed, universe. Which I think is bollocks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why you can’t have Stoicism without the Physics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Stoics had some great ideas on ethics and came up with some tools for life. But it all rests on unfounded assumptions. The Stoics often used metaphor to describe how Stoic philosophy needed all three aspects. Often an egg was used to show how the three parts fitted together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logic = the shell&lt;/li&gt;
&lt;li&gt;Ethics = the fruit&lt;/li&gt;
&lt;li&gt;Physics = The the yolk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You take one part of these away and it’s no longer an egg. Or Stoic Philosophy for that matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where that leaves me&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I had high hopes in the Stoics, but they faded as I studied their philosophy closer. I can’t possibly see the universe as directed or having a goal. I see chaos. I see Stoicism as some great tools to help me think, but there’s no way I would call myself a Stoic.&lt;/p&gt;
&lt;p&gt;30 by 30 #8&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Burnout</title>
      <link href="https://www.swoon.com.au/burnout/"/>
      <updated>2021-12-15T00:00:00Z</updated>
      <id>https://www.swoon.com.au/burnout/</id>
      <content type="html">&lt;p&gt;I’m well into burnout territory now.&lt;/p&gt;
&lt;p&gt;Working a full-time job, having two kids I want to be there for, doing a startup on the side, doing other smaller projects to keep options open, being there as a husband and son. It’s a lot to deal with. But I think I was fine until recently.&lt;/p&gt;
&lt;p&gt;There was an event in the startup that made me take two weeks off it. I’m used to working alone in this environment and am fairly experienced and knowledgeable in the field. Working with a team who are not from this space has its issues. There are some directions the company is heading in that I 100% disagree with, and just won’t do. It boils down to a drive to build more products before doing any marketing. I’ve seen that fail several times before and I’m not going to do it again. That disagreement is not the point here though, it’s the feeling I’ve had since that meeting. Burnout.&lt;/p&gt;
&lt;p&gt;I feel less energised for the startup, I feel like I’m being treated as an employee, and I feel like I’d be better off spending my time somewhere I can be more productive.&lt;/p&gt;
&lt;p&gt;I once read a quote along the lines of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You don’t get tired from the things you do, you get tired from the things you don’t do.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I feel exhausted, unmotivated, and unfocused.&lt;/p&gt;
&lt;p&gt;It’s most likely overwork and needing a break. I’m probably taking things out of context. But damn, the tiredness is real.&lt;/p&gt;
&lt;p&gt;I can find a way out of this personally through mini-meditations and mental resets. But it doesn’t solve the issue of motivation. It’s gotten to the stage of having to prepare simple bits of work, and that leads me into doing some work, but nothing like the motivation I had a month ago.&lt;/p&gt;
&lt;p&gt;I’ll keep an eye on it, and see how I feel after the break. In the meantime, I think have to just slow down for a couple of weeks and get some rest.&lt;/p&gt;
&lt;p&gt;30 by 30 #9&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Going against Rob Walling</title>
      <link href="https://www.swoon.com.au/going-against-rob-walling/"/>
      <updated>2021-12-16T00:00:00Z</updated>
      <id>https://www.swoon.com.au/going-against-rob-walling/</id>
      <content type="html">&lt;p&gt;For years I’ve been listening to &lt;a href=&quot;https://www.startupsfortherestofus.com/&quot;&gt;Startups For the Rest Of Us&lt;/a&gt; podcast. He’s super smart and experienced and I place a lot of trust in what he says.&lt;/p&gt;
&lt;p&gt;But now I’m doing the opposite.&lt;/p&gt;
&lt;p&gt;It’s not like I’m deliberately doing the opposite, his ideas are solid, it’s just they don’t fit what I’m working on. The smart thing for me would probably be to drop what I’m working on and fit more into his &lt;a href=&quot;https://robwalling.com/2015/03/26/the-stairstep-approach-to-bootstrapping/&quot;&gt;stair step approach&lt;/a&gt;. But…&lt;/p&gt;
&lt;p&gt;Here’s what I’m working on: &lt;strong&gt;EdScreening is a way for parents to help kids with learning problems&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;At the moment this involves spending thousands of dollars and can take a few years. You need to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get referrals to specialists&lt;/li&gt;
&lt;li&gt;Book appointments with specialists with up to a year’s wait&lt;/li&gt;
&lt;li&gt;Get specialist report (up to a month after appointment)&lt;/li&gt;
&lt;li&gt;Frequently find out they were the wrong type of specialist. Start at the top again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve been through this exact process, and so have my co-founders. It sucked.&lt;/p&gt;
&lt;h2&gt;Here’s why Rob’s approach doesn’t apply to us&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;In my experience, the biggest pitfall that trips up first-time product people is trying to create something too complex.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To solve the problem we need complexity. A small product wouldn’t address the issue. EdScreening is research-based. What that involves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An expert does hundreds of hours of research to create a preliminary screening model&lt;/li&gt;
&lt;li&gt;Do a &lt;em&gt;pilot&lt;/em&gt; screening with hundreds of people to check the initial results&lt;/li&gt;
&lt;li&gt;Get another expert to analyse the pilot screening for model/expectations fit&lt;/li&gt;
&lt;li&gt;Create custom support strategies for every question on the model&lt;/li&gt;
&lt;li&gt;Programmatically create a custom report for all possible response combinations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That all has to rest on a backend to do the work, and a front end that works for customers.&lt;/p&gt;
&lt;p&gt;From an MVP approach, the only thing I think we could skip would be the site and report design aspects. Without an academically solid model and report, it would not be a &lt;em&gt;viable&lt;/em&gt; product.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I prefer B2B because businesses purchase based on value. If you can save them money or make them money, you can justify your price. Consumers don’t value their time as much.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A few points.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We are starting as B2C. Quicker purchase decisions and does not require a multilevel admin back end.&lt;/li&gt;
&lt;li&gt;We are addressing a serious emotional issue for parents and kids. People will pay to have that addressed.&lt;/li&gt;
&lt;li&gt;We &lt;em&gt;will&lt;/em&gt; go to B2C/B2E but the sales cycles can be up to two years or more.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Your order of importance is market, marketing, aesthetic, function&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;strong&gt;pivotal&lt;/strong&gt; issue here is there is no market for what we’re making.&lt;/p&gt;
&lt;p&gt;Let me qualify that. There is no &lt;em&gt;online&lt;/em&gt; market for what we’re selling. Our main competitors are in-person consultations with experts, and the in-person market has waitlists a year long.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developmental Psychologists&lt;/li&gt;
&lt;li&gt;Child Psychologists&lt;/li&gt;
&lt;li&gt;Child Psychiatrists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have to target these fields for SEO but create the online market.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;There are some quick online quizzes similar to what we’re doing, but they tend to be super light and address a single developmental issue. We’re covering multiple developmental differences in one screening, which doesn’t happen &lt;em&gt;anywhere&lt;/em&gt; else.&lt;/p&gt;
&lt;p&gt;My co-founders and I have all been through the current process, and it’s a pain in the arse that people really want to be solved.&lt;/p&gt;
&lt;p&gt;Our main problems are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting people to know the problem is addressable&lt;/li&gt;
&lt;li&gt;Letting people know our solution exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;HUGE&lt;/strong&gt; problems, but I feel the effort and risk are worth it. It literally is an opportunity to help millions of people.&lt;/p&gt;
&lt;p&gt;30 by 30 #10&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Shopping for Accountants</title>
      <link href="https://www.swoon.com.au/shopping-for-accountants/"/>
      <updated>2021-12-17T00:00:00Z</updated>
      <id>https://www.swoon.com.au/shopping-for-accountants/</id>
      <content type="html">&lt;p&gt;We just changed our accountant. They charged a quarter of the fees.&lt;/p&gt;
&lt;p&gt;About 20 years ago, I set up a company with a friend. We asked a shared friend who had a company which accountant they used. We signed up with them. They were very good at handling tax. I had a small exit a few years later and wanted to set up a family trust. We went back to the same accountant and got things sorted.&lt;/p&gt;
&lt;p&gt;I basically lived off that exit cash for a few years, did some work on the side, retrained myself as a dev, and used what was left from the exit as a house deposit. I got a job as a developer and have been doing that ever since.&lt;/p&gt;
&lt;p&gt;All the while stuck with a complicated family trust, company, and a feeling that one day I would need them. But the accounting fees to keep things going were pretty stupid.&lt;/p&gt;
&lt;p&gt;For last year I’ve been working on a startup idea and, for a couple of months, e-commerce sites on the side. I decided it was time to revisit the whole accountant thing. Especially since we hadn’t done tax for 4 years, and I had a pit in my stomach for how much it would cost. We cast a wider net in the search this time.&lt;/p&gt;
&lt;p&gt;Through my wife’s cousin’s co-worker, we got an excellent recommendation. The new accountant covered the last 4 years of tax over a few weeks: Mitra and my personal tax, a side business of Mitra’s, the company and trust. They were responsive, thorough, and professional. The total cost was around what we paid annually with the last accountant.&lt;/p&gt;
&lt;p&gt;The difference was the last accountant was really for much larger businesses. In our first meeting, they talked about setting something up in Hong Kong for tax reasons. They were excellent, but we were too small for them to prioritise. The new accountant is perfect for our size and situation, and costs around a quarter of the price.&lt;/p&gt;
&lt;p&gt;It pays to shop around.&lt;/p&gt;
&lt;p&gt;30 by 30 #11&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>PixiJS Particles Documentation</title>
      <link href="https://www.swoon.com.au/pixijs-particles-documentation/"/>
      <updated>2022-12-07T00:00:00Z</updated>
      <id>https://www.swoon.com.au/pixijs-particles-documentation/</id>
      <content type="html">&lt;p&gt;I was converting an old game engine I wrote over to PixiJS v7 and discovered&lt;br /&gt;
Pixi Particles didn’t work with v7. I had a look at patching particles to v7,&lt;br /&gt;
found it pretty straight forward and put in a PR, which was merged. But I&lt;br /&gt;
discovered all sorts of things I hadn’t known about Pixi Particles before. I&lt;br /&gt;
thought I’d write it up.&lt;/p&gt;
&lt;p&gt;It turned out it needed a site for itself. I put some Pixi Particle Emitter documentation up here: &lt;a href=&quot;https://www.pixiparticles.com/&quot;&gt;PixiJS Particles Manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I hope it’s of use.&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Lessons Learned</title>
      <link href="https://www.swoon.com.au/lessons-learned/"/>
      <updated>2022-12-08T00:00:00Z</updated>
      <id>https://www.swoon.com.au/lessons-learned/</id>
      <content type="html">&lt;p&gt;Well, glad to be out of the train wreck that is now ▋▋▋▋▋▋▋▋▋▋▋ (company name redacted to protect the innocent). I learned a lot from the experience, and I’m writing it down while it’s all still fresh in my head. There are lessons to be learned.&lt;/p&gt;
&lt;p&gt;The backdrop: a few years ago, one of the other parents at my sons’ school approached me with an idea for a new business. She had met an expert academic in giftedness and learning differences, and they were keen to turn it into a web app.&lt;/p&gt;
&lt;h3&gt;How far did it get?&lt;/h3&gt;
&lt;p&gt;It was about to launch. I’d been waiting for the final report content. I received it and was in the process of completing the app. It was two weeks from our first product launch.&lt;/p&gt;
&lt;p&gt;That was about almost four months ago.&lt;/p&gt;
&lt;p&gt;Then the shit hit the fan.&lt;/p&gt;
&lt;h3&gt;The Problems As I See Them&lt;/h3&gt;
&lt;h4&gt;Not knowing people’s competencies&lt;/h4&gt;
&lt;p&gt;With a small startup like this, everyone on the team should build the company’s capabilities.&lt;/p&gt;
&lt;p&gt;There should be no place for someone with no experience in business, copy, marketing, tech, design, or education. Being nice just isn’t enough.&lt;/p&gt;
&lt;h4&gt;&lt;ins&gt;Know who is involved, and have clear responsibilities. Never assume you will work it out as you go.&lt;/ins&gt;&lt;/h4&gt;
&lt;h3&gt;Competing idea: Funded V Bootstrapped&lt;/h3&gt;
&lt;p&gt;Some of the team wanted this to be a funded start-up. I never thought it was a good prospect for funding and wanted to bootstrap.&lt;/p&gt;
&lt;p&gt;The pro-finding side wanted to target schools and education departments as the first customers – B2E (business to enterprise). I pushed for targeting parents and small independent schools to start – B2C (business to consumer).&lt;/p&gt;
&lt;p&gt;I’ve worked for years in B2E EdTech. Getting into the student mental health space requires levels of administration in the product, complex hosting necessitating a DevOps team, and numerous long reviews of proposed system architecture. We didn’t have the time or budget for any of that.&lt;/p&gt;
&lt;p&gt;I wanted to get the product out there and see if it was viable to consumers first. We tried to do both:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They tried to get funding and market to schools and governments.&lt;/li&gt;
&lt;li&gt;I aimed to develop the product for parents.&lt;/li&gt;
&lt;li&gt;We tried to cater to both markets with the site.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;&lt;ins&gt;Have a single agreed-upon audience or you cater to noone.&lt;/ins&gt;&lt;/h4&gt;
&lt;h3&gt;Competing idea: Iterating V finalizing a product before launch&lt;/h3&gt;
&lt;p&gt;I was keen on getting a product out early and iterating, and would have launched it two years ago. But others wanted everything final before launch. I should have persuaded them to launch early and iterate. I failed.&lt;/p&gt;
&lt;p&gt;The problem here is our backgrounds. I’m used to working fast, getting things done, learning from mistakes, and iterating. They came from fields where everything was triple-checked before moving forward. They are incompatible ways of working.&lt;/p&gt;
&lt;h4&gt;&lt;ins&gt;Decide how to move forward before starting.&lt;/ins&gt;&lt;/h4&gt;
&lt;h3&gt;Warning signs I missed&lt;/h3&gt;
&lt;p&gt;There were a few things I let slide too easily. Mainly because I really wanted to see the product get out there. It would have made the world a bit better.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Starting with a trademark&lt;/strong&gt;. As I was keen on bootstrapping this, I should have bailed when one team member spent thousands of dollars upfront trademarking the company name. And not in the USA but in &lt;em&gt;Australia&lt;/em&gt;??? It was a sign of things to come.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Paying too little attention to spending.&lt;/strong&gt; While I was being a tight arse, watching every penny, there was a &lt;em&gt;lot&lt;/em&gt; of money spent on things I didn’t even hear about until the company was in a financial crunch. I didn’t lose money, but was left with no choice but to take a cheap buyout.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;People ignoring warnings.&lt;/strong&gt; I would point out risks and consequences and believe they were understood. A team member with no experience in the field continually ignore the warnings, and was shocked at the consequences. I should have triple-checked clear understanding.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Outsourcing core business aspects.&lt;/strong&gt; Like website copy. We understood the product and space best. Outsource later, but become the experts first.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;So what’s next for ▋▋▋▋▋▋▋▋▋▋▋?&lt;/h3&gt;
&lt;p&gt;¯&#92;&lt;em&gt;(ツ)&lt;/em&gt;/¯&lt;/p&gt;
&lt;p&gt;I’ve deleted my email account, everything else was handed over to the company a few months ago, and I got a few grand.&lt;/p&gt;
&lt;p&gt;At that time it became clear that one individual pushed hard to pursue B2B, with no infrastructure in place for B2B, and was more persuasive than me. I saw B2B as a waste of energy at that point, so I stepped out of the way.&lt;/p&gt;
&lt;p&gt;A few months later they still had no product launched and had run out of money. The ongoing burn rate was &lt;em&gt;crazy&lt;/em&gt; for a self-funded company and is being spent poorly. Everyone except one person took a low-priced buyout rather than end up in debt.&lt;/p&gt;
&lt;p&gt;I think the only chance forward for ▋▋▋▋▋▋▋▋▋▋▋ is finding a generous benefactor with a Rolodex full of business contacts to get things in order. If nothing changes dramatically, it will probably keep thrashing about aimlessly until the last person involved runs out of money.&lt;/p&gt;
&lt;p&gt;Maybe then I’ll be able to buy back the IP and build it focused as a bootstrapped B2C product. That could be fun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And next time I’ll have more warning signs to keep in mind.&lt;/strong&gt;&lt;/p&gt;
</content>
    </entry>
    
    <entry>
      <title>Agile Development and Web Games</title>
      <link href="https://www.swoon.com.au/agile-development-and-web-games/"/>
      <updated>2025-11-25T00:00:00Z</updated>
      <id>https://www.swoon.com.au/agile-development-and-web-games/</id>
      <content type="html">&lt;p&gt;Agile software development relies on good test coverage, frequent small updates, and CI as core practices. These all break when it comes to web games. Let’s look at these points individually.&lt;/p&gt;
&lt;h3&gt;Test coverage&lt;/h3&gt;
&lt;p&gt;I love tests. I love TDD. But once the canvas gets involved things go pear shaped. An HTML canvas is essentially an animated bitmap. If you look at a canvas element in the DOM it’s going to look something like:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;canvas&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;game&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;1440&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;764&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;canvas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that’s it. No individual elements are available; no buttons, no positions, no audio. So, how do you write a test for a game that runs on the canvas asserting that firing a canon at a tank hits the tank? The standard answer has always been “You don’t”. Coming from a Rails / Node background I found that shocking.&lt;/p&gt;
&lt;p&gt;That’s not to say there is NO testing. But in my experience it has always been extremely limited. Game engines can have tests written for them, which is a great start. But the tests tend to revolve purely around the code, not caring about how a game implements the engine or what happens with the game on the canvas. Quick example:&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;testing constructor&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token function&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;should set up constructor and emit Events related to Background&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;		background &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;EE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; store&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; displayView&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; responsive&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;		&lt;span class=&quot;token function&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ee&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Events&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;SCREEN_RESIZE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The usual process is to check public module interfaces and method input/output. No canvas required.&lt;/p&gt;
&lt;p&gt;I once worked where we had hundreds (thousands?) of canvas mini games implemented and they went one step further. There was a batch job that loaded the games sequentially, waited for assets to preload, and the game to initialise. If that worked the test passed. Again, the canvas wasn’t used, it was just waiting for certain events to be emitted. It was the only thing remotely involving the canvas in the CI tests.&lt;/p&gt;
&lt;p&gt;There are a number of work arounds here. The most basic is logging element positions and bounds and using the logged messages to determine if a test passes. But there are two problems here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We need a way to mock user interaction&lt;/li&gt;
&lt;li&gt;Asset bounds don’t reflect bounds or a sprite&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve seen a recent development that looks very interesting &lt;a href=&quot;https://www.askui.com/blog-posts/html5-canvas-testing-techniques-tools-and-best-practices&quot;&gt;Caesr&lt;/a&gt;. I’ve asked our QA to take this for a spin and see if it looks promising as it may be the answer we’ve been looking for. I really hope it’s going to work with complex dynamic games, not just charts, and come out reasonably priced.&lt;/p&gt;
&lt;h3&gt;Frequent small updates&lt;/h3&gt;
&lt;p&gt;OK, this one is pretty self explanatory. It depends on what you’re building. If you’re making something long running, with frequent game updates like Candy Crush, then you’re fine here. But that’s not the world I’ve ever worked in. We create games which are tested then released. The only updates are bug fixes. It’s nothing like a continually updating web site or business app. It’s also pointless to release before we have a completed version.&lt;/p&gt;
&lt;h3&gt;CI&lt;/h3&gt;
&lt;p&gt;See the point above. I did work on one location with frequent deploys and CI, but they were almost always either releasing a business logic update to the site, or the occasional new game. Once a game had been released it was rarely touched again except for bug fixes.&lt;/p&gt;
&lt;h3&gt;Where to from here?&lt;/h3&gt;
&lt;p&gt;I’m currently putting together the bits of Agile that work in our game dev flow to form some kind of mini manifesto that makes sense in our little corner of the web. I’m looking at ways AI Assisted Engineering could make our game dev flow more fun for the devs and produce better product, quicker, and then posting my findings here. This is my journey log.&lt;/p&gt;
</content>
    </entry>
</feed>