<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://calvinflegal.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://calvinflegal.com/" rel="alternate" type="text/html" /><updated>2026-05-27T11:27:32+00:00</updated><id>https://calvinflegal.com/feed.xml</id><title type="html">Calvin Flegal</title><entry><title type="html">What I’ve Learned (So Far) Building Online Mini Games with Elixir and Swift</title><link href="https://calvinflegal.com/2026/05/24/what-ive-learned-so-far-building-online-mini-games-with-elixir-and-swift.html" rel="alternate" type="text/html" title="What I’ve Learned (So Far) Building Online Mini Games with Elixir and Swift" /><published>2026-05-24T00:00:00+00:00</published><updated>2026-05-24T00:00:00+00:00</updated><id>https://calvinflegal.com/2026/05/24/what-ive-learned-so-far-building-online-mini-games-with-elixir-and-swift</id><content type="html" xml:base="https://calvinflegal.com/2026/05/24/what-ive-learned-so-far-building-online-mini-games-with-elixir-and-swift.html"><![CDATA[<p>My most recent side project is a little social arcade called Migo Games. You can check it out on the <a href="https://apps.apple.com/us/app/migo-games/id6758592333">App Store for Mac and iOS</a>. <del>You can also play one of the games on the web at <a href="https://migo.games">migo.games</a>.</del> EDIT: sorry, I removed the web client to focus on less code.</p>

<p>It goes without saying that a lot has changed in the age of AI coding. I really can’t say I wrote <em>any</em> of the code. Keep in mind the date of publication of this post as well. Whatever I say about AI is likely to be out of date within weeks or months.</p>

<p>I do read the code, well, mostly. I certainly understand its design. I think that’s still really important with AI.</p>

<p>The tech stack of Migo Games is Elixir on Phoenix and Swift with SpriteKit. That’s really it. The back end runs on Fly.io. It’s got a managed Postgres database on Crunchy Bridge. One of the things I’m really proud of is the app’s lean binary size. At the time of writing it’s just a few megabytes. I think I added one Swift dependency so far, and that’s a Phoenix socket client library. I’m old enough to remember Nintendo 64. Mario 64 was like 8 MB, and I think most of it was music. My God is that amazing software. Anyway, I think AI reduces the need for so much bloat if one is mindful, and I think that’s really great.</p>

<p>Elixir has been awesome. It’s been so neat to have the core game unit, the room, exactly match the back-end process model. Talk about a good way to scale software. I remember reading a Cloudflare post about their Durable Objects that mentioned such an idea. I can’t easily find the link. Anyway, I’m confident the games could be fairly easily scaled because of this match. Then there are all the other benefits of Elixir such as the fault tolerance of this model. One room having a problem is not going to crash my whole system. I’m not really qualified to speak to all the cool parts of Elixir, but I’ll say I’ve been very happy with my decision to try it. If I need to add admin functionality or background tasks or anything else, I have all of the BEAM and Phoenix features right there waiting for me. I’m happy I didn’t just go with Node or Bun as would have been the default choice for a guy whose best language is TypeScript.</p>

<p>I could and maybe should say more about the architecture, but I’ll leave that for some other post.</p>

<p>Also, I would encourage others to target Mac in addition to iOS for a reason you might not expect: build times. The simulators and Xcode are really pretty slow. It’s all a lot faster if you’re targeting Mac.</p>

<p>In the times before AI, I probably would have principally targeted the web. But in truth, and this is especially true of the iPhone, the web has really disappointed me in terms of performance when compared to native. It’s always outdone by native. <del>You can even try this yourself with Migo! Play <a href="https://migo.games/arrow">Arrow on the web</a> then go try it on the native iPhone version.</del> The cute haptics, the full screen, the animations, it’s really just not close.</p>

<p>EDIT: Same reason as above, removed to focus codebase.</p>

<p>Really none of this would have been possible without AI, so really I’m pretty grateful to be building software in this era. There are things I miss about the before times. Coaching clankers isn’t as prone to flow as writing syntax yourself. Oh well.</p>

<p>This isn’t to say that AI has solved everything. All the hardest parts of making successful software are still here. One of them is of course finding users/distribution. The clanker can’t really match my software to people from my repo. Bummer. In fact, there’s so much more software being written now that this problem is actually harder! I saw a chart showing tge explosion of number of apps in the app store from AI. Crazy stuff.</p>

