Fabric

Go server for Python WSGI apps. One binary. No Gunicorn. No nginx. No config.

Install

curl -fsSL fabric.jasencarroll.com/install.sh | sh

Use

fabric run app.py

Write a Python app. Run it with Fabric. Open your browser.

Any WSGI app

Bare WSGI

# app.py
def app(environ, start_response):
    start_response("200 OK", [
        ("Content-Type", "text/html")
    ])
    return [b"<h1>Hello</h1>"]

Flask

# app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "<h1>Hello</h1>"

How it works

Browser → Go net/http → Unix socket → Python wsgiref → your app

Go handles HTTP, static files, and logging. Python handles your application logic. They communicate over a Unix socket using HTTP/1.1. Zero external Go dependencies. Zero external Python dependencies.

Dev mode

File watcher restarts your app on .py and .html changes. Crash recovery with loop detection. Dracula-themed Gin-style logs.

[fabric] fabric v0.0.1
[fabric] http://localhost:3000
[fabric] watching app.py for changes

[fabric] 2026/03/24 - 18:29:18 | 200 |  14.316ms | GET     | /
[fabric] 2026/03/24 - 18:29:18 | 200 |   5.002ms | GET     | /static/bone.css
[fabric] 2026/03/24 - 18:29:27 | 302 |   4.058ms | POST    | /add

Flags

fabric run app.py                serve on :3000 (dev mode)
fabric run app.py --prod         JSON logs, no watcher
fabric run app.py --port 8080    custom port
fabric run app.py --static ./pub serve /static/ from directory
fabric run app.py --db ./data.db SQLite path (sets FABRIC_DB)
fabric version                   print version

What Fabric does not do