VPetkov.net

Pixel-Perfect: Turning AI Pixel Art Into Real Pixel Art

September 15, 2026 · 4 min · 731 words · Ventz

Ask any image model for “pixel art” and you get something that looks right from across the room and falls apart the moment you try to use it. Zoom in and the “pixels” are different sizes, the edges are blurry, and a sprite that should have 16 colors has 40,000. So I built a tool that recovers the real image hiding underneath: https://github.com/ventz/pixel-perfect

AI pixel art before and after restoration: blurry and uneven on the left, crisp true pixels on the right

How I Replaced USPS Informed Delivery With a Cleaner Email Digest

August 9, 2026 · 6 min · 1271 words · Ventz

When USPS Informed Delivery was announced, I was genuinely excited. Scans of your mail, in your inbox, before it arrives - that felt like a real step toward modernization. Then USPS did what USPS does, and butchered the execution. Today the digest contains more ads and “look over here” banners than the two things I actually care about: am I getting mail and packages, and when. So I built something that fixes it: https://github.com/ventz/usps-informed-delivery-no-ads

The rebuilt USPS digest: packages first with status and tracking, then the one real mail scan, with no advertising

The Internet Changed. So Did This Blog.

August 6, 2026 · 7 min · 1480 words · Ventz

After years of maintaining a complex WordPress-based blog, Linux servers, and a Datacenter Colo, I decided it was time to simplify. This new site is built with Hugo and focuses on one thing: making it easy to write and share ideas instead of spending my limited free time maintaining infrastructure. At the same time, I think we’re at another inflection point on the internet - one where AI is changing not only how we build software, but also what kinds of technical content are worth publishing.

Raspberry Pi Netflix One Line Easy Install - along with Hulu, Amazon Prime, Disney Plus, HBO, Spotify, Pandora, and many others

March 30, 2020 · 2 min · 409 words · Ventz

Last Update: 3-13-21 | Official Raspberry Pi Package now available - see bellow

Last Update: 11-9-20 | Updated ventz-media-pi for new Chromium version (v.84+) and new WideVine setup: v.4.10.1679.0+ NOTE: You MUST re-download and re-run it from this date to fix - lots of changes!

Last Update: 11-2-20 | Updated libwidevinecdm.so_.zip to v.4.10.1679.0 within ventz-media-pi

Last Update: 7-22-20 | Updated .desktop with Chrome User Agent string for CrOS Chrome/77.0.3865.120

Last Update: 7-20-20 | redacted company reached out about creating an official package, also there are conversations happening with redacted company about official support of the Pi

Last Update: 5-6-20 | Specify that “Raspbian with desktop” is assumed and tested

Netflix and Spotify on a Raspberry Pi 4 with Latest Default Chromium

July 13, 2019 · 6 min · 1246 words · Ventz

As of 3-30-2020, if you want the “paste-one-line-it-just-works” go to:

vpetkov.net/2020/03/30/raspberry-pi-netflix-one-line-easy-install-along-with-hulu-amazon-prime-disney-plus-hbo-spotify-pandora-and-many-others/

^^^ Please use the post linked above for my “one-line it just works” install ^^^
(Ignore everything bellow this, as it’s the original development work)

Massive Apple FaceTime vulnerability - turn any iPhone/iPad into a remote audio listening device

January 29, 2019 · 2 min · 231 words · Ventz

If you did not know about this - you should be very worried.

A few hours ago it was discovered that Apple’s FaceTime app allows anyone to connect to any Apple device that supports FaceTime and hear their audio without the person ever accepting the call. What’s worse (debatably?) is that it is incredibly easy to do this.

Listen-in on any remote Apple device in 4 steps

1.) Start a FaceTime call with someone
2.) While the call is “connecting”, quickly swipe up on the FaceTime menu
3.) Click on the “+ Add Person”
4.) Add your own phone number/contact

Easy fully automated WordPress plugin update system

September 30, 2018 · 3 min · 488 words · Ventz

A long time ago I became frustrated with having to update my WordPress plugins manually, so I created a Perl script and a blog post (vpetkov.net/2011/08/03/script-to-upgrade-plugins-on-wordpress-to-the-latest-version-fully-automatically/) that explained how to automate this. The idea was quite simple: feed a plugin name, have the script check the WordPress plugins page for the latest versioned download, grab it, and extract it over the specified blog plugins directory and thus update the plugin.