<p>That’s all for now I guess. Give the games a shot. Leave a nice review in the App Store if you’re up for it. Happy building. <a href="https://news.ycombinator.com/item?id=48256053">Discuss on HN</a> if you’d like.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[My most recent side project is a little social arcade called Migo Games. You can check it out on the App Store for Mac and iOS. You can also play one of the games on the web at migo.games. EDIT: sorry, I removed the web client to focus on less code.]]></summary></entry><entry><title type="html">Comparing Online Music Mastering Services (e-mastering)</title><link href="https://calvinflegal.com/2022/04/02/comparing-online-mastering-services.html" rel="alternate" type="text/html" title="Comparing Online Music Mastering Services (e-mastering)" /><published>2022-04-02T00:00:00+00:00</published><updated>2022-04-02T00:00:00+00:00</updated><id>https://calvinflegal.com/2022/04/02/comparing-online-mastering-services</id><content type="html" xml:base="https://calvinflegal.com/2022/04/02/comparing-online-mastering-services.html"><![CDATA[<p>I’m releasing another song on April 15th. Below you’ll find the result of the
mastering of my final mix by a few different services. There are lots of other
comparison write-ups on the internet that compare these services and many
others, so I’ll be brief and mostly let you compare the results yourself. Most
parameters were set moderately, to Rock / Pop settings where applicable.</p>

<p>If you like the song, the Spotify pre-save link is <a href="https://distrokid.com/hyperfollow/thebingeeffect/shoulder-to-shoulder">here</a>, and you could
follow me on Spotify <a href="https://open.spotify.com/artist/16MSVHbEEVtCo1G9QjyQAs?si=Dsq2677IScyJq1NweDat2g">here</a>.</p>

<p>I’m loading 320 kpbs mp3s by default for performance, but you can switch to
uncompressed if you’d like.</p>

<p><label class="form-switch">
<input type="checkbox" id="hi-def" />
<i></i>
Use Uncompressed WAVs
</label></p>

<div>
<h2>Metropolis (what I'm publishing) - mastering done by an engineer at the
studio</h2>
<div class="wavesurfer" id="metropolis">
<div id="waveform" />
<button id="playpause">Play / Pause</button>
</div>
</div>

<div>
<h2>Cloudbounce - e-mastering - "Rock / Pop" settings</h2>
<div class="wavesurfer" id="cloudbounce">
<div id="waveform" />
<button id="playpause">Play / Pause</button>
</div>
</div>

<div>
<h2>Landr - e-mastering - "Balanced / Medium" settings</h2>
<div class="wavesurfer" id="landr">
<div id="waveform" />
<button id="playpause">Play / Pause</button>
</div>
</div>

<div>
<h2>SoundCloud - e-mastering - "Clear Sky @ 73 percent"</h2>
<div class="wavesurfer" id="soundcloud">
<div id="waveform" />
<button id="playpause">Play / Pause</button>
</div>
</div>

<div>
<h2>My own simple approach: UA Oxford Inflator -&gt; Apple Adaptive Limiter</h2>
<div class="wavesurfer" id="mine">
<div id="waveform" />
<button id="playpause">Play / Pause</button>
</div>
</div>

<div>
<h2>Final Mix / Input (pre-mastering)</h2>
<div class="wavesurfer" id="final">
<div id="waveform" />
<button id="playpause">Play / Pause</button>
</div>
</div>

<h2>My Conclusions &amp; Opinions</h2>
<p>Mastering is a tough thing to do. The “Loudness Wars” make it very easy to
ruin your mixes by trying to be as loud as what’s on the radio, etc. It’s also a
subtle art – it may be tough for some to hear differences between these.</p>

<p>My favorite master here is the Metropolis one. However, at around $100 per
track, Metropolis can be somewhat expensive compared to the e-mastering options above, each of which are
a cheap $5-$10 per song at the time of writing.</p>

<p>Of the 3 e-masters, CloudBounce is my favorite, though I find it to be
overly distorted.</p>

<p>I also find the Landr track to be too distorted (listen to the
midranges to more easily sense the distortion).</p>

<p>The SoundCloud master is my least favorite. The midrange and vocal sound tinny
and strange to me.</p>

<p>All 3 e-masters could be changed through their parameters, so don’t take these
results to be exhaustive.</p>

<p>I’m also somewhat happy the results of my own attempt at a super simple mastering
approach. Moving forward, I think my process is going to be to use CloudBounce (probably
set to “less loud”) compared to my own approach, and then I’ll save my final
mixes and bring a professional like those at Metropolis in when I want to make
something that isn’t a quick budget single.</p>

<script src="https://unpkg.com/wavesurfer.js"></script>

<script src="https://calvinflegal.com/assets/js/mastering-page.js">
</script>]]></content><author><name></name></author><summary type="html"><![CDATA[I’m releasing another song on April 15th. Below you’ll find the result of the mastering of my final mix by a few different services. There are lots of other comparison write-ups on the internet that compare these services and many others, so I’ll be brief and mostly let you compare the results yourself. Most parameters were set moderately, to Rock / Pop settings where applicable.]]></summary></entry><entry><title type="html">Building Paper Audio with NestJS, Jovo, and React</title><link href="https://calvinflegal.com/2021/11/01/building-paper-audio-with-nestjs-jovo-react.html" rel="alternate" type="text/html" title="Building Paper Audio with NestJS, Jovo, and React" /><published>2021-11-01T00:00:00+00:00</published><updated>2021-11-01T00:00:00+00:00</updated><id>https://calvinflegal.com/2021/11/01/building-paper-audio-with-nestjs-jovo-react</id><content type="html" xml:base="https://calvinflegal.com/2021/11/01/building-paper-audio-with-nestjs-jovo-react.html"><![CDATA[<p><a href="https://paperaudio.com">Paper Audio</a> is my most recent side project. I have often thought that musicians should share their work earlier and more often, and Paper Audio is my attempt at supporting this kind of sharing.</p>

