RSSAmplifier

Blog

Blogs on Evil Trout Inc.

Recent content in Blogs on Evil Trout Inc.

eviltrout.comRSS feed ↗40 posts

Latest posts

Building Galley House

Evil Trout’s second game, The Incident at Galley House, is
 out now on Steam ! 
 Last year, after The Roottrees are Dead shipped, I wrote a
 technical blog post 
about its development, which was well received, so I decided to do the same
thing for this game. 
 Note: The images in this post have minor spoilers for the beginning of the game.
If you want to be 100%…

Evil Trout + DEG


 During the last Steam Next Fest, I played a demo of a puzzle game called DEG that was getting a lot of buzz. 
 The game is made for people who like grid puzzles like Sudoku , or Nurikabe , with many additional unique concepts and puzzle ideas that are tutorialized silently to the player. 
 Needless to say, I was hooked . I reached out to Doseo, its creator, and inquired about…

Anatomy of a Room

Background 
 Our next game, The Incident at Galley House , is an adaptation of a text-based game called Type Help . It takes place at Galley House, a dwelling in the English countryside, during a dinner party where things go sideways. 
 Galley House is divided into many rooms, and the core gameplay involves following characters from room to room, listening in on their conversations,…

Building The Roottrees are Dead

The Roottrees are Dead was released on January 15, 2025 and
it did much better than I ever expected. The reception has been amazing. In just over a week, the game hit the magic mark of 500
reviews on Steam, and triggered the “Overwhelmingly Positive” status. 
 On BlueSky, Bloomberg writer Jason Schreier blew me away when he posted : 
 
 “Seven days into 2025…

The Roottrees are (still) Dead

Last year I broke my elbow. This meant that I had to take a break from programming for about six weeks, and The Secrets of Skellig , my indie game, was put on hold. 
 After a couple of weeks, I recovered enough to do some basic keyboard and mouse movements, and I stumbled on a free game called The Roottrees are Dead by Jeremy Johnston. It was exactly my kind of thing: a thinky game where you…

The Secrets of Skellig

Note: The Secrets of Skellig is on indefinite hold now while I work on other things. 
 I’ve wanted to dip my feet back into game development for a while, and last year I decided to put my money where my
mouth is. I resigned from my full time job at Discourse and pulled up a bunch of YouTube tutorials on Blender and Godot. 
 It’s been a ridiculous amount of fun, and…

My Retro PC Gaming Nostalgia Kick

Over the last couple of months, I’ve been posting a series of videos about early PC gaming and programming on my YouTube Channel . It’s been quite a fun journey and I thought I might write a few words about it. 
 I have a lot of nostalgia for early games, which makes sense since it was how I spent most of my free time in the 80’s and 90’s. Times were boring before the…

Home streaming my games in 4K

I have two 4K TVs at home, one in the bedroom and one in my living room. Both have consoles attached. One has a
 PS4 Pro and one has a Nintendo Switch and both are great. 
 However, I also have a gaming PC in my office, which is quite powerful compared to any home console
Mine is equipped with a RTX 2080 TI GPU, and a 9900K processor, so it can play pretty much any new game at 4K with…

Building a Home Media Server with Docker Compose

I recently moved into a bigger condo which had a wall mount pre-installed in the bedroom for a TV, so I decided
to take advantage of it and bought a second TV . 
 Previously, I was using an Intel NUC attached to my TV and running LibreElec . If you’ve not heard of LibreElec, it’s a very cool minimal Linux OS that sets itself up to run Kodi . It is remarkably easy to set up, and…

Candles, Programming and Archetypes

Once in a while, I daydream about being thrown back in time. I’d have no Wikipedia, no books, or any
access to information except what’s already in my head. 
 If I were thrown into Victorian London, what could I do? What could I teach them? 
 Well, the first thing I would do is tell them to wash their hands. With soap. Frequently. That would probably
be the most…

The value of a thousand little features

It’s been over a year since I wrote a blog entry ! And while of course the universal excuse of “I’ve been busy” applies, I think we reached a point in Discourse ’s development where we just were able to focus on the product without a lot of stuff getting in our way. 
 I’ve now been working on Discourse full time for 5 years. In the beginning we had a lot…

We finally did something about Android Performance

Back in September, Codinghorror wrote a popular post on the state of android Javascript performance 
on Discourse’s Meta forum. It drew a lot of attention, and led to some fascinating discussions on our forum
and behind the scenes with browser engineers. 
 
 The poor performance of Discourse on Android was already old news to us at that point: we started paying…

The 5 Layers of Depth in The Witness

Recently I became enamored with The Witness 
and after thinking about the game for a long time decided to sit down and record a little essay
about it. 
 Check it out below! 


TIS-100: My emulator for a CPU that doesn't exist

