I’m not sure about the why… Also depending on you use phoenix or plug directly, the naming conventions might become naming rules due to some magic happening in phoenix.
Also even though no actual namespaces exist, convention says, that you should use your applications name in camelcase as a top level prefix.
There’s not much to it in phoenix. The only implicit generation of module names I’m aware of is that a controller will use the view of the same name just where Controller is replaced with View. If you don’t want it implicitly generated you can always use conn |> put_view(view) |> render(template, assigns) in your controller actions (or put the view earlier). The other instance of where a module name prescribes some other name is for the folder where a view takes its templates from, but this part only ever affects a single view at a time and is also configurable.
I’ve just yesterday renamed basically every MyAppWeb module in a fresh phoenix project (besides the endpoint) so unless you miss to update some references to those modules you can name them however you want.
I’m not native english speaker but “required” seems too strong for me.
I think for practical purposes as you said, you can choose your own module namespace as long as you ensure its uniqueness and the SomeModule format.
For example by default you have HelloWeb.PageController which is located to hello_web/controllers/page_controller.ex. One could name it HelloWeb.Controllers.PageController or ever HelloWeb.Controllers.Page, but I think the default name is nicer… ^^
And one last example, I like to create for example a folder named project_path/lib/hello/extras and name its modules whatever I want as long as I like it, such as Site, Easy… I do that for extra modules I want to call anywhere in the project but with very short namespace, without the Hello namespace part. ^^
All that to say don’t feel forced to keep HelloWeb.