<p>As a way to incentivize the sharing of demos, Paper Audio has an api deployed to Alexa and Google Actions, and I am able to feature a ‘demo of the day’ to voice speakers. This separates my project from places like Instagram where musicians are already sharing, and, it allows the project to be enjoyed without screen time (and without giving more time to Instagram!)</p>

<p>At the time of writing, Paper Audio only allows the ‘demo of the day’ to be played on voice speakers. I personally select the demo of the day. Though this is a bit more gatekeeper-y than I’d like, it actually has to be this way; the Alexa Skills store <em>forbids</em> unmoderated user-generated content. I actually had to address this directly with Amazon in the submission process — maybe I’ll say more about that in another post. At the very least, all user submissions are shown on the web on the ‘explore’ page.</p>

<h2 id="on-to-the-tech-stuff">On to the tech stuff:</h2>

<p>As with all side projects, I was hoping to learn as much as possible, while also trying to actually ship and maintain high leverage in terms of throughput and platform support. TypeScript is my strongest programming language, so that was definitely a big factor in my selection of frameworks and tooling.</p>

<h3 id="voice-platform-support-jovo">Voice platform support: Jovo</h3>

<p>Jovo is an awesome framework for writing apps for voice platforms like Alexa, Google Home, and more. This react-native like premise of write-once-deploy-everywhere made it a natural choice for getting Paper Audio to work on multiple platforms. I’d used it before for an incredibly simple Alex Skill called “Pitch Player”, which is basically a pitch pipe. Ultimately the logic in the voice interface is deployed to AWS Lambda, and is called by Alexa and the supporting Google devices. In turn the Lambda calls the Paper Audio back end, described below.</p>

<h3 id="what-i-loved-about-working-with-jovo">What I loved about working with Jovo:</h3>

<ul>
  <li>Write once, deploy to multiple platforms</li>
  <li>Built-in TypeScript support</li>
  <li>A great web-based debugger</li>
  <li>Lots of tutorials and examples</li>
</ul>

<h3 id="what-i-loved-less-these-things-may-of-course-change-and-become-outdated">What I loved less (these things may of course change and become outdated)!:</h3>

<ul>
  <li>Managing metadata (images, descriptions, etc) for my products in the Alexa Skills &amp; Google Actions portal. You can fetch this metadata via the jovo cli, and then later push it, but it can be tricky to understand what fields map to what values in the portals. I suppose this is the price you pay when you try to target multiple stores, and you can imagine that this is not easy for the Jovo framework, as there are no incentives for Google and Amazon to cooperate in making this straightforward.</li>
  <li>Some examples and tutorials have become outdated, and some areas are not as well documented. For example, I used the Google Conversational Action builder pattern, which seems slightly less conventional than using DialogFlow when using Jovo.</li>