Recently I became infatuated with TIS-100 , a game which aptly
describes itself as “the assembly language programming game you never asked for!” 
 The point of the game is to program the (imaginary) TIS-100 CPU to solve problems. For example,
you might need to take input from two ports and swap them, then write the outputs to two other
ports. 
 The game flies in the…

Watch: Ember at 10 feet

Previously I posted notes and links for my talk about “Ember at 10 feet” from the
 Embergarten Saturday Symposium . 
 Today my awesome friends at Unspace posted a video of the talk, which you can watch below: 
 
 Source Code | Online Demo

ember-tv: Creating a 10 foot interface in Ember.js

Over the weekend I spoke at the Embergarten Saturday Symposium , which
was an awesome mini conference on Ember in Toronto. My topic was “Ember at 10ft”, and it was about
how to build a TV friendly interface in Ember.js. 
 The talk was recorded but not yet posted, however I’ve already posted the source code 
on github. The github repo contains my slides from the…

Screencast: Using Pretender to mock a server with Ember.js

Recently I fell in love with Pretender , the mock server library in
Javascript, so I decided to record a screencast showing how to use it in an Ember.js integration test: 
 
 The source code for the login application is on github . The finished
version is in the pretender branch .

Screencast: Debugging an Ember.js Application

I’ve found that a lot of people don’t know how powerful the Chrome Developer Tools are,
especially when paired with the Ember Inspector. I recorded this short screencast to show
a handful of tricks you can use when debugging Ember.js applications: 
 
 The source code to the Bug Tracker project is on github .

Creating an Integration test in Ember.js (Screencast)

Once upon a time it used to be difficult to create integration tests in Ember.js.
Fortunately, the framework has come a long way and it’s now really easy to get
integration testing working in your application. This screencast shows how
to set it up with ember-cli: 
 
 There is some boilerplate code required that you’ll need at the top of your
integration test…

Wrapping a jQuery plugin in a Ember.js component (Screencast)

Time for another screencast! This one is shorter and shows how easy it is to wrap
a jQuery plugin in an Ember.js component for reuse. 


Building Emberredit (screencast)

One of my more popular blog entries is on using Ember.js without Ember Data .
Recently I’ve been going through my old entries and making sure they don’t have any glaring mistakes,
and I realized this would be a good opportunity to convert my emberreddit 
project to ember-cli . 
 
 
 This screencast shows how you can build an Ember.js application without using…

Getting Started with ES6 Modules

Javascript is a fantastic example of how something, despite having visible warts
and very poor design , can dominate the tech
landscape. Nobody uses Javascript because it’s a beautiful language; they use it because it’s
ubiquitous. Its warts are now well understood and most have workarounds. 
 An amazing omission in Javascript’s design is the lack of a built-in…

The Refresh Test

How many times has the following happened to you? 
 You go to a web site and it asks you to create an account. You fill out a
form with all the obvious fields and hit submit. The page refreshes and
shows you the form again. 
 Phone Number is required 
 Well, that’s annoying. There was no indication that the site needed
your phone number. You prefer not to give out…

Hiding Offscreen Content in Ember.js

Everything you render in a browser, whether it’s a blog post or a tweet or a video, has a
performance cost. 
 At the very least, you will be asking the browser to render a handful of tags and text
elements that make up your user interface. That structure, a subtree in the browser’s
DOM, can be quite complicated and memory intensive. 
 The more tags and elements you…

Internationalization Support in Ember.js

One thing I’m really proud of is that when we launched Discourse, we had first class Internationalization (i18n) support
ready to be used. Our first release only English, but thanks to our community we have 18
localizations of our software in progress! Here’s what Discourse looks like in Simplified Chinese: 
 
 
 
 On the server side, Discourse uses Rails’…

Enemy of the State

I learned very quickly while working on a
 large open source project is that it
is important to make my code hard to break. The primary line of defense for this is a
comprehensive test suite, but I think it’s also very important to create functions
that are easy to use and difficult to damage. 
 I find I even code this way on personal projects that will never be released.…

Let's Talk about Browser Applications (and Forums and Discourse)

Back in February , I gave
a presentation on Discourse and client side MVC at TechTalksTO. 
 It wasn’t recorded, but I’ve taken the liberty of creating a video version of the presentation with an audio track. 
 While the presentation is about Browser Applications, I take a large detour in the beginning to talk about
 Discourse and Forum software in general. Enjoy! 
…

Computed Property Macros

Computed Properties 
 By design, Handlebars templates don’t allow complex expressions. You are given
