package routes

  1. Overview
  2. Docs
Typed routing for OCaml applications


Dune Dependency






  • use ppx_expect for tests

  • add route function which is an alias of @--> and is used to connect a route pattern to a handler

Breaking changes

  • Drop support for OCaml 4.05-4.07

  • Switch to a new model for trailing slash handling. In routes 1.0.0 users needed to be careful about using /? and //? as the former would only match routes without a trailing slash, and the latter would enforce a trailing slash.

    • Users only need to use /? to end routes, and it will cover both routes ending with trailing slashes and without

    • The type used for representing match results has more information about whether it was an exact match, or if it was a match but the input target had a trailing slash at the end.

    • MatchWithTrailingSlash informs the user that the current target was considered a match, but that the target has an additional trailing slash


  • First major release. No changes from 0.9.1


  • bucklescript: Use correct version number (0.9.1) in package.json


  • Add a labelled function to create custom patterns (#114)

  • Add support for union operation for two routers (#115, @Chattered)

  • Use dune language 2.0 (#116)

  • Support wildcard pattern at the end of a route (#118, #129, @Lupus)

  • Add map and path prefix to route targets (#121, @Chattered)

  • Make ksprintf visible in the public api (#123, @Chattered)


  • Improve trailing slash handling. Instead of separate nil and trail constructors, all routes end with nil. The trailing slash is controlled via /? for no trailing slash, and //? for trailing slash. (#111)

  • No longer possible to use nil unless it follows a pattern. To create a route that matches no path params, ex: "/" use empty. (#111)


  • Allow adding new routes to existing router. (#108, @tatchi)

  • Fix library name in bsconfig.json. (#109, @tsnobip)

  • Specify -O3 flag for ocamlopt when using dune's release profile. (#110)


  • Use bisect_ppx to generate coverage reports (#95)

  • Lower version constraint for dune and ocaml. Minimum versions needed are now dune 1.0 and OCaml 4.05.0 (#99, #100)


Note: 0.7.2 has the same content as 0.7.1 except for a dune file change needed for bisect_ppx

  • Use bisect_ppx to generate coverage reports (#95)

  • Lower version constraint for dune and ocaml. Minimum versions needed are now dune 1.0 and OCaml 4.05.0 (#99, #100)


This is a breaking release:

  • Reduce the number of combinators to two. '/' and '/?' (#80)

  • Routes are now bi-directional. They can be used for matching, and for printing via a sprintf style function (#80)

  • Its now possible to configure trailing slash on individual routes (#89)

  • Remove HTTP method handling (#92)

  • dune version needs to be >= 2.1


  • Improve mdx test tules (#73, @NathanReb)

  • Use github actions instead of travis ci (#70, #72)

  • Get human readable route pattern from a route (#64, #74)

  • Allow writing custom path match patterns (#76)


  • Support custom HTTP methods via Other of string (#58 , @sazarkin)


  • Allow user to decide if they want to keep or ignore trailing slash (#50)


  • Flatten nested skip-left actions.

  • Group routes based on the HTTP verb.

  • Use a trie based path matcher.

  • Add micro-benchmark suite.


  • Specialize apply for SkipLeft parsers.

  • Re-write routes for better matches.


  • Remove stdcompat (#33)

  • Add example using opium (#34)


  • Switch to using an applicative functor as parser. (#27)

  • Have a version of matching without HTTP methods. (#27)

  • Tokenize the path parameters into list of strings. (#27)

  • Add more tests for matchers. (#28)

  • s now returns the string it matches, instead of discarding it. (#29)


  • Extract string operations to its own module (#14)

  • Drop dependency on astring (#16)

  • Add pretty printers for utop (#18)

  • Accept a request that is in-turn forwarded to handlers (#22)

  • Use mdx to test examples in the readme file (#23)


  • Switched to a GADT representation of routes

  • Add support for using the same route type for both parsing and a sprintf like function


  • Initial version of router