</ul>

<h3 id="back-end--nestjs">Back End — NestJS</h3>

<p>I used NestJS for the back end of Paper Audio because it seemed to be a very ‘complete’ node solution with native TypeScript support, and lots of ‘opinions’. I didn’t want to spend a lot of time sewing together lots of express code myself. I wanted something that would more or less let me define a data model, and then do most of the ‘boring’ work for me. I also knew I wanted GraphQL and Apollo support since I’ve used the Apollo client with React in my job, and I’ve loved the end-to-end typesafety that is available with this approach. Postgres backs the app via TypeORM, because, why not use Postgres?</p>

<p>I’d use NestJS again without much hesitance. On my next project, I might even go a step further into convention over configuration and use something like RedwoodJS or Blitz.js, effectively taking the monorepo approach to the web front end and back end. As an engineer I have already spent too much of my career solving the same familiar CRUD problems. CRUD is not terribly interesting, so it seems best to use tools that allow one to spend more time on the challenges unique to a particular application.</p>

<p>Paper Audio’s NestJS back end is deployed to a digital ocean droplet via Dokku. Dokku doesn’t quite seem like the cool new thing in town, and my architecture here isn’t perfectly ‘web scale’, but it was very easy to configure (there was no chance I was going near Kubernetes for this), and offered me more performance per dollar than heroku, and allows me to deploy via <code class="language-plaintext highlighter-rouge">git push dokku</code>.</p>

<h3 id="web-front-end--create-react-app">Web Front End — Create React App</h3>

<p>The front end that you see at <a href="https://paperaudio.com">https://paperaudio.com</a> is a react app written in TypeScript and deployed via Netlify. I used create-react-app here, and built the UI with ‘Material UI’. Next.js would’ve been the ‘cooler’ thing to use here, but, for now I just don’t need its features, and was already more familiar with create react app. Material looks a little android-y for my tastes. If I were to start over, it’s likely I’d try tailwind in its place.</p>

<h2 id="other-lessons--conclusions">Other Lessons &amp; Conclusions</h2>

<h3 id="i-wish-id-built-in-public-more">I wish I’d ‘built in public’ more</h3>

<p>Building in public has become a very popular strategy, and it makes sense. If you don’t talk about your projects early and often, the odds go up that you are building the wrong thing.</p>

<p>I’ve done <em>some</em> work to recruit users, but I should have been writing and talking about Paper Audio even before I started the tech work. I could’ve done what so many do and explained the product with a splash page and worked to develop a user base, so that I’d have users at ‘launch’, and so that I’d more likely build what users might want. It also would’ve helped keep me motivated and excited about the project.</p>

<h3 id="captcha-really">Captcha? Really??</h3>

<p>At the last minute before ‘launching’, I had to add Captcha to the sign up form.
I was getting hundreds of emails sent per day from my server from stupid bots
filling in my email form. It’s really annoying, and I still can’t understand how
the incentives could be there for anybody to deploy these crappy scripts to just
pollute the internet with garbage. I could’ve used Auth0 for user management to
avoid this issue, but my simple sign up flow was generally working, so I decided
to make the UX a little worse with the Captcha approach to avoid the abuse.</p>

<h3 id="the-need-to-ship-known-bugs--imperfections">The need to ship known bugs &amp; imperfections</h3>

<p>This is a tough one. There are <em>lots</em> of known issues. My favorite is a timezone bug: Alexa and Google Home will change to the next day’s demo at midnight UTC, while the web app behaves the way one might expect in that it will change at midnight browser time. It turns out it’s not quite <em>that</em> easy to get the local time of both Alexa <em>and</em> Google devices. And of course, this is far from the only issue in the project. The perfect is the enemy of the good, and if nobody ever uses your product, the bugs don’t matter at all!</p>

