Updog is a Python 3.11+ HTTP/S file server that replaces Python's SimpleHTTPServer, adding file uploads alongside downloads, ad hoc SSL certificates and HTTP basic authentication for developers and operators who need to move files between machines without standing up a full file-sharing service.
What it is
Updog is an MIT-licensed, command-line file server written in Python and distributed through the Python packaging ecosystem, as version 2.0.1, requiring Python 3.11 or newer. It is installed with pip or pipx, and its own development workflow uses Poetry. The project sits in this registry under Productivity & Utilities / File Management & Sync and is tagged file-sharing, file-upload, http-server, https-server and simplehttpserver. It began as, and remains, a replacement for Python's SimpleHTTPServer: the same idea of serving a directory over HTTP from a terminal, extended with the capabilities the standard library version does not have.
The concrete problem it solves is the one-way nature of that built-in server. SimpleHTTPServer is quick to start but it only serves files outward, so sending a file back the other way means reaching for a different tool, a chat client or a shared drive. Updog keeps the same single-command convenience while making the session two-way: a chosen root directory is served on a configurable address and port, and the browser page accepts uploads as well as downloads. It also closes the gaps that make casual HTTP serving awkward on real machines — a password gate for the page, TLS for the connection, CORS headers when a browser application is being tested against it, and an option to keep absolute directory paths out of what clients can see.
Key capabilities
- Serves a root directory selected with -d or --directory (the default is the current directory), bound with -b or --bind (default 0.0.0.0) and published on -p or --port (default 9090).
- Handles both downloading and uploading through the browser interface, which the built-in SimpleHTTPServer does not do.
- Protects the page with --password over HTTP basic authentication, where the username is left blank and the password is entered in the password field.
- Enables TLS either with --ssl for an ad hoc certificate, or with --ssl-cert and --ssl-key to supply a custom certificate and private key.
- Adds CORS headers when started with --cors, for web application testing.
- Hides the full directory path and shows relative paths with --hide-base-path, described in the README as an OpSec measure.
- Reports its version and full argument list through --version and -h or --help.
Who uses it and how
- A developer who needs to hand a file to someone on the same network can run updog in the directory holding it and pass along the URL, rather than routing the file through a chat client or shared drive.
- On a machine with several interfaces, the server can be pinned to one address, for example updog -b 192.168.1.10 -p 8080, so it listens only where intended.
- Password-protected sessions use updog --password with HTTP basic auth, which suits short-lived sharing with a small group rather than per-person accounts.
- Testing a browser-based application against a local server is a stated use for the --cors flag.
- Work on sensitive targets justifies --hide-base-path, which keeps the server's absolute directory structure out of what clients see.
Getting started
Install with pip install updog, or with pipx install updog, which the README recommends for command-line tools; running updog with no arguments serves the current directory. For development, clone the repository, run poetry install, then poetry run updog.
How it compares
The only comparable tool named in the project's own documentation is Python's SimpleHTTPServer, which updog is explicitly built to replace. Where SimpleHTTPServer is a read-only convenience for serving files, updog keeps the same command-line simplicity while adding uploads, TLS and basic-auth protection.
When to use it — and when not to
The README indicates no database, object store or mail service to operate: updog is a single Python package that runs as a foreground process, which makes it cheap to start and equally cheap to lose when the terminal closes. It is a poor fit for anyone needing named user accounts, per-file permissions or auditable access, because authentication is a single shared password over HTTP basic auth. The documentation is short and usage-focused — installation, an argument table and a set of examples — so those seeking operational guidance, clustering or a long release history should look elsewhere; the current release is 2.0.1 and the last push to the repository was in November 2025.
project readme (upstream, from github) — read inline

Updog is a replacement for Python's SimpleHTTPServer.
It allows uploading and downloading via HTTP/S,
can set ad hoc SSL certificates and use HTTP basic auth.
Installation
Install using pip:
pip install updog
Or using pipx (recommended for CLI tools):
pipx install updog
For development:
git clone https://github.com/sc0tfree/updog.git
cd updog
poetry install
poetry run updog
Usage
updog [-d DIRECTORY] [-b ADDRESS] [-p PORT] [--password PASSWORD] [--ssl | --ssl-cert CERT --ssl-key KEY] [--cors] [--hide-base-path]
Examples
Serve from your current directory:
updog
Serve from another directory:
updog -d /another/directory
Serve from port 1234:
updog -p 1234
Password protect the page:
updog --password examplePassword123!
Please note: updog uses HTTP basic authentication.
To login, you should leave the username blank and just
enter the password in the password field.
Use an SSL connection (ad-hoc certificate):
updog --ssl
Use an SSL connection with custom certificates:
updog --ssl-cert /path/to/cert.pem --ssl-key /path/to/key.pem
Bind to a specific IP address:
updog -b 192.168.1.10 -p 8080
Enable CORS for web application testing:
updog --cors
Hide full directory paths (OpSec):
updog --hide-base-path
What's updog?
Not much, how about you?
Thanks
A special thank you to Nicholas Smith for
designing the updog logo.