Category: Raspberry Pi
Nov 27, 2022
Want to just connect? — Skip straight to the hardware setup and script sections.

WebTV was a service launched in 1996 that brought this amazing new internet craze right into your living room, and it was a pretty compelling device for its time. You could view newsgroups, join IRC chatrooms, send emails, browse the web, and on later models simultaneously watch TV in Picture-in-Picture mode.

When I was in middle school my brother had one, and he’d pay me to write eBay listings on it. I spent countless hours on that thing chatting, designing flashy HTML 3.2 listings, and listening to its vast library of midi background music.

Honestly, even by today’s standards, WebTV puts most smart TVs’ capabilities to shame. Sure it can’t do streaming video or Netflix, but streaming video barely existed as a novelty at this point, and Netflix wouldn’t begin their transition to online distribution for a whole decade yet.

This launch video provides some context of how mind-blowing the WebTV was for the time, and it only got better. Later models could even display program schedules and control your VCR to record shows like a DVR, which you could then watch later while hanging out in a chatroom. From your couch. In the freaking 90s.

WebTV returns

A few weeks ago I saw a Philips MAT976 WebTV at the thrift store but passed it up figuring it was a brick–the service died long ago, after all. Imagine my delight, then, when I found this YouTube video by Michael MJD showing a project well on its way to restoring the experience.

Naturally I rushed back and bought the unit, then set about connecting it.

Philips MAT976 WebTV box
Paid a whole $12.99 to get my childhood back

Suppose you’ve also just bought a WebTV and want to connect it to one of the custom servers currently out there. How might you go about doing that?

Hardware setup

The first thing you’ll likely need to do when setting up an original WebTV unit is clear its settings. You can do this with a “power off code.” Just have your WebTV plugged in but in a powered-off state, then do one of the following:

  • Keyboard: Press option 3 times, then type 32768
  • Remote: Press option 3 times, then HOME, BACK, ↑, ↓, GO

The lights on your box should give you a fun little show for a few seconds, then all tellyscript, dialing options, TV listings, etc. should be cleared giving you a more or less blank slate to work with.

Buying the right modem

To connect to modern servers you’ll need to go over the internet. To do this you’ll need a Linux-compatible USB voice modem connected to an internet-connected Raspberry Pi. The common wisdom around the community is you should be using something with a Conexant RD02-D400 chipset. Common models of these include the Lenovo RD02-D400 and the Dell NW147. Based on my reading Zoom, StarTech, and US Robotics may have also made RD02-D400 USB modems, but I’m having trouble finding model numbers for those.

It’s worth noting that this modem isn’t connecting to a real phone line. Your WebTV won’t actually be dialing out, and you don’t need phone service. Your Pi is going to trick the WebTV into thinking whatever it dialed was real.

Buying the right Raspberry Pi

I don’t even want to admit how many hours I lost to this project figuring a Pi 2 Model B would be fine, because come on. It’s just using a USB modem. How resource-intensive could that be?

Linux top command showing 104% CPU usage

Get a Pi 4 for this. And hook it up with ethernet. You can try your luck with wifi, but for me that also caused extreme unreliability and inexplicably slow connection speeds when it did work.

Phone line simulator 2022

Lastly, you need to power your phone line. Old phone lines had voltage on them, and your devices are expecting that voltage to be there.

You might see USB modems for DreamPi designed with a line voltage inducer built in, but skip those. The WebTV wants that line voltage cranked. An AC to DC adapter that puts out anywhere from 15-25V DC should work.

To build your phone line, you need to cut a pair 1 wire and splice the positive and negative from your DC supply in with it. Pair 1 is the innermost two pins on your telephone connector. Normally this pair is red and green, but color may not help here since there were multiple standards and some manufacturers also didn’t give a crap. Which wire of pair 1 you splice into makes no difference.

Telephone wiring pinout
Borrowed from

The DC power supply should go inline with your chosen wire such that signal is coming down one wire, through your power supply, and back out to the same wire. Which way you hook positive and negative also makes no difference.

