Skip to main content

A C++ "Hello, World!" on the public internet

I have been reviewing Fran Buontempo's new C++ book, and somewhere between the chapters on modern idioms and the bits where she nudges you to actually do something with the language, I caught the itch. I have not written any C++ in more than twenty years, and the book reminded me how much the language has moved on without me. I wanted to host something small, written in modern C++, on a URL I could share. This project is the result.

The brief I gave myself was deliberately tiny. A single HTTP endpoint that returns `Hello, World!`, built in C++, deployed somewhere real, with the whole thing reproducible from a fresh checkout. The point was not to ship a product.

For the HTTP layer I picked Crow, a header-only framework with a Flask-shaped API. Header-only matters here because it keeps the build simple

The whole server is twelve lines:

#include <crow.h>

int main() {
    crow::SimpleApp app;

    CROW_ROUTE(app, "/")([]{
        return "Hello, World!";
    });

    app.port(8080).multithreaded().run();
    return 0;
}


That is the entire C++ surface area of the project. A simple app, one route, a lambda that returns a string, and multithreaded().run() to actually serve requests. Bear in mind that CROW_ROUTE is a macro doing real work - it registers the handler at compile time - but from the outside it reads almost exactly like the Python equivalent, which is the point.

The build sits in a two-stage Dockerfile. The first stage is a Debian image with build-essential, cmake, and libasio-dev, which compiles a release binary. The second stage is a slim Debian image that contains only the compiled binary and `ca-certificates`. 

For hosting Claude stubbornly insisted I go with AWS Lightsail's Container Service on the Nano tier — about seven dollars a month, with a built-in container registry so I do not need to wire up ECR or IAM roles for image pushes. Terraform provisions the service; a Makefile orchestrates the three steps of a deploy: terraform apply to ensure the service exists, aws lightsail push-container-image to upload a freshly built image, and a second terraform apply to roll out the new version. make deploy runs the lot.

Claude suggested that next, I should like to add a second route that does something genuinely C++-shaped — perhaps a small numerical endpoint, or something that exercises a library you would not casually reach for in Python. However, I've achieved what I wanted.

Comments

Popular posts from this blog

It's great to be back at the ACCU Conference 2025!

Last week I was back at the ACCU Conference in Bristol, for the first time since I gave an opening keynote in 2019 . In March 2020, COVID hit the UK and I got out of the habit of attending and speaking at conferences. Plus the ACCU Conference, and the organisation in general, took a big step back towards C++ and that hasn’t been relevant to me for nearly two decades. It’s taken until now, 2025 for me to want to talk again, and I was really pleased to be accepted for the ACCU Conference again. It was just a 20 minute session and I only attended for the day I was speaking. There was enough varied content for it to be interesting to me and I’m hoping to be back for the full conference next year. I really enjoyed attending and it was great to catch up with people I hadn’t seen for years. I felt re-engaged and particularly liked being asked if I’d been to nor(DEV):con . Learning to stop writing code (and why you won't miss it) Daisy Hollman I should have read the summary of the openin...

Write Your Own Load Balancer: A worked Example

I was out walking with a techie friend of mine I’d not seen for a while and he asked me if I’d written anything recently. I hadn’t, other than an article on data sharing a few months before and I realised I was missing it. Well, not the writing itself, but the end result. In the last few weeks, another friend of mine, John Cricket , has been setting weekly code challenges via linkedin and his new website, https://codingchallenges.fyi/ . They were all quite interesting, but one in particular on writing load balancers appealed, so I thought I’d kill two birds with one stone and write up a worked example. You’ll find my worked example below. The challenge itself is italics and voice is that of John Crickets. The Coding Challenge https://codingchallenges.fyi/challenges/challenge-load-balancer/ Write Your Own Load Balancer This challenge is to build your own application layer load balancer. A load balancer sits in front of a group of servers and routes client requests across all of the serv...

Catalina-Ant for Tomcat 7

I recently upgraded from Tomcat 6 to Tomcat 7 and all of my Ant deployment scripts stopped working. I eventually worked out why and made the necessary changes, but there doesn’t seem to be a complete description of how to use Catalina-Ant for Tomcat 7 on the web so I thought I'd write one. To start with, make sure Tomcat manager is configured for use by Catalina-Ant. Make sure that manager-script is included in the roles for one of the users in TOMCAT_HOME/conf/tomcat-users.xml . For example: <tomcat-users> <user name="admin" password="s3cr£t" roles="manager-gui, manager-script "/> </tomcat-users> Catalina-Ant for Tomcat 6 was encapsulated within a single JAR file. Catalina-Ant for Tomcat 7 requires four JAR files. One from TOMCAT_HOME/bin : tomcat-juli.jar and three from TOMCAT_HOME/lib: catalina-ant.jar tomcat-coyote.jar tomcat-util.jar There are at least three ways of making the JARs available to Ant: Copy the JARs into th...