Recipe: Static files & SPA fallback

Goal: Serve a built frontend and fall back to index.html for client routes.

open Suave
open Suave.Filters
open Suave.Operators
open Suave.Files
open Suave.Successful

let cfg = { defaultConfig with homeFolder = Some "./public" }

let app = choose [
  GET >=> path "/" >=> browseFileHome "index.html"
  GET >=> browseHome
  GET >=> browseFileHome "index.html"  // SPA fallback
]

startWebServer cfg app

Guide: Files.