There are many ways to add external links dynamically to the dashboard.
It will be reasonable to contain them somehow so the layout doesn't change no matter how much items you have. And the list of items is just an array, you can change it any time ... And more and more such advantages ...
One example
[{"id":"c72f844e7fb95a1e","type":"ui-template","z":"8240715f881ef736","group":"2c34b9c7d6324531","page":"","ui":"","name":"","order":1,"width":"6","height":"2","head":"","format":"<template>\n    <v-card class=\"device-list\">\n        <v-card-title>\n           Active Devices\n        </v-card-title>\n\n        <v-divider></v-divider>\n\n        <v-virtual-scroll :items=\"items\" height=\"calc(var(--widget-row-height) * 4 + var(--widget-gap) * 3)\" item-height=\"var(--widget-row-height)\">\n            <template v-slot:default=\"{ item }\">\n                <v-list-item :subtitle=\"item.url\" :title=\"item.name\">\n                    <template v-slot:append>\n                        <v-btn icon=\"mdi-open-in-new\" @click=\"openUrl(item.url)\" size=\"small\" \n                        style=\"width: var(--v-btn-height); height: var(--v-btn-height); min-height:unset\">\n                        </v-btn>\n                    </template>\n                </v-list-item>\n            </template>\n        </v-virtual-scroll>\n    </v-card>\n</template>\n\n<script>\n    export default {\n        data() {           \n            return {\n                items:[]\n            }\n        },\n        watch: {\n            msg:function(){\n                if(this.msg?.payload){\n                    this.items = this.msg.payload\n                }\n            }\n        },\n        methods: {\n            openUrl:function(url){\n                window.open(url,'_blank')\n            }\n        }\n    }\n</script>\n<style scoped>\n    .device-list .v-list-item-subtitle{\n        font-size:0.65rem;\n    }\n</style>\n","storeOutMessages":true,"passthru":true,"resendOnRefresh":true,"templateScope":"local","className":"","x":600,"y":1140,"wires":[[]]},{"id":"8e1d8581d2ebe7c2","type":"inject","z":"8240715f881ef736","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"[{\"name\":\"Device 1\",\"url\":\"https://www.google.com\"},{\"name\":\"Device 2\",\"url\":\"https://www.google.com\"},{\"name\":\"Device 3\",\"url\":\"https://www.google.com\"},{\"name\":\"Device 4\",\"url\":\"https://www.google.com\"},{\"name\":\"Device 5\",\"url\":\"https://www.google.com\"}]","payloadType":"json","x":410,"y":1140,"wires":[["c72f844e7fb95a1e"]]},{"id":"2c34b9c7d6324531","type":"ui-group","name":"Devices","page":"7294756f31e17b81","width":"6","height":"1","order":2,"showTitle":true,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"7294756f31e17b81","type":"ui-page","name":"Home","ui":"29792df7d7b05e2e","path":"/home","icon":"home","layout":"grid","theme":"52ba8a01d6eda628","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":4,"className":"","visible":"true","disabled":"false"},{"id":"29792df7d7b05e2e","type":"ui-base","name":"My Dashboard","path":"/dashboard","appIcon":"","includeClientData":false,"acceptsClientConfig":[],"showPathInSidebar":false,"showPageTitle":true,"navigationStyle":"default","titleBarStyle":"default"},{"id":"52ba8a01d6eda628","type":"ui-theme","name":"Mobile","colors":{"surface":"#ffffff","primary":"#0094ce","bgPage":"#eeeeee","groupBg":"#ffffff","groupOutline":"#cccccc"},"sizes":{"density":"compact","pagePadding":"5px","groupGap":"5px","groupBorderRadius":"10px","widgetGap":"5px"}}]