an {{#if}} block helper, but it can only evaluate whether something is “truthy” (aka true , a non-empty
string or array or other value that is not undefined or null .) 
 For example, you can’t do something like this: 
 {{ #if ( eyes.length == 1 ) && (…

Adding Support for Search Engines to your Javascript Applications

Important Update (May 25, 2014) : Google has started parsing and indexing Javascript. The approach of this article is to use&#xA; <noscript> tags but Google will likely ignore those now. We upgraded our site to sniff Google and other popular&#xA;search engines and serve our simple content that way. However, in the future it might not be a concern as Google&#xA;plan on having Javascript sites just…

AngularJS vs Ember

Recently I got together with some local developers to discuss client side MVC frameworks. We ended up discussing many of the differences between AngularJS and Ember . &#xA; Discourse is an Ember application and has been since the first prototype, so I have a lot of experience with it. However, it became clear during the conversation with my peers that there was a lot about AngularJS I didn&rsquo;t…

Organizing Data in Long Lived Applications

Trade offs &#xA; As a developer you&rsquo;re constantly faced with issues of choice: What library is best? What framework is best? What&#xA;platform should we deploy on? &#xA; Most of the time there isn&rsquo;t a clear winner. The decision you make comes down to a series of trade offs. Do you&#xA;want to optimize for developer happiness or performance? Do you care more about platform maturity or…

Ember without Ember Data

Update May 26, 2014 &#xA; The concepts in this article are still true, but I&rsquo;ve recorded a screencast &#xA;showing how to use ember without ember data using ember-cli and the latest version of Ember.&#xA;It goes beyond the contents of this article, showing how to create an adapter, store and&#xA;even your own identity map. Check it out ! &#xA; &#xA; Ember Data is a persistence layer for…

Generating IIFEs in Rails

Recently we ported Discourse from&#xA; CoffeeScript to plain old Javascript .&#xA;The process was straightforward since CoffeeScript spits out fairly good Javascript, although I did have to spend the better part of&#xA;a day cleaning it up afterwards . (Note: we&rsquo;d&#xA;love any patches to further tidy up the generated Javascript.) &#xA; One thing that CoffeeScript does by default that&rsquo;s…

Infinite Scrolling that Works

Shortly after we began working together on Discourse , Jeff wrote a post about infinite scrolling . At first, I was surprised at how many people claimed to hate sites that used it. However, after reading through many comments&#xA;about it, I realized that most didn&rsquo;t hate the scrolling itself, they hated how it broke their browser! &#xA; Infinite Scrolling done wrong: Twitter &#xA; When I…

Why Discourse uses Ember.js

This week, I was delighted to finally reveal Discourse , the app I&rsquo;ve been working on for most of the last year in secrecy with awesome people . The launch got a lot of attention - we were featured on Hacker News, Slashdot, Wired, Reddit, Techcrunch and countless other places. Personally I&rsquo;ve been floored with the amount of feedback so far. It&rsquo;s going to take quite some time to…

Crawling the Downvote Brigades of Reddit

ShitRedditSays and The Downvote Brigades of Reddit &#xA; (note: if you&rsquo;re familiar with reddit and ShitRedditSays, you can skip to the next section.) &#xA; As you probably know, Reddit is a site that revolves around voting. All users are encouraged to vote on things, which are then prioritized based on their total scores. &#xA; Over time, Reddit&rsquo;s userbase has grown a lot. It is now…

How our users exploited concurrency and how we fixed it

A story of a game exploit &#xA; Once upon a time I developed a somewhat popular web game called Forumwarz . At its peak, we were serving about 6 million dynamic requests a day off a single quad-core server. &#xA; Forumwarz limits how many turns a player can take in a day. We designed it this way so that the competitive aspect of the game wasn&rsquo;t simply a contest of who had the most time…

Turbolinks and the Prague Café Effect

Turbolinks &#xA; Turbolinks is a new Ruby library, enabled in Rails 4 by default, that is designed to speed up your web applications. &#xA; It does this by binding a Javascript handler to all link clicks. Instead of allowing the browser to load the new page, it fetches it in the background via AJAX. It then parses out the body, and injects it into the document you&rsquo;re currently viewing. &#xA;…

Just because you&#39;re privileged doesn&#39;t mean you suck

Recently, I wrote a short essay on privilege and programming . It was quite popular on /r/programming and generated hundreds of comments, both there and on this blog. &#xA; I was surprised and flattered to see the majority of the comments agreed with my post, however a few people brought up a concern which I&rsquo;d like to address: &#xA; &#xA; Why this is person trying to convince me that I…

I&#39;ve been programming since I was 7

When I was in grade 6, I handed out a couple of 3 1/2" floppy disks to a couple of friends in my class whose parents had recently purchased PCs. On each disk was a game I created. You&rsquo;d fly a ship horizontally through outer space. It had two controls, up and down, to avoid asteroids. The longer you survived the more points you got. &#xA; The next day one of my friends said &ldquo;My dad said…