You may be feeling like this is all very slapdash advice. Just splice inline with either wire in either direction? And nothing’s going to get fried? Yes. I went ahead and tested this with straight-throughs, rollovers, and reversed polarity in each, and you get a nice dial tone in any configuration. Pair 1, pick a wire, splice in, don’t overthink it.

Connect one end of your powered phone line to the WebTV. Connect the other end to your modem. Connect your modem to a Raspberry Pi. Connect the Pi to the internet.

WebTV wired up

Software setup

To connect your hardware, you’ll be dialing to what’s called a minisrv. This is a recreation of WebTV’s original servers by Zefie with assistance from eMac, MattMan, Jarhead, and Sgeo. There are a number of public minisrvs, covered later. In order for your WebTV to contact a minisrv, your Pi will need to accept dialing attempts from your WebTV, then provide routing for what it’s sending to the correct endpoints on a minisrv.

The dialup and routing methods available as of this writing are a little tricky, but everything’s there if you piece it together. There’s MattMan‘s DreamPi For WebTV V2 Raspberry Pi image which is easy enough to flash over to an SD card and start up, but there are newer routing rules that aren’t in it as of this writing. There’s also notdreamnorpi by samicrusader that isolates the essential USB modem connection components of DreamPi, but it doesn’t come with the routing necessary to make a WebTV function once it completes its dialup connection. Lastly there’s an nftables gist by nitrate92 that contains the necessary routing, but the rules may get dropped on every restart without further configuration.

The simplest solution seems to be getting an old version of notdreamnorpi operational on a pi with the nftables rules from nitrate92’s gist added. I’d recommend this over attempting to add the routes to the DreamPi image, as it was built with Raspbian Stretch and doesn’t include the kernel modules necessary to make nftables function.

If you don’t care how any of this works and just want to start surfing, skip to the end of this section for the lazy bash script.

Installing Raspbian

First you’ll need a base Raspbian image, so grab the Raspberry Pi Imager and get an SD card ready. You’ll want to choose Raspberry Pi OS (other) and then Raspberry Pi OS Lite. I tested on 32-bit Raspbian Buster 2022-09-22. This will give you a fresh OS with no desktop environment. There’s zero point in having a desktop environment for this since it’s just going to sit behind a TV and pretend to be a phone line.

With the image written to your SD card, hook in a monitor and keyboard for first-time setup. Get your locale, hostname, network settings, etc. right and remember to enable SSH if needed. Since it will probably be buried in a nest of TV wires, SSH can be a real blessing.

Retrieving notdreamnorpi

Next you’ll want to get a copy of notdreamnorpi and install your dependencies. You’ll want this old version since the current one is hit-or-miss detecting the modem on Raspbian Buster.

Also note: On line 21 in this build of notdreamnorpi, there’s a reference to /sbin/init –version. That won’t work on Raspbian, and will crash notdreamnorpi. Replace /sbin/init with /usr/bin/systemd/systemd.

The dependencies you’ll actually need in this setup vary a bit from what’s in the readme, so do sudo apt install wvdial python3-psutil python3-serial python3-sh python3-systemd.

Something else to note here is notdreamnorpi will need a free IP address for the PPP link it makes. It will try to search your network for one, counting backwards from x.x.x.100. This isn’t always successful and can easily squat right on a static IP for something else and cause conflicts. This probably won’t happen to you, but if it does, edit line 96 in ~/notdreamnorpi/ to start searching in an IP range you know is unused on your local network.

Adding and preserving nftables rules

For the webtv.nft gist, save webtv.nft wherever you like on your pi and run sudo nft flush ruleset and sudo nft -f webtv.nft to set the rules.

The only problem here is that all the rules may be gone whenever you reboot the Pi. To keep them around we need to persist them somehow. There are a lot of ways to do this, but the cleanest is probably just to run the above commands in a systemd unit file that also starts notdreamnorpi once the network is up.

Running notdreamnorpi on startup

