A temporary dependency-free static HTTP server with byte-range support.
Project description
static-http
static-http is a tiny dependency-free Python utility that starts a temporary static HTTP server in the current directory with byte-range support for quick local workflows.
It is intentionally focused on temporary file serving for local development, manual testing, media playback, and archive inspection.
Why this exists
python -m http.server is excellent for quick sharing but does not implement byte-range request handling. static-http fills that gap with a small CLI that keeps the behavior predictable and easy to reason about.
Install
uvx static-http
pipx run static-http
python -m pip install static-http
Quick start
static-http
uvx static-http
By default:
- Serves the current working directory.
- Binds to
0.0.0.0. - Listens on port
8080. - Uses a threaded HTTP server.
- Handles
GET,HEAD, and single-range requests. - Sends
Cache-Control: no-cache, max-age=0, must-revalidateso browsers revalidate reused local URLs. - Sends
Last-ModifiedandETagvalidators for file responses. - Hides dot-prefixed and platform-hidden files/directories unless
--include-hiddenis used.
CLI
static-http supports these options:
-p, --port PORT— listening port.0requests an OS-assigned port.-d, --directory PATH— root directory to serve. Default is the current directory.-b, --bind ADDRESS— bind address. Default is0.0.0.0.--localhost-only— equivalent to--bind 127.0.0.1.--cors— addsAccess-Control-Allow-Origin: *.--header "Name: Value"— repeatable custom headers.--no-dir-list— disable directory listing responses when no index file exists.--open— open the server URL in the default browser after startup.--qr— render a terminal QR code for the server URL.--no-cache— sendCache-Control: no-storeinstead of the default revalidation policy.--quiet— explicitly keep per-request logs suppressed. This is the default.--verbose— print detailed startup/binding information.--include-hidden— include dot-prefixed and platform-hidden files/directories in normal serving and directory listings.--version— print package version and exit.--about— print project and license information and exit.
Examples
static-http --open
static-http --qr
static-http --no-cache
static-http --quiet
static-http --verbose
static-http --include-hidden
static-http --port 9000 --cors
static-http --no-dir-list
QR codes
--qr prints a terminal QR code for the selected server URL. For the default all-interface bind, it prefers a discovered LAN URL when one is available; otherwise it falls back to localhost.
The built-in QR renderer is intentionally dependency-free and sized for normal localhost/LAN URLs. If the URL is too long or the terminal is too narrow, static-http prints a warning and keeps serving.
Shutdown
Press Q or q in the focused terminal to stop the server. Ctrl+C also triggers a graceful shutdown.
Range support
GET requests support single byte ranges with examples:
curl -H "Range: bytes=0-99" http://localhost:8080/video.mp4 -o part.bin
curl -H "Range: bytes=100-" http://localhost:8080/video.mp4 -o tail.bin
curl -H "Range: bytes=-500" http://localhost:8080/video.mp4 -o suffix.bin
The server returns 206 Partial Content for satisfiable ranges, 416 Range Not Satisfiable when the range is outside the file, and 400 Bad Request for invalid range syntax.
Security note
static-http is intentionally a temporary local development/file-serving tool, not a production web server.
By default it binds to 0.0.0.0, which can expose the selected directory to other clients that can reach your machine. It has no authentication, authorization, TLS, upload handling, or production hardening. Use --localhost-only when you only need access from the same machine, and use trusted networks for LAN sharing.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file static_http-1.0.1.tar.gz.
File metadata
- Download URL: static_http-1.0.1.tar.gz
- Upload date:
- Size: 22.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86bf4fc3365522a05b572f399c50be318defbde5b76fbfbdd3acb4f126dcc4b5
|
|
| MD5 |
1a8de59d6ae700ac08d87a9cabeafde3
|
|
| BLAKE2b-256 |
e1e56f54de8fd69acba525c813335889a7e827f6623b2f30f521984557f3986b
|
Provenance
The following attestation bundles were made for static_http-1.0.1.tar.gz:
Publisher:
release.yml on pseudosavant/static-http
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
static_http-1.0.1.tar.gz -
Subject digest:
86bf4fc3365522a05b572f399c50be318defbde5b76fbfbdd3acb4f126dcc4b5 - Sigstore transparency entry: 2089924605
- Sigstore integration time:
-
Permalink:
pseudosavant/static-http@accbd50aaccb375c98bb30259adab63897c2e6a2 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/pseudosavant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@accbd50aaccb375c98bb30259adab63897c2e6a2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file static_http-1.0.1-py3-none-any.whl.
File metadata
- Download URL: static_http-1.0.1-py3-none-any.whl
- Upload date:
- Size: 17.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99b1ed4d28eb5eeddda4126d09901ff9e35655cff81ecdc703327e2c09fe7ff6
|
|
| MD5 |
87dcc0f2f04cf73a986c99ac6453ee32
|
|
| BLAKE2b-256 |
f7ad33f6a6ad324f5476546848d38f7f54616e38cc4476b98a08c302687c97db
|
Provenance
The following attestation bundles were made for static_http-1.0.1-py3-none-any.whl:
Publisher:
release.yml on pseudosavant/static-http
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
static_http-1.0.1-py3-none-any.whl -
Subject digest:
99b1ed4d28eb5eeddda4126d09901ff9e35655cff81ecdc703327e2c09fe7ff6 - Sigstore transparency entry: 2089925007
- Sigstore integration time:
-
Permalink:
pseudosavant/static-http@accbd50aaccb375c98bb30259adab63897c2e6a2 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/pseudosavant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@accbd50aaccb375c98bb30259adab63897c2e6a2 -
Trigger Event:
push
-
Statement type: