Vincent Ritter

← back to projects

Sublime Ads

A privacy focused ad management service for your apps, websites and others.

Sublime Ads is a platform to allow you to manage and serve your very own ads in your own apps, on your websites, or other services using a simple API, or a lightweight drop-in JS script. You are in complete control on what you want to show, and how.

Everything is in one place and is easy to manage, no need to write your own custom solution. On top, Sublime Ads is privacy conscious to you and your users. Only taps/clicks will be registered for served ads and nothing else (can also be disabled per ad). I also don't use any tracking for the web application and other things, just like the internet is supposed to be.

Launched early 2021 as an MVP product to satisfy my very own needs as a developer with multiple apps and sites.

Visit the website here.

Project posts JSON/RSS Feed...

If you're using Sublime Ads, I've updated the embed.js javascript. Now it's loaded as a module and there is an updated script tag. The old way still works for now. This allows me to skip any complicated build steps. Updated docs are here.

Spent some time on Sublime Ads yesterday and changed over the build architecture for JavaScript and CSS β€” basically moving away from using Webpack. Now a happy user of cssbundling and jsbundling.

Got a bit of interest recently on the project, considering the ad landscape is 💩

Last week I tweaked the header navigation in Sublime Ads. Looks nice! Will probably use this idea elsewhere.

Sublime Ads now includes a 42 day free trial (yes!) and also has all features enabled, so there is no need to add your details before unlocking other features during the trial.

I recognise the fact that you want to implement this in your apps or sites. Should be enough time.

Last week I changed the initial Dashboard that is shown in Sublime Ads... think it looks better with the tiles. Might explore this further and add Clients to it too.

Decided on the new pricing plans for Sublime Ads. They are the same, except the highest one... which is now $27/month instead of $39.

Current line up (Pay what you want):

  • $4/month
  • $9/month
  • $18/month
  • $27/month

Should appeal to indie developers near and far ✌️❀️

I'm transitioning Sublime Ads to be used more by indie devs, and less by big players, so I'm scrapping the Team features. I also added the "pay what you want" model to further help devs integrate this on their budget. Still need to figure out new pricing. 30 day trial now also.

Just added an extra little option in Sublime Ads to add a portal logo into the header for the client area. That including all the other portal settings too.

Sublime Ads - Client Portal options

Today I'm introducing a new minor feature for client portals on Sublime Ads.

You can now add extra info to your portals, for example a title, some welcome text and also a payment link.

At first, this will apply to all portals and I'm working on making these overridable on a per portal basis, giving you extra flexibility.

This is just a small step to run your whole ad system through Sublime Ads, giving you flexibility for portals, getting ads into your app, and of course getting paid.

For more information you can head on over to the documentation.

I've tweaked the pricing model for Sublime Ads today. Something I wanted to do since shoutouts.lol. Now pricing is a "pay what you want" kinda deal. Good for any budget.

I also removed API limits, so everyone gets the same service. Of course there is still the fair usage policy, but hopefully it won't stop a lot of folks.

You don't have to think about it which API limits you want. Pricing will change at some stage, but I am still thinking about price points. Probably $7, $14 (default), $21 etc. Existing plans are not affected.

Trials still exist but won't have everything enabled until you enter your card details. I think that's a good compromise.

Oh and I removed the yearly price plan. If you want anything yearly, just use shoutouts.lol.

Sublime Ads: Default Image Resize Options

Today I added settings that allow you define your default image resize options in Sublime Ads.

When calling the API, your images are automatically resized to 500 pixels wide with a quality setting of 95 (100 being the highest), without the need for you pass in extra parameters as per image resize options. This is done to preserve some bandwidth and make sure you're not sending huge images.

You can override these default settings on your settings page, to fine tune it to your needs for your app – removing the need to add extra parameters when calling the API. Useful when you just want to change things without having to update your app (unless you added image resize options).

Hope this is useful to some of you.

Without going into too much detail, if you're using Sublime Ads and the Edge API, note that I will be deprecating the Edge API come next year. It doesn't meet my quality standards, so it's going away. I'll make sure to resolve existing integrations as normal.

Coded up a real quick and simple feature to Sublime Ads, allowing you to filter your ads by client. Simples. Something I needed more and more.

Sublime Ads - Downtime report (2022-11-13)

