blog master mode
subscribe to this tag
show all posts as opposed to just those tagged PERSONAL

Blog posts are now tagged.

by osk at 2022/06/03 (Fri) 11:22:06 pm (edited)PERSONALUPDATE

To organize the blog a little, the posts on it are now tagged according to their content and nature. There's not that many posts here, but it's still useful to have. You can click a tag, and it'll take you to the index, filtered to just posts with that tag. That way, you can bookmark just official posts or the like. You can also set up your RSS reader in the same way — while filtered to a tag, the Subscribe button in the top left changes to allow you to subscribe to just that tag.

This is one of the many recent changes I'm making to somewhat separate my personal identity (the osk who develops software, likes UI design, rants a lot, and genuinely loves and is in a relationship with Kagari, a fictional character from Rewrite) from my brand (osk, the person and corporation behind TETR.IO, developing, maintaining and directing it). (Perhaps a topic for another post.) Posts that fall under the former identity are tagged PERSONAL, while brand posts are tagged OFFICIAL. This way, I can feel a bit safer writing genuine posts from the heart about my personal interests, without distracting those who are only here for professional press releases. I'm hoping this will allow me to post a bit more often. There's a lot of things I could rant about :^)

To be clear, this is still a personal blog. Press release-like "official" posts are secondary, and I wish to post more personal posts here in the future. If you are not interested in those and only care about me for TETR.IO, feel free to filter to official posts only with this tool.

Please look forward to me perhaps blogging somewhat more often than twice a year!

smash that unsubscribe button mate

Adding ads to TETR.IO, six months later

by osk at 2021/05/10 (Mon) 10:50:14 pm (edited)PERSONALTETR.IO

A little over 6 months ago, I added display advertisements into TETR.IO. This blog post, I want to reflect on these first 6 months, both from the perspective of a player, and that of a developer. I'll be going over the questions most commonly asked by the community, the questions I had, as well as the lessons I learned.

A little background

Back on the first of November 2020, I started a partnership with AdinPlay, to display banner ads in the game's menus. While I was (and still am) very grateful for all the players supporting the game through Patreon, 99.97% of players did not support. While running the game is not incredibly expensive (since a lot of my work in the past year has been on performance), I wanted to be able to go full-time on TETR.IO, as well as build a budget to be able to work on the Character System update. The game was popular, but I was not quite ready to jump onto larger monetization schemes. So, a perfect solution is simply monetizing that 99.97%, the "freeloaders" in a sense.

Just like most players, I don't particularly enjoy ads, though. And to be quite honest, this extends to almost all monetization. Monetizing a game is very much a balance, where you must balance out a good experience with revenue. Looking around the .io game space, the balance seems tipped in revenue's favor. A worryingly large amount of .io games copy eachother, finding more and more ways to sneakily insert ads into the game, get you to click ads, drive in-game purchases, run video ads, and whatever else. This video covers just how much these games are willing to compromise just to drive the best bottom line. I wanted (and still want) to stay away from that side. My drive has always been to make a game I can be proud of, as opposed to a wallet to be proud of. This complicates matters a lot, though.

The Implementation

How do you implement worthwhile ads, without ruining the player experience? This was a question I did not want to avoid (like most .io games do). I ended up settling on the simplest type of advertising: banner advertisements. Technically, I had already been running banner ads for months — those banners above the main menu that announce new features and tournaments are, by all definitions, ads after all. I decided to simply place some ads in the menus, never ingame. Ingame ads, after all, could interfere with the game. No video ads either, everyone hates those.

The next question was getting an advertising partner to partner with. Google AdSense is generally seen as a relatively badly paying partner, so I wanted to find a partner who would both help me more with implementation, and give a fairer price for my ads. Sadly, the world of advertising is pretty hard to understand. I ended up going with AdinPlay. The main reason I went with them, is since AdinPlay specializes in ads on webgames, like .io games, so they would be able to help me kickstart my setup.