<p>If you liked this, consider following me on <a href="https://twitter.com/calflegal">Twitter</a>!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Paper Audio is my most recent side project. I have often thought that musicians should share their work earlier and more often, and Paper Audio is my attempt at supporting this kind of sharing.]]></summary></entry><entry><title type="html">The Things You Do Once Barely Matter, But That’s a Good Thing</title><link href="https://calvinflegal.com/2017/02/25/the-things-you-do-once-barely-matter.html" rel="alternate" type="text/html" title="The Things You Do Once Barely Matter, But That’s a Good Thing" /><published>2017-02-25T00:00:00+00:00</published><updated>2017-02-25T00:00:00+00:00</updated><id>https://calvinflegal.com/2017/02/25/the-things-you-do-once-barely-matter</id><content type="html" xml:base="https://calvinflegal.com/2017/02/25/the-things-you-do-once-barely-matter.html"><![CDATA[<p>Says the guy who publishes writing less than once a year. In my brain this little philosophy actually reads, “The things you do once matter not at all”, but that’s a less descriptive headline, so.</p>

<h1 id="im-talking-about-pursuit-and-achievement-of-long-term-goals-here">I’m talking about pursuit and achievement of long term-goals here.</h1>

<p>Whether your goals are matters of fitness, business, music, finances, or anything else that will really make a difference, I think it’s important to understand that one-time, one-off efforts are roughly as useful as no effort at all. Maybe one day you pack lunch instead of buying it on your lunch break. Great. Do it again. And again. You just can’t move the needle enough doing it once. Maybe you practice bass for a few hours on a given Tuesday. That’s great, but you’ve got to keep it up. That tough workout? You plan to do it again in two days, don’t you? Don’t blow it.</p>

<h1 id="its-not-all-doom-and-gloom-though">It’s not all doom and gloom though.</h1>

<p>There’s a truly positive element of all this that is worth considering. I’m definitely a fairly anxious person, and life’s mundanity can cause a lot of discomfort. This long game of consistency can provide some comfort from those problems. Once you internalize that it’ll take many days of consistency to get to where you’re going, you can turn that mundanity into a positive thing, in that you’ve been given the chance to chip away at those goals over and over again.</p>

<p>Furthermore, you can also use this concept to feel good about time off. The effort from that one prospective work day or week wasn’t going to matter too much by itself, anyway. Understand that and unplug.</p>

<p>It’s also worth noting that this position only applies to longer-term goals. When it comes to random acts of kindness, one-time events are hugely important. Try buying coffee for the person next to you in line. I know that when somebody does this kind of thing for me, my entire day is made. We’ve all felt that great feeling.</p>

<h1 id="this-is-also-one-of-my-favorite-qualities-of-musicians">This is also one of my favorite qualities of musicians.</h1>
<p>It’s one of the things that amazed me in my time at Berklee. I encountered people with drive and desire that I can barely describe. One such person is <a href="http://matt-garstka.myshopify.com/">Matt Garstka</a>, one of my roommates in my freshman year. Matt would practice for eight hours per day in many cases, only to return to his room to practice quietly on a drum pad. Here’s one of my favorite videos of Matt’s chops:</p>
<div style="position:relative;height:0;padding-bottom:56.25%"><iframe src="https://www.youtube.com/embed/OtDstKaLnn8?ecver=2" width="640" height="360" frameborder="0" style="position:absolute;width:100%;height:100%;left:0" allowfullscreen=""></iframe></div>

<p><br /><br /></p>

<h1 id="get-out-there-and-be-what-you-dream-to-be-one-day-at-a-time">Get out there and be what you dream to be, one day at a time.</h1>]]></content><author><name></name></author><summary type="html"><![CDATA[Says the guy who publishes writing less than once a year. In my brain this little philosophy actually reads, “The things you do once matter not at all”, but that’s a less descriptive headline, so.]]></summary></entry><entry><title type="html">What I learned from building my first iOS app</title><link href="https://calvinflegal.com/ios/2015/06/02/What-I-learned-from-my-first-iOS-app.html" rel="alternate" type="text/html" title="What I learned from building my first iOS app" /><published>2015-06-02T00:00:00+00:00</published><updated>2015-06-02T00:00:00+00:00</updated><id>https://calvinflegal.com/ios/2015/06/02/What-I-learned-from-my-first-iOS-app</id><content type="html" xml:base="https://calvinflegal.com/ios/2015/06/02/What-I-learned-from-my-first-iOS-app.html"><![CDATA[<p>Almost a year ago I built and launched an app for iOS. That app is called <a href="https://itunes.apple.com/us/app/tuneup-lite-intonation-ear/id884607905?mt=8">tuneUp</a>. Find the free version <a href="https://itunes.apple.com/us/app/tuneup-lite-intonation-ear/id884607905?mt=8">here</a>, and the paid version <a href="https://itunes.apple.com/us/app/tuneup-pro-intonation-ear/id968587287?mt=8">here</a>. It is important to note that I basically wanted to build and ship the <em>simplest useful app I could think of</em>, because my other efforts had seemed to have trouble getting out the door. Here’s a collection of some important lessons from that process.</p>

