- Assuming dynmap is already initialized and the folder structure has been generated during a first-time run, <Spigot_Server>/plugins/dynmap/custom-perspectives.txtshould exist.
- Open custom-perspectives.txt in a text editor.
- In this file below the line perspectives:add the following lines of text.
  - class: org.dynmap.hdmap.IsoHDPerspective
    name: nether_top_map_lowres
    maximumheight: 256
    minimumheight: 129
    inclination: 90
    scale: 4
    azimuth: 180- If SpigotMC is not running, start it and wait for everything to load, remaining in the server console. If SpigotMC is running, you can re-attach to the console using whatever method you have set up.
- Run dynmap pause allto halt all live updates to the map.
[12:49:49] [Server thread/INFO]: [dynmap] Full/radius render pause set to true
[12:49:49] [Server thread/INFO]: [dynmap] Update render pause set to true
[12:49:49] [Server thread/INFO]: Full/Radius renders are PAUSED
[12:49:49] [Server thread/INFO]: Update renders are PAUSED
[12:49:49] [Server thread/INFO]: Zoom out processing is ACTIVE- If it does not already exist, add a new nether roof map with the command dmap mapadd world_nether:nether_roof title:"The Roof" perspective:nether_top_map_lowres.
- If it DOES already exist, you can change the perspective of an existing map with dmap mapset world_nether:nether_roof perspective:nether_top_map_lowres.
[12:50:25] [Server thread/INFO]: Refreshing configuration for world world_nether
[12:50:25] [Server thread/INFO]: [dynmap] Loaded 4 maps of world 'world_nether'.
[12:50:25] [Server thread/INFO]: If you are done editing map data, run '/dynmap pause none' to resume rendering- Run dynmap pause none.
[12:51:37] [Server thread/INFO]: [dynmap] Full/radius render pause set to false
[12:51:37] [Server thread/INFO]: [dynmap] Update render pause set to false
[12:51:37] [Server thread/INFO]: Full/Radius renders are ACTIVE
[12:51:37] [Server thread/INFO]: Update renders are ACTIVE
[12:51:37] [Server thread/INFO]: Zoom out processing is ACTIVE- Run dynmap cancelrender world_nether.
[12:54:27] [Server thread/INFO]: Cancelled render for 'world_nether'(This could also be blank, meaning no fullrender was in progress.)
- Run dynmap fullrender world_nether:nether_roof.
[12:56:54] [Server thread/INFO]: Full render starting on world 'world_nether'...
[12:58:34] [Dynmap Render Thread/INFO]: Full render of map 'nether_roof' of 'world_nether' in progress - 100 tiles rendered (50.30 msec/tile, 18.75 msec per render)
[13:00:13] [Dynmap Render Thread/INFO]: Full render of map 'nether_roof' of 'world_nether' in progress - 200 tiles rendered (53.48 msec/tile, 16.67 msec per render)
[13:01:54] [Dynmap Render Thread/INFO]: Full render of map 'nether_roof' of 'world_nether' in progress - 300 tiles rendered (49.51 msec/tile, 15.78 msec per render)
[13:03:34] [Dynmap Render Thread/INFO]: Full render of map 'nether_roof' of 'world_nether' in progress - 400 tiles rendered (45.63 msec/tile, 15.27 msec per render)- Note in the browser that the new map will not be assigned an icon in the right-hand map list, and as the new perspective starts at y=129, the nether roof texture will not be included. However, the spawn icon should be displayed at (0,0). As I have a standard ilmango zombie pigman gold farm on the nether roof, that is displayed near spawn as well.
 
- In the server console run dynmap pause all
- Run the command dmap mapset world_nether:nether_roof icon:images/sign_warp.png
- Return to the browser and note the updated icon now displays something like a white chat bubble with a black "><":
 
