# WaybackProxy puts a dated snapshot of the web behind a local HTTP proxy

> WaybackProxy is a Python HTTP proxy that answers requests from the Internet Archive Wayback Machine or OoCities, stripping the toolbar and injected scripts so a retro browser sees the page as it was. It supports PAC, explicit proxy and transparent modes, and it is not a general purpose proxy.

**richardg867/WaybackProxy** — HTTP proxy for tunneling requests through the Internet Archive Wayback Machine

- Repository: https://github.com/richardg867/WaybackProxy
- Stars: 780 · Forks: 63
- Language: Python
- License: GPL-3.0
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/richardg867-waybackproxy

## The proxy rewrites your requests into archive lookups and strips the extras

WaybackProxy is a retro friendly HTTP proxy that retrieves pages from the Internet Archive Wayback Machine or from OoCities and delivers them in their original form, without toolbars, scripts and other extraneous content that may confuse a period browser.

That last clause is the point of the project. The Wayback Machine rewrites archived pages so that they work today: it injects a navigation toolbar, rewrites asset URLs to point at archive.org, and adds scripts. On a modern browser that is a convenience. On Internet Explorer 4 running on Windows 95, as the screenshot in the README shows, the injected script can break the page or the browser. The proxy undoes the modern wrapping and hands back something closer to the original bytes, then lets a 1999 browser render it as intended.

The audience is therefore specific: people running old browsers, old operating systems or emulators who want to look at, or automate access to, the web as it was. The README links to 86Box, the emulator the author uses for testing on older browsers, which tells you how the project is used and tested.

The proxy also routes Geocities traffic to oocities.org when GEOCITIES_FIX is enabled, so the surviving Geocities neighbourhood pages can be read without the original service's remaining infrastructure getting in the way.

## Three ways to point a browser at it, including transparent proxying

The setup instructions offer three connection modes, and the choice is a real trade-off rather than a matter of preference.

The easiest is proxy auto-configuration. If the browser supports PAC files, you set the auto-configuration URL to http://ip:port/proxy.pac, where ip is the address of the machine running WaybackProxy and port is the proxy's port, 8888 by default. The browser then decides for itself which requests to send through the proxy.

The second option is an explicit HTTP proxy, pointing the browser at that same IP and port when auto-configuration is unsupported or does not work.

The third is transparent proxying, described as being for advanced users and requiring no configuration of WaybackProxy itself. The mechanics are DNS based: run the proxy on port 80, which the README notes cannot be done on Linux without security implications, set up a fake DNS server such as dnsmasq configured with a rule that redirects all requests to the proxy's IP, and point client machines at that DNS server. No proxy setting is visible to the browser at all.

Transparent mode is the most convenient for a machine full of period software that has no proxy settings to change, and the most demanding of the host, since it needs port 80 and a DNS server under your control.

## config.json holds the date window, and the settings page is temporary

Configuration lives in a JSON file at the root of the repository, and the setup steps start with editing it. The one setting the README calls out specifically is QUICK_IMAGES, which must be set to false on systems without a direct Internet connection.

The date controls are the core of the configuration. DATE selects the snapshot to fetch, in YYYYMMDD, YYYYMM or YYYY format, and the documentation notes that the more specific the better. DATE_TOLERANCE allows the client to load pages and assets up to X days after that date, with 365 as the default, and setting it to null disables the restriction entirely.

Those two settings together define the experience. A tight YYYYMMDD date with a small tolerance gives you a frozen point in time, which is what a historian wants. A YYYY date with the tolerance left wide gives you the closest thing the archive has for that month, which is what somebody who just wants to browse an era wants.

The proxy also exposes a settings page on http://web.archive.org while you are on the proxy, so you can adjust most of these values from the browser during a session. The README is explicit that changes made there are not permanent: you must edit config.json to make them stick. A whitelist.txt file lets you exclude domains and URLs from being proxied, written without the http:// prefix and with wildcards supported.

The Python side is small. The repository holds waybackproxy.py as the entry point, config_handler.py for configuration, error.html for the error page, and startup.sh for the container entrypoint.

