View All Companies
GoodWatch favicon

GoodWatch

GoodWatch is a free, open-source platform for discovering movies and TV shows with DNA-based categorization, aggregated ratings from multiple sources, and streaming availability information. It helps users find great content tailored to their preferences without overwhelming choice.

Visit Website

Latest Updates

Alper

Alper

December 5, 2025

Anti GoodWatch

I ❤️ working on GoodWatch. It's my passion project.

Still, every week I have a new idea for building something. If there's one thing I learned from this community it's that you have to bury the urge to start coding and actually validate if anyone wants such a product.

Also, every minute I spend with something else is cut from my valuable time working on GW.

So I made a decision

I will devote 10% of my project time (I still have my 9 to 5 <a:z1_oldboygrimace:994080995714289676> ) to secondary side projects.

To decide what I'll be working on I started a series of posts on X. Here you go:

Day 1 of gauging real user need for ideas in my backlog.

Day 2 of gauging real user need for ideas in my backlog.

Day 3 of gauging real user need for ideas in my backlog.

Day 4 of gauging real user need for ideas in my backlog.

Day 5 of gauging real user need for ideas in my backlog.

I need you <a:spongebob_imagine:1445265233256906853>

Please help me to understand user needs. If you have an X account, I'd really appreciate your input and thoughts over there. Otherwise, here.

The series is not finished yet, I'll continue posting more ideas daily for a while. Thanks for reading guys, a pleasure as always.

Alper

Alper

November 24, 2025

Onboarding 2.0

GoodWatch's onboarding sucks at the moment. Why?

  • Blocks all other views and website functions until you finish it
  • Has 3 steps: Select Country -> Select Streaming Services -> Score movies and shows
  • Not very user friendly - look at how confusing the second step already is (first pic)

-# pics are in the thread because Discord broke the attachments

So, I thought, what would be better than that? Here's what I came up with.

1. Reduce friction

Onboarding new users should start as early as possible. Therefore you can start as a visitor, even without being signed up.

2. The hook

Make it obvious to the user why they should care.

Rate just 10 movies to see the magic

See second image.

3. Make it fun

Scoring should feel fun, not like an obstacle. Therefore, it's just swiping. See the video attachment.

4. Make it rewarding

After just 10 scores, personalized recommendations are unlocked, providing real value. Third pic.

5. Gamify It

Progress bars and Level Ups keep the journey engaging. Hopefully that motivates some visitors to keep scoring. Pic #4

6. The Bait

Once half-way through the second level, it stops the user from scoring more and shows image #5.

It's clear now that signing up has two advantages:

  • they don't lose their progress
  • they get better recommendations if they keep scoring

7. Simplify

Once the user is signed in for the first time, they'll see a banner that lets them choose their country and streaming services. But this time, without blocking the rest of the UI.


Development of this is still in progress, but will be released soon. So, what do you think?

Is there anything you could improve in your onboarding process?

Alper

Alper

November 19, 2025

Today's topic: Backups

I'll start with a friendly reminder:

DO YOUR FRICKIN BACKUPS!

No, I didn't lose any data. But I realized that my new databases don't have any backup strategy at the moment and that made me very nervous.

As it should make you nervous too if you are lacking backups.

So, I'll share what I did and how.

Prepare a Backup Target

I use a Hetzner storage box. It has enough space (5 TB) for all of my side project backups, as well as my personal backups from my local NAS.

I connect to it via ssh, more specifically mounted as filesystem via sshfs.

Costs: € 11 per month.

Main database: CrateDB

CrateDB has a very well integrated backup solution. It has its own snapshots API which you just trigger via:

CREATE SNAPSHOT "goodwatch-backup"."{snapshot_name}" ALL WITH (wait_for_completion=true)

I mounted the snapshots folder to my Hetzner storage via docker compose.

The DB has 50 millions rows, is 60 GB worth of data and it took five minutes to take the initial snapshot.

5 minutes!

And the best thing: backups are INCREMENTAL. Means that from now on, only changes will be stored in the next snapshots.

Oh yeah, and the snapshots folder is distributed. That means every single one of my crate nodes is mounting the same remote folder in the storage box and crate handles the complexity of syncing snapshots over all shards.

I love this project so much. Can't imagine PostgreSQL ever coming even close to this DX.

Vector database: Qdrant

For Qdrant, backups are easy to create as well. Just fire up your favorite language and make an API request:

requests.post(f"{QDRANT_HOST}/collections/{collection_name}/snapshots?wait=true", headers=HEADERS)

Again, the snapshot folder is mounted to the storage box via docker compose.

10 GB of vectors, takes 1 minute.

These are not incremental, therefore we need a good ...

Backup Retention Strategy

Make sure that you have enough backups, without overflowing your storage.

My strategy is keeping the 3 last hourly, 3 daily, 3 weekly backups.

Cronjobs

I run the backups hourly. For CrateDB that's a breeze and I could even do it more often because it does not cause any downtime. For Qdrant it's maybe even too frequent, but it doesn't hurt.

I set up cronjobs via ansible:

- name: Configure Backup Cron Job for CrateDB
  hosts: db1
  become: yes
  tasks:
    - name: "Cron: CrateDB Backup (Hourly at :05)"
      cron:
        name: "CrateDB Backup"
        minute: "5"
        hour: "*"
        job: "/root/.local/bin/uv run /root/goodwatch/goodwatch-monorepo/goodwatch-crate/backup.py >> /var/log/backup_crate.log 2>&1"

Oh, and one more thing...

DO YOUR BACKUPS. NOW.

If that inspired you, leave an emoji worthy of a backup and subscribe