So sorry for the unexpected downtime today (I hate downtime!). Long story short, here are the series of events that caused this, and how I fixed it:

  • As part of the general application framework updates today, I also wanted to re-size the server instance. This was due to the fact that it was running on a quite large server that I did not need. Deployments used to be slow due to assets having to compile on deploy, so the larger server was used to accommodate that. However, the framework upgrades make this redundant... as I am moving away from webpacker and upgrading the project to use Propshaft and import-maps (at a later stage).
  • I resized the server without issue, however immediately on boot the application was throwing an internal server error.
  • I tried a re-deploy of the application, to see if something has gone amiss. No dice.
  • Investigation showed that the internal server network has somehow corrupted both Redis and Postgres connection strings, now no longer connecting as intended. The network was set up by the service provider that provisions the servers on my behalf (I hate server management). Unfortunate for me, out-of-hours support was not possible to help me try and resolve this.
  • Going to my server provider I deleted the internal network interface, and re-created it. The server provisioning provider picked up on this fact, and told me to re-deploy so it can re-create the connection strings and other variables for the changed network.
  • No-go. All still failing.

🛏️📖 Bed and story time for my daughter.

Stressed me, returning after 45 minutes:

  • I have a fail-over group, that should allow me to fail over to another server. Unfortunate for me, the internal network was screwed.
  • Tried then to spin up a new server, with a clone of the application so that I can point the "failover" to a new primary server.
  • That did not work as it couldn't find the network ID it created initially on the server provider (which I deleted in the step above). Damn!
  • Enabled "maintenance mode", which shows a placeholder message.

At this stage, I downloaded the latest database backup, which runs every hour and is available to me at any time I so require. I didn't want to take any chances. Of course I couldn't do a backup right there and then, because the network was... fucked. Even SSH'ing wasn't playing ball. Thankfully the last backup was recent.

Where was I?

  • Spin up a new application, cloning my existing application settings, as a new project. This takes time! A long time, as it has to provision new servers and everything else. Oh the joys of waiting.
  • Whilst waiting 20 minutes for a brand spanking new server to provision, I decided to also provision the application on another server of mine that is the new way I want to do things - which actually runs shoutouts.lol. Of course this is a bit more involved, like copying across all the secrets, SSL certs and all that good stuff.
  • After 20 mins of waiting for the other server, it told me it failed. OK, so try again I guess, which starts the whole process again. Another wait.
  • Back to my nice server, everything seems to have been deployed, but got one failed attempt as I hadn't given it access to the encryption keys for the database used for Sublime Ads (I hate the fact I did it like this in the first place...). OK, added, deploy again.
  • I set up a new hostname to point to the "nice" server. The application was up and running, and it was working. Database backup restore next...
  • The other server was still provisioning.
  • I wanted to restore the database using my GUI client, TablePlus, but it didn't want to play ball, so I SSH'd into the server and just did it via the CLI. Super easy once I figured out that I can put a full psql url in there for authentication!
  • Another notification from my other server saying deploys have failed... urgh. Complaining about encryption. At least I know what that was about. It needed the keys to encrypt and decrypt the database.
  • I hit up the new subdomain of my "nice" server that is serving my application, and I can see good things. It seems to be up and running with the data intact.
  • I run a few manual tests, like account creation, ad creation and so on, just to make sure it's not running into any issues with encryption (I had that once). But everything was A-OK.
  • I give up on the screwed servers.

This is where I am happy I choose Cloudflare as my DNS host. Changing A records would have caused even more downtime than I wanted (because it had none for the root domains - see next sentence), but the subdomain was already resolving nicely. The problem was that the root domain was pointing at a fail-over group CNAME, which means it could direct traffic as needed without DNS config. Deleting the CNAME was not an option for me, as that would certainly cause even more disruption.

So, really long story short, I pointed the CNAME to the subdomain... and BOOM, Sublime Ads was up and running again.

Cloudflare proxies requests, so this was an instant switch.

What have I learned? Don't do this close to your kid going to bed.

And the second lesson is, if your server provisioning provider makes stuff really complicated, don't go for them because it's a huge blackbox...

Now Sublime Ads runs with Puma behind Caddy, and I am happy. Not because it works, but because it's easier for me to manage.

An unexpected change that I did plan (to move to the "nice" servers) at some stage, but not today... I certainly would have done it without the downtime... but here we are.

Whilst the app was down, there might have been a few missed tracking events, like Views and Taps. I am making plans to make this more robust and move all this to the edge network which will queue up anything that could not hit the main servers.

OK, Sublime Ads is back up and running as of an hour ago. So sorry for the unexpected downtime today (I hate downtime! I really do!). Writing a short update and will post why it happened.