## QUICK_IMAGES and WAYBACK_API decide how many archive requests are made

Two switches control the request pattern, and they matter for both speed and reliability.

QUICK_IMAGES, enabled by default, uses the original Wayback Machine URL as a shortcut when loading images. The browser must have an Internet connection that can reach the Wayback Machine for this to work, which means images bypass the proxy entirely and are fetched directly by the client. The upside is speed, since images never pass through the local proxy, and the downside is that the archive sees those requests from your machine rather than from the proxy, with the rate limiting consequences described later.

WAYBACK_API, also enabled by default, uses the Wayback Machine Availability API to find the closest available snapshot to the requested date instead of requesting that date directly. This is what makes a YYYYMM or YYYY request usable, because the archive frequently has no capture for the exact date you asked for and would otherwise return an error page.

Two smaller switches round out the set. CONTENT_TYPE_ENCODING allows the Content-Type header to contain an encoding, which older browsers and servers can be strict about. SILENT disables logging to STDOUT when set to true, which matters if you are running the proxy inside a container whose output is being collected.

On the Python side the dependency list is one line, urllib3>=1.25, so the proxy is not hiding a heavy stack behind the interface.

## The Docker image exposes the same settings as environment variables

A Dockerfile is included, and the container image is published on Docker Hub as richardg867/waybackproxy. The design goal is that no configuration file needs editing when you run it in a container: every setting in config.json has a matching environment variable, and the Dockerfile takes the same names as build arguments with defaults that match the documented values, LISTEN_PORT=8888, DATE=20011025, DATE_TOLERANCE=365, GEOCITIES_FIX=true, QUICK_IMAGES=true, WAYBACK_API=true, CONTENT_TYPE_ENCODING=true, SILENT=false and SETTINGS_PAGE=true.

Pulling and running the published image takes two commands, and the date is passed as an environment variable with the port published on 8888:

```bash
docker pull richardg867/waybackproxy:latest
```

```bash
docker run -d -e DATE=20011025 -p 8888:8888 richardg867/waybackproxy
```

Building the image yourself is the same shape, with the Dockerfile and tag given explicitly and the cache disabled:

```bash
docker build --no-cache -f Dockerfile -t waybackproxy .
```

```bash
docker run -d -e DATE=20011025 -p 8888:8888 waybackproxy
```

The base image is python:3 with the working directory set to /app, the source copied in, and requirements installed with pip using the root user action ignore flag so the build does not warn about running pip as root. The container entrypoint is startup.sh, and the exposed port is the LISTEN_PORT value.

One detail carries over from the non-container instructions: the HOST variable, blank by default so the proxy binds on all interfaces, is described as only useful with host networking, which is the same case for LISTEN_PORT.

## It is not a general proxy, and the archive is the unreliable part

The README lists the limitations plainly, and the first one is a boundary rather than a bug. WaybackProxy is not a generic proxy: HTTP POST, CONNECT and other methods are only supported on excluded domains for passthrough purposes. If you put a browser with modern HTTPS through it and expect the tunnel to work, it will not.

Second, transparent proxying mode requires HTTP/1.1 and therefore cannot be used with some really old, pre-1996, browsers, which have to use the standard mode instead.

The rest of the list is about the Internet Archive rather than about the proxy. The archive is described as not 100% reliable, with known issues including pages newer than the specified date, which the README says is helped by setting a specific YYYYMMDD date rather than a wider YYYYMM or YYYY, random broken images, strange 404 errors caused by bad server responses or incorrect URL capitalization at archival time, infinite redirect loops, and server errors when it is having a bad day.

Rate limiting is the other operational reality. The Wayback Machine blocks IPs for a few seconds, with connection refused errors, if connections are made too quickly. The proxy has measures to try to prevent that, but the block can still be triggered if QUICK_IMAGES is used alongside the PAC file, because that bypasses the proxy and connects to the archive directly, or if multiple instances of the proxy run on the same Internet connection at once.