With everything in place, we need to ensure notdreamnorpi provides a dial tone when the Pi starts up. Then we have a set-and-forget solution that can be reset with a power cycle.

Again there are a lot of ways to do this, but we’ll cover the systemd unit file. Nitrate92 was kind enough to share theirs, and it does the job perfectly while also persisting the nftables rules. I’ve lightly edited it here:


ExecStartPre=/usr/sbin/nft flush ruleset
ExecStartPre=/usr/sbin/nft -f /home/pi/webtv.nft
ExecStart=/usr/bin/python3 /home/pi/notdreamnorpi/


Create this file at /etc/systemd/system/dreampi.service.

Ain’t nobody got time for that

I hear you. If you don’t care how any of that works and just want a script that does everything above with the recommended settings, here you go. Just grab a Pi with Raspbian Lite on it, copy this into a .sh file in your home directory, run it, and reboot. Enjoy your dial tone.

# For Raspbian Pi OS 32-bit 2022-09-22.

# prevent root
if [[ $EUID -eq 0 ]]; then
  echo "Script will sudo when it needs to. Just run it as a regular user." 1>&2
  exit 1

echo "Setting up dependencies, notdreamnorpi, WebTV routing rules, and systemd unit file..."
sleep 1

# install dependencies (throw kitchen sink, you likely already have many of these)
sudo apt install -y git ppp net-tools nftables wvdial python3-psutil python3-serial python3-sh python3-systemd

# clone notdreamnorpi - archived version, works well in systemd unit file
mv notdreamnorpi-da8225eb716fa3af9fb3e7d02431033605935f68 notdreamnorpi
sed -i -e 's/\/sbin\/init/\/usr\/bin\/systemd\/systemd/' notdreamnorpi/ # /sbin/init --version doesn't work on raspbian, crashes notdreamnorpi

# download webtv.nft
wget -O webtv.nft
sudo nft flush ruleset
sudo nft -f webtv.nft

# set up the systemd unit file
ExecStartPre=/usr/sbin/nft flush ruleset
ExecStartPre=/usr/sbin/nft -f /home/$(whoami)/webtv.nft
ExecStart=/usr/bin/python3 /home/$(whoami)/notdreamnorpi/
echo "$unitfile" > dreampi.service
sudo mv dreampi.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable dreampi
sudo systemctl start dreampi.service

echo ""
echo "All done. Configured to route to Zefie's minisrv. Recommend rebooting before using."
echo "To change servers any time, edit ServerIP in /home/$(whoami)/webtv.nft then reboot."
echo "If you have something with a static IP around x.x.x.100, x.x.x.99, etc. edit line 96"
echo "of /home/$(whoami)/notdreamnorpi/ to start IP searching in a known free range."

If you need to debug this, you can view live logs from the service with journalctl -f -u dreampi. Mine still fails to connect sometimes, but I find it’s usually the WebTV needing a power off code instead of a problem with the Pi.

Now you’re on the World Wide Web

Available servers

While JarHead‘s server from Michael MJD’s video isn’t yet public, there are a couple of other public servers up and running. You can find Zefie’s minisrv by setting the server address to (default in above script), or MattMan’s HackTV minisrv at These don’t try to offer the original experience, but they will let your original hardware browse the web again just like it used to, and each has its own fun surprises in its custom menus.

Space Jam website on WebTV
Everybody get up, it’s time to slam now

You can also make your own server and do whatever you like with it if that’s more to your taste. Zefie’s minisrv repo is how you would get started with that.

Lastly, if you’d like to chat with the WebTV modding community, there’s a Discord server at

May 14, 2015

Sometimes you really want to play with a Raspberry Pi, but don’t have a display, keyboard, or mouse handy, and the wifi isn’t configured correctly to just be able to SSH in. Invariably you spend an hour digging around for a keyboard or refreshing a wireless clients list, but this doesn’t have to be the case. After a quick one-time setup, everything you need to use a Raspberry Pi will already be in your pocket.