<h1 id="find-a-niche">Find a niche</h1>

<p>Preferably, find a niche in which you have special domain knowledge. Finding a niche will allow you to have less competition, and if you believe Peter Thiel’s monopoly theory from <em>Zero to One</em>, this is a great place to be. I also believe that focusing on a small set of important features makes your app more valuable. No matter what you are doing, you want it to be frictionless. Read more about picking a niche in the very useful series from <a href="http://www.trevormckendrick.com/how-to-find-a-profitable-niche-part-2/">Trevor McKendrick</a></p>

<h1 id="work-on-a-hard-problem">Work on a hard problem</h1>

<p>tuneUp doesn’t really fit this criteria, although I think it’s important. First, it keeps you interested. If you are reading this as an indie developer I suspect you may have another full time job. Part of the point of side projects is exploration, and it’s certainly easier to stay interested in a problem that you find challenging.</p>

<p>Also, as a side benefit it protects your niche from being gobbled up instantly from competition. Think about the flappy bird knock-offs.</p>

<h1 id="dont-ship-anything-that-has-no-chance-of-being-featured-by-apple">Don’t ship anything that has no chance of being featured by apple</h1>

<p>Here’s another one I cut corners on, although as I mentioned I was just trying to get this thing out the door. Depending on your niche I do believe getting featured eventually might not be as hard as it seems, and it would make a world of difference. Keeping this in mind will also help sharpen your design skills.</p>

<h1 id="instrument-your-app">Instrument your app</h1>

<p>Until the very recent rollout of iTunes Connect’s analytics, if you were to make an app and ship it without adding any analytics, you’d end up very bummed out after your launch. Sure iTunes Connect will tell you how many downloads you got the previous day, but that’s about all you get to know. Wouldn’t you like to know what buttons people are pressing? How long they are in your app on average? If they come back? It’s easy to add <a href="http://www.localytics.com/">localytics</a>, <a href="www.mixpanel.com/">mixpanel</a>, google analytics, segment.io, or any of the dozens of tools available. If you don’t do this you’ll be sad that you didn’t. Also, you’d like to know if your online marketing is driving downloads. Good luck understanding and comparing marketing campaigns without any instrumentation.</p>

<h1 id="dont-underestimate-users-interactions-with-each-other">Don’t underestimate users’ interactions with each other</h1>

<p>Something as simple as integrating with game center will show you how important this one is. With tuneUp, somebody scored over <em>50,000 points</em> on the easy setting. This person went through more than 500 pitches in a single game, which is an astounding number. The reason is that this person wanted the top score on the leaderboard. In my next app I may try to build a platform for more sophisticated user interactions. However you address this topic, I recommend at least touching on it.</p>

<h1 id="market-it">Market it</h1>

<p>Unfortunately the app gold rush days are over. You’ve got to do something to drive downloads. Ad platforms like Facebook, Twitter and AdWords all give promotional credits for new users. Don’t throw away free money. Also, this is another reason to instrument your app. If you are able to pay $2 per download on average and make $4 per download, you’ve just found a gold mine (yes it’s very hard to find this kind of opportunity). You’ll need code in your app to really track the effectiveness of these campaigns. Get it setup before launch.</p>

<h1 id="dont-blow-up-your-own-launch">Don’t blow up your own launch</h1>

<p>Here’s one where I really screwed up. After your app is approved, when you pull the trigger to deploy the app, under no circumstances should you pull it from the App Store. You get a big boost in app store rankings for being a new app, do not give it away. If you find a bug that you think is really a deal-breaker, rush to get a new version out, but do not pull it from the App Store. Look what happened to me after I pulled the app because I found a bug. This chart from mobileDevHQ  shows the placement of the app in the App Store for the keywords “ear training”, at launch and second launch. Don’t let it happen to you.</p>