Setup of ads is relatively easy. In general, all you'll need to do is tell the library that your partner gives you to load an ad in a specific HTML element, and it will load one. I set up TETR.IO ads to only load the ad currently visible, and to reload an ad after showing it for 30 seconds. All ads also immediately unload when the menu UI hides. Ads are pretty heavy after all, both on the network and in rendering. In fact, when playing about with them, I found it almost worrying how incredibly unoptimized many ads are. Hence, it is vital to make sure the ads are inactive while ingame, especially since TETR.IO requires quick and reliable inputs. Even a millisecond off can cause the game to feel sluggish or slippery.

Deciding on positioning, sizes, etc. is also relatively easy for the most part. In general, you want to be in the way of the player. ...of course, that isn't the plan I am going with. So, I tried to put the ads near the places people will look (near important buttons), but not particularly in the way, either. Obviously, this lowers my click rates, but remember the balance! I would like to stay on the good side of said balance. The Online Advertising Guide is a great source for information on advertising, both for publishers like me, and for advertisers. Some data on there may be slightly out of date, though.

What to Expect

AdinPlay, like most partners, will sell your ads in many different schemes. This is generally not very visible to us publishers, so all we really get to know is a few key performance indicators (or KPIs): ad requests, impressions, clicks (and click rate), and RPM. An ad request is when your site (or in my case, the client) requests an ad, and an impression is counted when said ad is displayed on screen for at least a full second (we can say with certainty that the ad has been seen by the user). Then finally, if the user clicks the ad, we count that as a click.

The magic number here is the last: the RPM. RPM stands for Revenue per 1000 (usually impressions). It's often also called CPM (cost per 1000). CPM is what the advertisers pay to advertise on your site, and RPM is what you receive as publisher. Your RPM is generally controlled by three things: the click-through rate (the percentage of impressions that lead to a click), the kind of content you publish, and the day of the year.

Since I don't let my ads get in the way, my click-through rate is well... abysmal. The average click-through rate around the internet for display ads is about 1‰ (that's 1 in 1000, which lines up neatly with the RPM/CPM metric!). Mine is about 0.2‰. Not so good. This is mostly caused by the fact that the ads are both not in your way, and that most internet users nowadays have become accustomed to ads (also called "banner blindness"). Games also tend to not get super-high RPMs to begin with, compared to say, car rental sites or accountants.

Furthermore, your RPM will almost always start off low. After a few weeks, your RPMs will start normalizing to their normal levels. From then on, your RPM can mainly be changed by the time of year, and the type (and placement) of ads you serve. For example, things like Black Friday will see a spike in RPM, as there will be more advertisers competing for the same ad space. Simply put, advertisers are always bidding on ad spaces, and if there's more competition, ad prices will go up. This also means your RPM will generally go up through the year slowly, go down at the start of every month and quarter (as ad campaigns tend to end at those times), and that January will be by far your worst month.

The Results

Most importantly, community response was far, far better than I expected. Even after taking a step into the dark side, you still trusted me to steer this ship into the right path, and not just a little bit, either — only half a year later, TETR.IO's active userbase has tripled! I'm incredibly grateful for that.

From about 12K users daily to easily hitting 46K users daily!

A bit more on-topic though, RPM was as expected. Since my click-through rate is not particularly high, nor is the RPM. Especially in games, and even more so when trying to avoid invasive ads, revenue is driven by the amount of players you have (and as such, the amount of impressions you serve). Nowadays, TETR.IO gets between 600K and 750K impressions daily, which is the driver for its ad revenue. That way, players who cannot or do not want to support the game otherwise, can support just by playing the game normally, without impacting their experience too much. Of course, a growing amount of internet users use adblock, usually between 33% and 50%, or even worse, they use a browser like Brave which replaces your ads with its own. But remember, that's their decision. I never ask people to turn off their ad blockers. The balance between revenue and a good experience is easy to tip.

In Conclusion

Above all, I am very thankful for everyone's support of me adding ads to TETR.IO. While they don't make me six digits or anything right now, ads together with Xsolla integration allow me to create a budget for future experiences like the Character System update. I hope this post has shed some light and insight on the world of advertising, and, if you happen to be a publisher, has helped you around the more confusing parts of advertising. (Perhaps I could even persuade a publisher to think about the balance between between revenue and a good experience!)

