Skip to content

Instantly share code, notes, and snippets.

Last active September 29, 2023 00:33
Star You must be signed in to star a gist
What would you like to do?
Big list of http static server one-liners

Each of these commands will run an ad hoc http static server in your current (or specified) directory, available at http://localhost:8000. Use this power wisely.

Discussion on reddit.

Python 2.x

$ python -m SimpleHTTPServer 8000

Python 3.x

$ python -m http.server 8000

Twisted (Python)

$ twistd -n web -p 8000 --path .


$ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File(".")));'

Depends on Twisted.


$ ruby -rwebrick -e' => 8000, :DocumentRoot => Dir.pwd).start'

Credit: Barking Iguana

Ruby 1.9.2+

$ ruby -run -ehttpd . -p8000

Credit: nobu

adsf (Ruby)

$ gem install adsf   # install dependency
$ adsf -p 8000

Credit: twome

No directory listings.

Sinatra (Ruby)

$ gem install sinatra   # install dependency
$ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

No directory listings.


$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Credit: Anonymous Monk

Plack (Perl)

$ cpan Plack   # install dependency
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

Credit: miyagawa

Mojolicious (Perl)

$ cpan Mojolicious::Lite   # install dependency
$ perl -MMojolicious::Lite -MCwd -e 'app->static->paths->[0]=getcwd; app->start' daemon -l http://*:8000

No directory listings.

http-server (Node.js)

$ npm install -g http-server   # install dependency
$ http-server -p 8000

Note: This server does funky things with relative paths. For example, if you have a file /tests/index.html, it will load index.html if you go to /test, but will treat relative paths as if they were coming from /.

node-static (Node.js)

$ npm install -g node-static   # install dependency
$ static -p 8000

No directory listings.

PHP (>= 5.4)

$ php -S

Credit: /u/prawnsalad and MattLicense

No directory listings.


$ erl -s inets -eval 'inets:start(httpd,[{server_name,"NAME"},{document_root, "."},{server_root, "."},{port, 8000},{mime_types,[{"html","text/html"},{"htm","text/html"},{"js","text/javascript"},{"css","text/css"},{"gif","image/gif"},{"jpg","image/jpeg"},{"jpeg","image/jpeg"},{"png","image/png"}]}]).'

Credit: nivertech (with the addition of some basic mime types)

No directory listings.

busybox httpd

$ busybox httpd -f -p 8000

Credit: lvm


$ webfsd -F -p 8000

Depends on webfs.

IIS Express

C:\> "C:\Program Files (x86)\IIS Express\iisexpress.exe" /path:C:\MyWeb /port:8000

Depends on IIS Express.

Credit: /u/fjantomen

No directory listings. /path must be an absolute path.


If you have any suggestions, drop them in the comments below or on the reddit discussion. To get on this list, a solution must:

  1. serve static files using your current directory (or a specified directory) as the server root,
  2. be able to be run with a single, one line command (dependencies are fine if they're a one-time thing),
  3. serve basic file types (html, css, js, images) with proper mime types,
  4. require no configuration (from files or otherwise) beyond the command itself (no framework-specific servers, etc)
  5. must run, or have a mode where it can run, in the foreground (i.e. no daemons)
Copy link

mLuby commented Feb 1, 2023

Submitted for your approval, a NodeJS solution in 123 chars. ⛳


Run it in bash to serve files relative to that directory, and also any file on your computer if given an absolute path. 😱

node -e 'r=require;r("http").createServer((i,o)=>r("stream").pipeline(r("fs").createReadStream(i.url.slice(1)),o,e=>console.log(i.url,e))).listen(8080)'

I prefer the 153-char version that logs out each file request and doesn't serve outside the command's directory. 🪵


Here's that one-liner unobfuscated, deminimized, and explained. 🧑‍🏫

require("http").createServer((request, response) => {
  require("stream").pipeline( // Pipes from each stream to the next ending in a callback to handle errors
    require("fs").createReadStream( // Reads the file at the specified path.
      require("path").join(".", request.url) // Forces the file path to start with this directory,
    ),                                       // so no absolute paths or ../ing upward.
    response, // This is a writable stream so the file read stream pipes into the server response stream.
    (error, value) => { console.log(request.url, error); } // This callback handles the error & we use it
  )                                                        // here to log the filepath.
).listen(8080); // Actually starts the server listening on this port.


Copy link

renich commented Feb 11, 2023

Here's a crystal oneliner:

crystal eval 'require "http/server"; server = [,"./")] ); server.bind_tcp "", 8080; server.listen'


Copy link

python3 -m http.server -d web 8000

for when you want to host a specific directory in one line

Copy link

go run


echo 'package main; import ("net/http"); func main() {fs := http.FileServer(http.Dir(".")); http.Handle("/", fs); println("Listening on http://localhost:8000"); http.ListenAndServe(":8000", nil)}' > main.go; go run main.go; rm main.go

Copy link

radiosilence commented Sep 16, 2023 via email

Copy link

Limiting request to a certain interface (eg.: do not allow request from the network)

python -m http.server --bind

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment