A blazing-fast HTTP/1.1 server written in C++17.
Live admin dashboard on its own port, virtual hosts, URL rewrites,
rate limiting — all compiled into one binary, zero config files.
No fake toggles. No stub endpoints. Every button in the dashboard hits a live C++ route that mutates config instantly — no restart, no reload, no config files.
Each TCP connection spawns its own std::thread. No blocking, no queuing, true parallelism on all cores.
Route any hostname to a separate docroot at runtime via the Host header. Add and remove vhosts without restart.
Full ECMAScript regex with $1, $2 capture groups. 301/302 or internal rewrites, applied before file serving.
Per-IP sliding-window token bucket. Violators get 429 before any file logic runs. State is visible and clearable in the dashboard.
LIVEHSTS, CSP, X-Frame-Options, X-Content-Type-Options, XSS-Protection, Referrer-Policy — all AJAX-toggled live from the dashboard.
LIVEPer-extension Cache-Control rules. Set immutable on fonts, 30-day on assets, no-store on HTML.
Web on 8080, admin on 8081. Two acceptors, two independent thread loops. Dashboard has zero impact on static serving.
LIVEFull CORS — allow-origin, methods, headers, max-age, credentials flag. Toggle and configure from the dashboard, applied instantly.
LIVEBrowse, view, download, delete webroot files in the dashboard. Block any IP with one click — 403'd before any request logic.
LIVEProno uses Boost.Asio for TCP with a thread-per-connection model. The entire server is a single .cpp file — no CMake, no Makefiles, no build system. One compile command.
All runtime config lives in a Config struct behind a std::mutex. Every dashboard action writes to the live struct. Two separate handler functions share a common ParsedReq parser to avoid duplication.
handleAdmin() — fully decoupled from web servingParsedReq struct — request parsed once, used everywherestd::regex engine — full rewrite support, no extra librarystd::filesystem for real directory traversal// Static files — web port
tcp::acceptor webAcc(io);
webAcc.bind({any(), CFG.port});
webAcc.listen();
// Admin panel — own port, own thread
tcp::acceptor adminAcc(io);
adminAcc.bind({any(), CFG.adminPort});
adminAcc.listen();
std::thread([&]{
while(true) {
auto s = adminAcc.accept();
std::thread(handleAdmin,
std::move(s)).detach();
}
}).detach();
while(true) {
auto s = webAcc.accept();
std::thread(handleClient,
std::move(s)).detach();
}
if(key == "hsts") CFG.hsts = val;
else if(key == "csp") CFG.csp = val;
else if(key == "xcto") CFG.xcto = val;
// 14 more keys — one mutex write
resp = buildResp(msg, "text/plain");
Choose your path: compile from source with your own flags, or download prebuilt binaries straight from GitHub Releases. The wiki is one click away if you want deeper docs, configs, and FAQs.
Clone the code, inspect every line, and compile with the one-liner shown below. Perfect if you want to tweak or audit.
Skip the toolchain. Grab the latest prebuilt binaries from the Releases page and start the server in seconds.
Boost.Asio is the only build-time dependency. One apt command on Debian / Ubuntu.
sudo apt install libboost-dev
Single file, no build system. Compiles in ~2 seconds on any modern machine.
g++ -std=c++17 -O2 -o prono prono_server.cpp -lboost_system -lpthread
Web port, webroot, admin port. All optional — sane defaults out of the box.
./prono 8080 ./www 8081
Hit the admin port from any device on your network. Config changes apply instantly.
http://<your-ip>:8081/pronoadmin
Overview, Logs, Vhosts, Config, Rewrites, Headers, Cache, Rate Limit, Firewall, Stats, Files, Error Pages — every tab has real backend C++ routes wired up.
Every form, button, and toggle hits a real /pronoadmin/... C++ route. Config mutates live — zero restarts required.
All non-functional features (SSL stub, proxy stub, fake toggles) have been removed. If it's on the dashboard, it works. Full stop.