The script was simple and it worked very well. It made dealing with plugins many times easier. However, there was one big down side as some users pointed out - it did not actually check if a plugin needed to be updated. It blindly replaced the current plugin with the latest version. This meant that there was no way to “efficiently” automate it. If you cron-ed it directly, it would simply pull and update all your plugins at whatever period you specified. For the longest time this really irritated me, but I didn’t have time to dig through WordPress to understand how the engined checked and signaled for local plugins. One particular user (Joel) forked a copy and made many improvements to deal with this specific issue.

As time went on, I decided to look at this problem again. A couple of years ago I solved it in a really elegant way, but I didn’t have time to update the blog post. A few days ago, after looking at the blog statistics, I realized that the WordPress article was one of the top 10 most popular ones. So, with that said, here is:

A new simple and elegant solution

The idea is to use the WordPress CLI in order to “query” the local plugins database for plugin names, version number, and “activated” status, and then compare the “local” plugin version with the “remote” plugin version. If the plugin is active and in need of an update, fall back to my original Perl script to update it. Aha! And now we have something that can be cron-ed 🙂

To get started, first grab the WP CLI utility. We are going to rename it, move it to an accessible place, and take care of permissions so that we can use it:

curl -O  https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp && chmod +x /usr/local/bin/wp

DIY - Monitor Heating Oil Tank Gallons with Pushbullet, SMS, and Email Alerting

November 12, 2017 · 27 min · 5549 words · Ventz

NOTE: Updated code 10-27-2018

In this day and age where everything is measured, recorded, and available remotely (via a REST API most of the time!), it really bothered me that our heating oil tank measured the remaining gallons of oil by a crude plastic dip stick. It’s not accurate, there is no historical data, and there is no way to audit (for honesty, accuracy, or problems/errors).

So the problem is simple enough: Find a quick and easy way to remotely monitor the number of gallons of heating oil in a home, and alert at pre-set intervals (let’s say 75%, 50%, and 25%) of remaining oil in the tank.

After looking for commercial solutions, the cheapest one I found is $120 with a $10/year fee. In my view, that’s simply ridiculous. I decided that I could build something better for 1/3rd of the price ($40), without an yearly fee.

Hardware How-To

Start with this Instructable I created with the exact parts/steps, and with lots of pictures:
https://www.instructables.com/id/Monitor-Heating-Oil-Tank-Gallons-With-Email-SMS-an/

This should take care of the hardware side.

The perfect OpenConnect GUI Menu Bar App with 2FA/Duo support - for Mac OS X

July 26, 2017 · 1 min · 127 words · Ventz

You need to connect to a Cisco AnyConnect (or Juniper Pulse Connect) VPN, and you cannot stand the default client for a variety of reasons (slow connects, crashes, unable to start, pointless pop-up notifications, crashes, pid-loss, etc), and so, you look for alternatives.

You find OpenConnect - the perfect solution, only to realize that the 3rd-party GUI is basically broken and actually doesn’t work (last checked on 8-14-17) with 2-Factor authentication (ex: Duo).

At this point, you can run OpenConnect from a terminal, which works, but you have to keep the terminal open and you have to wrap the long command in a shell script.

Or, you can use my little solution which seems to work perfectly.

OpenConnect GUI - Connected

OpenConnect GUI - Disconnected

Everything you need to get started is on GitHub:
https://github.com/ventz/openconnect-gui-menu-bar

Monitor Docker resource metrics with Grafana, InfluxDB, and Telegraf

August 5, 2016 · 5 min · 929 words · Ventz

I needed a way to monitor Docker resource usage and metrics (CPU, Memory, Network, Disk). I also wanted historical data, and ideally, pretty graphs that I could navigate and drill into.

Whatever the solution was going to be, it had to be very open and customizable, easy to setup and scale for a production-like environment (stability, size), and ideally cheap/free. But most of all - it had to make sense and really be straight forward.

3 Containers and 10 minutes is all you need

To get this:
Grafana dashboard showing Docker CPU, memory, and network metrics

Grafana Docker metrics dashboard thumbnail
There are 3 components that are started via containers:

Grafana (dashboard/visual metrics and analytics)
InfluxDB (time-series DB)
Telegraf (time-series collector) - 1 per Docker host

The idea is that you first launch Grafana, and then launch InfluxDB. You configure Grafana (via the web) to point to InfluxDB’s IP, and then you setup a Telegraf container on each Docker host that you want to monitor. Telegraf collects all the metrics and feeds them into a central InfluxDB, and Grafana displays them.

Setup Tutorial/Examples