One capability deserves a note because it explains a common frustration: the proxy works around some redirection scripts, of the form http://example.com/redirect?to=http://..., which are not archived, but the destination URLs are sometimes not archived either.

## GPL 3.0, no tagged releases, and a last push in April 2026

The licence is GPL-3.0, with the terms in the LICENSE file at the root, and the Dockerfile header records the same licence. GPL 3.0 carries copyleft obligations for distributed derivatives, which is a stricter arrangement than the permissive licences common in small utilities, and it is the arrangement to keep in mind if you intend to modify and redistribute the proxy.

The repository publishes no GitHub releases, so there is no version to pin and no changelog to diff against. The last push was on 2026-04-12 and the repository is not archived, so the code is available but there is no tagged release stream behind it, which means anyone running it is running whatever commit they cloned.

That matters more here than for a typical script, because the proxy's behaviour is defined largely by the behaviour of an external service. The Internet Archive changes its response formats and its blocking behaviour, and the proxy has to be adjusted to match. A proxy checked out months ago is a proxy written against the archive of that time.

The project is a single maintainer's work, with the Docker Hub image and the container linked from the README, and the README also asks readers to donate to the Internet Archive, noting that the archive needs the support to keep the Wayback Machine and its petabytes of data available. That is the right place to look for the health of the whole system, since the proxy is downstream of it.

## Conclusion

WaybackProxy suits a hobbyist or researcher who wants to browse a specific year of the web from a period browser or emulator, and who accepts that the Internet Archive is the weak link in the chain rather than the proxy. It does not suit anyone who needs a reliable general purpose HTTP proxy, since POST, CONNECT and other methods are only supported on excluded domains, and it is a poor fit for a modern browser workflow where the injected Wayback toolbar and analytics are not the problem. Before you start it, edit config.json and set QUICK_IMAGES to false on a machine without a direct Internet connection, choose DATE in YYYYMMDD, YYYYMM or YYYY form, and read the known issues list, because rate limiting by the Internet Archive and the 404 behaviour on badly archived URLs come from the archive and not from the proxy.

## FAQ

### How do I install and start WaybackProxy?

Python 3.5 or newer is required. Edit config.json, optionally add domains to whitelist.txt, install the dependencies with pip install --user -r requirements.txt, and start waybackproxy.py. The proxy listens on port 8888 by default and stops with Ctrl+C.

### How do I point an old browser at WaybackProxy?

If the browser supports proxy auto-configuration, set the auto-configuration URL to http://ip:port/proxy.pac with the port 8888 by default. Otherwise set the browser to use an HTTP proxy at the same address, or use transparent proxying with a fake DNS server such as dnsmasq pointing at the proxy.

### Which date does WaybackProxy fetch from the Internet Archive?

The DATE setting chooses the snapshot in YYYYMMDD, YYYYMM or YYYY format, and DATE_TOLERANCE allows the client to load pages and assets up to a number of days after it, 365 by default, with null disabling the restriction. With WAYBACK_API enabled the proxy asks the Availability API for the closest snapshot to that date.

### Why should I set QUICK_IMAGES to false?

The setup steps say to set QUICK_IMAGES to false for systems that are not connected to the Internet. It uses the original Wayback Machine URL as a shortcut for images, so the browser must be able to reach the archive directly, and that direct traffic can also trigger the archive's IP rate limiting.

### Does WaybackProxy work as a normal HTTP proxy?

No. The README states that WaybackProxy is not a generic proxy and that HTTP POST, CONNECT and other methods are only supported on excluded domains for passthrough purposes. Transparent proxying mode also requires HTTP/1.1, so it cannot be used with some pre-1996 browsers.

## Sources

- [Issues](https://github.com/richardg867/WaybackProxy/issues)
- [License: GPL-3.0](https://github.com/richardg867/WaybackProxy/blob/master/LICENSE)
- [README](https://github.com/richardg867/WaybackProxy/blob/master/README.md)
- [richardg867/WaybackProxy on GitHub](https://github.com/richardg867/WaybackProxy)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/richardg867-waybackproxy
