Building a Simple Web Application with OCaml and Opium

Are you ready to build your very own web application with OCaml and Opium? If you're anything like me, the idea of creating a web app from scratch may seem daunting. But, fear not! In this tutorial, we'll walk through the process of building a basic web application with OCaml and Opium.


Before we get started, let's make sure we have everything we need. Here are the prerequisites for this tutorial:

If you don't already have OCaml and Opium installed, don't worry. You can get started by following the instructions on their respective websites.

Setting up the Project

Let's start by creating a new directory for our project. We'll call it my_ocaml_web_app. Within this directory, we'll create a new file called

In, we'll need to define a few things. We'll start by defining our main function, which will serve as the entry point for our application:

let main =
  |> App.get "/" (fun _ ->
    `String "Hello, World!")
  |> App.run_command

Here, we're creating a new instance of App, and defining a route for the root URL (/). When a user visits this URL, they'll be greeted with the message, "Hello, World!"

Running the Application

Now that we've defined our main function, let's try running our application. In your terminal, navigate to the directory for our project (my_ocaml_web_app). Now, run the following command:

ocamlfind ocamlc -package opium -linkpkg -o webserver && ./webserver

This command will compile our file and start a local server on port 3000.

Open up a web browser and navigate to http://localhost:3000. You should see the message, "Hello, World!" displayed on the page.

Adding Styling

Now that we have a basic web application up and running, let's add some styling. We'll do this by creating a new file called public/style.css. Within this file, let's add the following CSS rules:

body {
  text-align: center;
  background-color: #f2f2f2;
  font-family: "Helvetica Neue", sans-serif;

h1 {
  font-size: 48px;
  margin-top: 50px;
  margin-bottom: 50px;
  color: #333333;

Here, we're defining styles for the body and h1 elements in our HTML. We're aligning the text to the center of the page, setting a light gray background color, and using the "Helvetica Neue" font.

Now, let's head back to our file and modify our route to include a link to our stylesheet. Here's the new code:

let main =
  |> App.get "/" (fun _ ->
    `Html "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"><h1>Hello, World!</h1>")
  |> App.run_command

Here, we're adding a link tag to our HTML, which references our style.css file. We're also using the Html function to output our HTML with the new styles.

Adding Dynamic Content

Let's take our application a step further and add some dynamic content. We'll do this by updating our message to include the current time.

let main =
  |> App.get "/" (fun _ ->
    let now = Unix.localtime (Unix.time ()) in
    let hour = string_of_int now.Unix.tm_hour in
    let minute = string_of_int now.Unix.tm_min in
    let second = string_of_int now.Unix.tm_sec in
    let time = hour ^ ":" ^ minute ^ ":" ^ second in
    `Html "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"><h1>Hello, World!</h1><p>The current time is: " ^ time ^ "</p>")
  |> App.run_command

Here, we're using the Unix.localtime function to get the current time. We're then extracting the current hour, minute, and second, and combining them into a string. We're using this string to update our message with the current time.


Congratulations! You've just built a simple web application with OCaml and Opium. We've covered the basics of setting up a project, defining routes, adding styles, and incorporating dynamic content.

This tutorial only scratches the surface of what you can do with OCaml and Opium. With these tools, you can build powerful, scalable web applications with ease. So go forth and explore the world of OCaml development!

Editor Recommended Sites

AI and Tech News
Best Online AI Courses
Classic Writing Analysis
Tears of the Kingdom Roleplay
Build packs - BuildPack Tutorials & BuildPack Videos: Learn about using, installing and deploying with developer build packs. Learn Build packs
Learn AWS / Terraform CDK: Learn Terraform CDK, Pulumi, AWS CDK
Startup Gallery: The latest industry disrupting startups in their field
Jupyter Consulting: Jupyter consulting in DFW, Southlake, Westlake
Cloud Serverless: All about cloud serverless and best serverless practice