<p><img src="https://calvinflegal.com/assets/images/app-store-ranking.png" alt="tuneUp Ranking" title="Launch ranking before pulling tuneUp" /></p>

<h1 id="track-it">Track it</h1>

<p>Use a tool like <a href="https://sensortower.com/">SensorTower</a>, <a href="https://www.appannie.com/">App Annie</a>, <a href="https://www.mobiledevhq.com/">MobileDevHQ</a>, or one of the others to track your placement in the app store. This way you can plan for future updates and even future apps, in addition to tracking your marketing efforts. On these platforms you can add competitor apps and chart what works and what doesn’t.</p>

<p>Hopefully this is a useful resource to other app developers out there. There are plenty of posts out there just like this one, and I recommend doing a bunch of reading before you ship so that you don’t make the same mistakes as others before you.</p>]]></content><author><name></name></author><category term="iOS" /><summary type="html"><![CDATA[Almost a year ago I built and launched an app for iOS. That app is called tuneUp. Find the free version here, and the paid version here. It is important to note that I basically wanted to build and ship the simplest useful app I could think of, because my other efforts had seemed to have trouble getting out the door. Here’s a collection of some important lessons from that process.]]></summary></entry><entry><title type="html">Ember.js (Ember CLI) and Jekyll on GitHub Pages</title><link href="https://calvinflegal.com/jekyll/ember/2014/12/16/ember-js-jekyll-github-pages.html" rel="alternate" type="text/html" title="Ember.js (Ember CLI) and Jekyll on GitHub Pages" /><published>2014-12-16T00:00:00+00:00</published><updated>2014-12-16T00:00:00+00:00</updated><id>https://calvinflegal.com/jekyll/ember/2014/12/16/ember-js-jekyll-github-pages</id><content type="html" xml:base="https://calvinflegal.com/jekyll/ember/2014/12/16/ember-js-jekyll-github-pages.html"><![CDATA[<p><strong>EDIT:</strong> The easiest way to do this these days is likely to use the <a href="https://github.com/poetic/ember-cli-github-pages">ember-cli addon</a></p>

<p>I didn’t take great notes throughout this process, though I’m hoping I can help get
some others moving in the right direction for getting ember.js and ember CLI running on github pages, with
a few other notes about getting Jekyll in place alongside ember.</p>

<p>Start by installing ember-cli and creating a new project via <code class="language-plaintext highlighter-rouge">ember new myWebsite</code>.
The next thing I did was remove the dist folder from the .gitignore file. The reason for this is to
be able to deploy with a single git command…tracking your build folder is a big no-no but this is 
quick and dirty. I recommend the cli addon mentioned in my edit above.</p>

<p>Next, I setup the git origin to point to my username.github.io repo. Then, I added the following alias
to my .aliases file (although <code class="language-plaintext highlighter-rouge">.bash_profile</code> or elsewhere would certainly work:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">alias </span><span class="nv">pushSite</span><span class="o">=</span><span class="s2">"git subtree push --prefix dist origin master"</span></code></pre></figure>

<p>With that in place, the general deployment strategy would be to make changes, <code class="language-plaintext highlighter-rouge">ember build</code>, git add and
commit, run any tests, then run the alias to deploy to github.</p>

<h2 id="adding-jekyll">Adding Jekyll</h2>

<p>Github supports Jekyll out of the box for its pages, but since we want ember at our root path, we’ll do 
a classic Jekyll installation, without using the github jekyll builds. First, <code class="language-plaintext highlighter-rouge">gem install jekyll</code>. Then, in the public folder, <code class="language-plaintext highlighter-rouge">jekyll new blog</code>. I then went into the newly created blog folder and modified  <code class="language-plaintext highlighter-rouge">_config.yml</code> file to
include:</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">source</span>: <span class="nb">.</span>
destination: ../public/blog
baseurl: <span class="s2">"/blog"</span></code></pre></figure>

<p>With these new additions, we now build our blog via <code class="language-plaintext highlighter-rouge">jekyll build</code> from our blog folder. This prepares 
the ember /public/blog directory, and we just use the aforementioned process to deploy the whole site.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="ember" /><summary type="html"><![CDATA[EDIT: The easiest way to do this these days is likely to use the ember-cli addon]]></summary></entry></feed>