A library can be shadowed by an internal module name: $ cat >dune-project < (lang dune 3.8) > (using melange 0.1) > EOF $ mkdir lib1 lib2 $ cat >lib1/dune < (library > (name lib1) > (modes melange)) > EOF $ cat >lib1/lib1.ml < let greeting = "Hello World" > EOF $ cat >lib2/dune < (library > (libraries lib1) > (name lib2) > (modes melange)) > EOF Now we shadow lib1: $ cat >lib2/lib1.ml < let greeting = () > EOF $ cat >lib2/lib2.ml < print_endline Lib1.greeting > EOF $ dune build lib2/.lib2.objs/melange/lib2.cmj File "lib2/lib2.ml", line 1, characters 14-27: 1 | print_endline Lib1.greeting ^^^^^^^^^^^^^ Error: The value Lib1.greeting has type unit but an expression was expected of type string [1] We can use root_module to use lib1 with a different name: $ cat >lib2/dune < (library > (libraries lib1) > (root_module root) > (name lib2) > (modes melange)) > EOF $ cat >lib2/lib2.ml < let () = print_endline Root.Lib1.greeting > EOF $ dune build lib2/.lib2.objs/melange/lib2.cmj The same for melange.emit: $ cat > dune < (melange.emit > (alias mel) > (target output) > (libraries lib1) > (emit_stdlib false) > (root_module root)) > EOF $ cat > lib1.ml < let greeting = () > EOF $ cat >foo.ml < print_endline Lib1.greeting > EOF $ dune build output/foo.js File "foo.ml", line 1, characters 14-27: 1 | print_endline Lib1.greeting ^^^^^^^^^^^^^ Error: The value Lib1.greeting has type unit but an expression was expected of type string [1] Use root_module to fix: $ cat >foo.ml < print_endline Root.Lib1.greeting > EOF $ dune build @mel $ node _build/default/output/foo.js Hello World