Android Raspberry Pi display over USBThe idea

Once configured, if you have an Android phone with USB tethering and a cable, you should be well-equipped to use your Pi. Bonus points if you have a bluetooth mouse and keyboard. We’ll be setting up a USB network interface on the Pi and installing a VNC server to pass a session over that interface, thus making your phone a Raspberry Pi display. By the end you should be able to just power up your Pi, plug in your phone, turn on USB tethering, and open up a full desktop.

Setting up the network

Log into your Pi via SSH or open up a terminal in its GUI and pull up your network interfaces.

sudo nano /etc/network/interfaces

Paste the following onto the bottom of the file, then save and exit (ctrl-X, Y):

iface usb0 inet static

On your next restart, you should have a new interface when you type ifconfig. We’ve set this interface to have a static IP address, always, which you will later use to start your VNC session or connect via SSH on your phone.

Configuring VNC

VNC, or Virtual Network Computing, is a way of sharing a graphical desktop environment over a network, which in this case happens to be your phone’s USB cable. First, we need to install a VNC server onto the Raspberry Pi. We’ll be using TightVNC since has a tutorial for it and it’s easy to find help on forums.

sudo apt-get install tightvncserver

Next, use the command tightvncserver to configure VNC for your Pi. It should ask you for a password–be aware that TightVNC will truncate your password to eight characters. It does tell you this in the terminal, but it can be easy to miss and lead to many failed login attempts.

Lastly, we need the VNC server to start up every time the Pi starts so that you really do only need your phone. First, change into your /etc/init.d directory.

cd /etc/init.d

Create a new file called vncboot. You’ll need root privileges to change anything in this directory.

sudo nano vncboot

Paste the following into the file (change export USER=’pi’ to your username if not pi, and edit the screen resolution in the start) block if necessary):

#! /bin/sh
# Provides:          vncboot
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Run tightvnc on boot

export USER='pi'

eval cd ~$USER

. /lib/init/
. /lib/lsb/init-functions

case "$1" in
    log_begin_msg "Starting VNC server"
    su $USER -c '/usr/bin/vncserver :1 -geometry 1680x1050 -depth 24'
    log_end_msg $?
    exit 0
    pkill Xtightvnc
    log_begin_msg "Stopping VNC server"
    log_end_msg $?
    exit 0
    echo "Usage: /etc/init.d/vncboot {start|stop}"
    exit 1

Save this file, then update its permissions:

sudo chmod 755 vncboot

Finally, run the following command to add it to your startup:

sudo update-rc.d vncboot defaults

Reboot your Pi and it should be ready to rock.

Getting connected

Now that one side of your setup is complete, you’ll need a VNC client on your phone. VNC Viewer seems plenty quick for this purpose and you can’t argue with the price. Optionally, you may also download an SSH client like JuiceSSH for those times when a GUI just isn’t necessary.

With your app downloaded, power up your Pi and connect your phone via a data USB cable. As your Pi boots up, you should get a notification that the phone is now connected as a media device. Go into your phone’s settings and turn on USB tethering.

Assuming you’ve given the Pi enough time to boot, you should now be ready to pull up your desktop. Open your VNC viewer app, connect to (the :1 is important here), and provide your password. If you just need to SSH, open up your SSH app and connect to

Congratulations! You now have a Raspberry Pi display, keyboard, and mouse even when you don’t physically have those items available.

Feb 14, 2015

My kitchen was missing something. I’d looked at clocks and artwork, but none of the options were simultaneously affordable and nerdy enough for my liking. What I needed was a way to incorporate my love of thrift store finds and coding into something functional, attractive, and unique that would cause my visitors to be delighted […]

Continue reading...
Dec 3, 2014

One point that became immediately clear upon running my Raspberry Pi remote control car was that any decent control system needed a way to accommodate new hardware and improved scripting without requiring significant, irreversable modifications to the program. The bot needed a way to accept easily upgradeable bite-size plugins to control things like moving forward […]

Continue reading...
Fork me on GitHub