- Icons are stored in <Spigot_Server>/plugins/dynmap/web/images.
- You can create or find 16x16px custom PNG images, copying them into this folder for use within the server console.
- To load the newly copied PNG image, repeat step 2, changing the icon:images/sign_warp.pngbit toicon:images/<filename>.png
I threw together this one called which blends the bedrock block texture and the nether_portal block texture, and copied it in as
<Spigot_Server>/plugins/dynmap/web/images/bedrock_portal.png.Then I ran the command
dmap mapset world_nether:nether_roof icon:images/bedrock_portal.png, which I'm quite happy with!
- Finally, run dynmap pause noneto resume the fullrender or active rendering process. If a full render is not in progress, the map will only update when a player loads the nether roof chunks and remains there for some minimum amount of time.
(Assuming you've already done everything previously mentioned)
- In the server console run dynmap pause all.
- In the file manager, open <Spigot_Server>/plugins/dynmap/custom-perspectives.txtin a text editor.
- Edit the line minimumheight: 129, changing it tominimumheight: 128
- Save and close the text editor.
- In the server console run reloadand wait for all server and plugin configurations to be re-read from their respective files.
- Run dynmap pause none.
- Run dynmap cancelrender world_nether. You'll either seeCancelled render for 'world_nether'if a fullrender was in progress, or nothing.
- Run dynmap fullrender world_nether:nether_roofand wait a few minutes for the first few tiles to render in the browser. If all is well, whatever was displayed before should now be overwritten with a dark grey houndstoothy bedrock texture.
With Dynmap 3.1 beta released for 1.16 (Nether) I am watching the Nether biome updates roll in gradually as I re-run a full render of world_nether:flat.
And as I wait, I realized that in the time I wrote this to now my brothers and I also defeated the dragon and and started raiding End cities at which point I realized that its default lighting profile "brightnight" is extremely useful in finding cities and End gateways as the diamond flaring of end rods and torches really help when scanning a 10k x 10k map.
So I decided perhaps since the nether roof is most often used for portal hubs, I could change the lighting profile of world_nether:nether_roof to brightnight as well.
- dynmap pause all
- dmap mapset world_nether:nether_roof lighting:brightnight
- dynmap pause none
- dynmap fullrender world_nether:nether_roof
And the result is quite stupendous!

Someone in the comments asked about how to add the red background you see in the world_nether:flat and world_nether:surface maps. Turns out this is all to do with some undocumented and unautomated dynmap features that live in the very hard-to-find HD Map Configuration help file.
- Open <SpigotMC Directory>/plugins/dynmap/worlds.txt.
- Scroll down to world_netherand in the maps section, search for all separate map definitions.
- Note that by default, the "flat" and "surface" maps for world_netherhave a background property of #300806.
- Copy this line into all applicable map sections. For our purposes, the nether_roof will look something like this:
-   name: world_nether
    title: The Nether
    enabled: true
    extrazoomout: 2
    maps:
    ...
    ...
    -   class: org.dynmap.hdmap.HDMap
        name: nether_roof
        title: The Roof is on Fire!
        icon: images/bedrock_portal.png
        prefix: nether_roof
        perspective: nether_top_map_lowres
        ...
        ...
        background: '#300806'
        append_to_world: ''rgba() with transparency settings instead of the #RRGGBB format actually works!
In worlds.txt, replace background:'#300806' with background: 'rgba(48,8,6,1.0)' and reload.
Additionally I did some digging into the .js files and found that dynmap may be simply translating the background options of map definitions here into raw CSS. In this case, I tried another thing:
background: 'url("images/book.png")'
Also w3schools' CSS3 background documentation describes a method of embedding not only a background image, but also its positioning, tiling, repeat, and additionally a backup color into the same line.
background: 'lightblue url("images/book.png") fixed'
As docm77 is fond of saying, "Lawd a'mercy..."

We can also replace 'lightblue' with an RGB definition in #RGB, #RRGGBB, and rgba() formats.
background: 'rgba(48,8,6,0.5) url("images/book.png") fixed'
Not so spectactular, and the image is layered on top of the background color, so the alpha channel does not darken it any

This simply means that to properly make a GOOD background image, choosing something less busy and/or manually darkening it in photo editing software it may be preferrable.






Legend. I'll give this a go tonight.