I hope you'll keep trust in me in the future too. I'm interested in seeing in what other ways I can monetize, in such a way that it improves the game, as opposed to simply trying to be a cash-grab. When the Character System update comes out, it could be nice to let users unlock skins (skins for their pieces, as well as other skinnable elements) both by playing, but let there be soft monetization as well (nothing requiring a purchase, but if there's something specific you want, and want it fast, you can get it).

Please, let me know what you think about my current strategy (ads + Xsolla for monthly supporter), as well as future endeavors (be it skinnable game elements, or anything else) in the comments. I read all of them!

I'm now selfhosting email

by osk at 2020/02/03 (Mon) 12:43:33 amPERSONALUPDATE

Hi! Up to now, my email provider has always been ProtonMail. However, for some projects I need a mailserver, so I decided to set one up. Please do not contact me on my old ProtonMail account (@pm.me), but use my new email:

me [AT] osk [DOT] sh

Thank you!

There's now a view count next to blog posts.

by osk at 2019/12/27 (Fri) 1:17:01 pmPERSONALUPDATE


I should really cool it with this crystallize effect.

It might impact the server negatively, so let's see how well it works, right? It's only triggered when you view a post's own page, not the homepage.

Even less useful: PeakGadget

by osk at 2019/12/27 (Fri) 1:16:07 amPERSONALOSKWARE

This time, to address a bug I face in my antiquated Windows 7 install where the sidebar gadgets would stop being "topmost" (above all other windows) and get hidden. It's a stupidly simple program, but hey - can add it to my portfolio, right?

If you happen to be impacted by this bug as well, the program can be retrieved (and its source seen) over here.

WindowSmasher: "simple" window management

by osk at 2019/12/20 (Fri) 11:51:19 pmPERSONALOSKWARE

My right monitor always does something weird when I turn it on - it throws all my windows out of whack. I needed a way to put them back into place easily. Tools like Fancy Zones exist, but I wanted to make something different, so I whipped up WindowSmasher. It's a small tool that allows you to define up to 10 presets to sort your windows into. Its code isn't the greatest, but I open-sourced it as well.

Get it now!


I also open-sourced Kurumi for your viewing pleasure. Its code isn't any better, but you know. You can get it here.

Kurumi: sync time without the bullshit

by osk at 2019/11/19 (Tue) 1:31:51 am (edited)PERSONALOSKWARE

I run a Windows installation which has a very restrictive firewall. One of the things it blocks is Windows' NTP ("Network Time Protocol") service. This is the service that automatically synchronizes your system time to that of a specialized time server. If it's disabled, your clock will slowly desync over time, or, in my case, within a few days. My usual setup to deal with this is to just go to say, time.is and adjust the time manually. But, that requires effort, and after all, they say the best ideas arise out of laziness, right?

Jokes aside, I've created a tiny (66KB) tool that will synchronize your system clock for you, in case you don't want to use the built-in service. It's very simple and doesn't ask questions - just run it, and it'll tell you how badly out of sync you are, then offer to fix it. Hit "Fix" and all your problems will go away!

If you're interested, you can pick it up here.

If you find any bugs, this is the place to report them!

Welcome!

by osk at 2019/11/17 (Sun) 10:23:44 pm (edited)PERSONALUPDATE

Here I will post project updates, sneak peeks, and whatever else is on my mind at the time. Don't expect super-frequent updates, but hey - there's something new every once in a while. Please note that this blog is personal space. Please respect that (and as such, my interests).

You can star posts and comments you enjoy as much as you like, a bit like how Flipnote Hatena and Medium work. There's no limit to how many stars you can give something, but please don't bot it (I will throw sharp glances at you).

You can also comment on posts, and on replies to those posts. Your name and color is randomized (bound to IP). There's no CAPTCHA or anything like that right now, so see it as a bit of an experiment. Be civil, okay? I reserve the right to delete anything for any reason. If it ends up being an issue, I can always add CAPTCHA later or turn off comments. As long as your IP does not change, you can delete your comments with the DEL button next to it.

Happy sightseeing!