[APP][Pro] Dashboard Studio - A completely free-form dashboard designer

I’d like to link from my Android TV touchscreen to Dashboard Studio. When trying, I receive an error that the widget needs to link to the URL via HTTPS://

Does Dashboard Studio also support HTTPS? And did someone else find a solution to run Dashboard Studio as an Android Widget?

I’d love to start using Dashboard Studio.

This is the snippet I’m using:

{
  "snippetHeader": "Dashboard Studio Snippet",
  "snippetType": "widget-snippet",
  "snippetFormatVersion": 1,
  "version": "1.8.3",
  "source": {
    "dashboardName": "Demo dash",
    "page": 1,
    "createdAt": "2026-05-03T17:23:40.106Z"
  },
  "master": {
    "currentPage": 1
  },
  "widgets": {
    "switch_175855588": {
      "type": "switch",
      "overrides": {
        "x": 1030,
        "y": 460,
        "width": 110,
        "height": 50,
        "zIndex": 3,
        "page": 1,
        "buttonLabel": "Close",
        "outputTopic": "local/showSettings2",
        "onPayload": "false",
        "metaName": "New Switch / Button",
        "mode": "push",
        "style": "image-only",
        "typography": {
          "buttonLabelOutside": {
            "offsetY": 40,
            "textTransform": "none",
            "fontSize": 16
          }
        },
        "borderColor": "@text",
        "visible": false
      },
      "bindings": {
        "visible": "local/showSettings2"
      }
    },
    "empty_3874": {
      "type": "empty",
      "overrides": {
        "x": 220,
        "y": 30,
        "width": 940,
        "height": 510,
        "zIndex": 2,
        "page": 1,
        "metaName": "New Container",
        "visible": false
      },
      "bindings": {
        "visible": "local/showSettings2"
      }
    },
    "switch_2192": {
      "type": "switch",
      "overrides": {
        "x": 20,
        "y": 550,
        "width": 180,
        "height": 120,
        "zIndex": 1,
        "page": 1,
        "state": true,
        "buttonLabel": "Setting no State",
        "outputTopic": "local/showSettings2",
        "icons": {
          "on": {
            "source": "phosphor",
            "builtin": "ph-gear",
            "filled": true,
            "customUrl": "",
            "tintImage": false,
            "hoverColor": "#6B5B3F",
            "color": "@warning"
          },
          "off": {
            "source": "phosphor",
            "builtin": "ph-gear",
            "filled": true,
            "customUrl": "",
            "tintImage": false
          }
        },
        "metaName": "New Switch / Button",
        "mode": "toggle",
        "style": "image-only",
        "typography": {
          "buttonLabelOutside": {
            "offsetY": 70,
            "textTransform": "none",
            "fontSize": 16
          }
        },
        "borderColor": "@text",
        "iconSize": 60,
        "iconOffY": -30
      },
      "bindings": {
        "state": ""
      }
    },
    "switch_389786089": {
      "type": "switch",
      "overrides": {
        "x": 20,
        "y": 690,
        "width": 180,
        "height": 120,
        "zIndex": 1,
        "page": 1,
        "buttonLabel": "Setting with State",
        "outputTopic": "local/showSettings2",
        "icons": {
          "on": {
            "source": "phosphor",
            "builtin": "ph-gear",
            "filled": true,
            "customUrl": "",
            "tintImage": false,
            "hoverColor": "#6B5B3F",
            "color": "@warning"
          },
          "off": {
            "source": "phosphor",
            "builtin": "ph-gear",
            "filled": true,
            "customUrl": "",
            "tintImage": false
          }
        },
        "metaName": "New Switch / Button",
        "mode": "toggle",
        "style": "image-only",
        "typography": {
          "buttonLabelOutside": {
            "offsetY": 70,
            "textTransform": "none",
            "fontSize": 16
          }
        },
        "borderColor": "@text",
        "iconSize": 60,
        "iconOffY": -30
      },
      "bindings": {
        "state": "local/showSettings2"
      }
    },
    "label_3173": {
      "type": "label",
      "overrides": {
        "x": 240,
        "y": 660,
        "width": 260,
        "height": 300,
        "page": 1,
        "text": "",
        "metaName": "New Label"
      },
      "bindings": {
        "text": "local/showSettings2"
      }
    }
  }
}

The snippet contains 5 objects:

  1. Toggle switch without using field State on/off
    image
  2. Same toggle switch, only with filled field State on/off
    image
  3. Push button to hide Container and Close button itself
  4. Container (for example containing settings)
  5. label containing the variable “local/showSettings2”

Test A:

  1. Push the button (1): container (4) and Close (3) will show. Label (5) changes from false into true
  2. Push Close (3): Container(4) and button Close (3) are invisible, but button 1 icon is still On. Label (5) changes from true into false

Test B:

  1. Push the button (2): container (4) and Close (3) don’t get visible. Label (5) stays false.
  2. Return to the screen edit mode: container (4) en Close (3) get visible and label (5) switches from false into true

Thanks Amersfoort. I have found the problem, I broke something in the recent changes of the button to fix the other problem :sweat_smile:

Dashboard Studio does not natively support HTTPS. Because the app runs entirely inside your own local home network, it uses standard HTTP. Getting official, trusted HTTPS certificates for local IP addresses is practically impossible without triggering annoying browser security warnings for everyone.
You can use Fully Kiosk Browser or WallPanel on your Android TV.

Can you explain this bit further? (I would like to fix all quirks before releasing it to stable). As I understand it: For example, when you set the setting to tomorrow + 7 days, and an all day event happened on today (not on tomorrow) it also lists this event on tomorrow?

What do you mean with: “show them once on top”?

Just a side note about the “+7 days”, you do not have to use all 7 extra days in the markdown card. You could just use 1 to 8 days. But it needs this data to be able to have this flexibility. No need for special scripts to calculate the date range for just today and tomorrow. Just use the today + 7 days, and only show 2 in the markdown converter card.

I will fix that :+1:

I’m planning to translate all date-related cards to the set language in Homey for the stable version. I wanted to make sure the code was solid before diving into the translations, so those will definitely be in the final release.

I don’t see how I can handle personalized headers without cluttering the flow cards with too many options. To be honest, it might not even be necessary since it’s just Markdown. Users who want a tailor-made table can always feed the data into a Homeyscript, tweak it, and send it over to Dashboard Studio. Alternatively, they could write a script that transforms the JSON from the parser into a custom Markdown table. I tested the calendars using this method and it worked quite well. I also found that AIs like Gemini are surprisingly good at whipping up quick Homey scripts for tasks like that.

You can make the icon mapping table empty in the dashboard studio settings.

I am happy to think along, I personally do not really use calendars, I have a wife for the reminders :rofl:
So, this actual real world testing and usage is great.

Thanks :blush:

Thank you.

Please respond to the above question too.

Good evening, I’m not sure if I missed something, but here’s my problem… (1.7.4)

I created a group containing two widgets: one line (actually, I drew a rectangle) and one URL widget for the snapshot from my intercom camera.

I linked the invisibility property of this group to a Boolean variable that I manage in an advanced flow.

But when I change the variable’s state, the line doesn’t seem to be affected (it’s still hidden)… Is this a bug?

Can you try this PLS ?

Thanks a lot

It’s working!!

Sorry, I needed to do some investigation first. I didn’t actually program the markdown decoding myself, I’m using an open-source project that translates Markdown into HTML and CSS. It looks like Markdown doesn’t officially support individual column alignment, it is also not included it in the “Markdown Formatting Reference” in the help file. What specific markdown code are you using to define the “alignment per column” you mentioned? It might be a syntax I’m not familiar with since I’m relying on that library.

The way I designed alignment is through the “Horizontal Alignment” in the text settings. You can use that to set the alignment for all text inside the container, or you can set it to “Use typography settings” to style every element individually. Were you expecting the “paragraph” typography to change the table text? I actually created separate typography settings specifically for table text:

This one also required a bit of overthinking before I could reply. :sweat_smile:

I thought about it and I’m not going to implement it. The new label is intended for quick and simple text. If I were to implement prefixes and suffixes, I would also need to add typography settings for both of them. I can easily imagine someone wanting a bold prefix, the value in normal text, and the unit in a smaller font. I would also need to include alignment options because it would look terrible if multiple labels were stacked and didn’t align properly. The more I thought about it, the more complicated the label widget became. The thing is, I already have a really great solution for this: the new text widget. You can add as many dynamic values inside as you like. You can create a table to align all the values properly, add as many prefixes and suffixes as you want, and change the fonts to whatever you need.

Hi George, I just tried it in 1.7.4 and it works just as expected over here.
Made a quick test:


Added a switch, a container and an image to the canvas. Grouped the container and the image. Gave the “Visibility” the same dynamic topic as the switch “output topic” and now I can control the visibility with the switch. It also works when I do not use an local topic but a global topic.

You can test it yourself by importing this snippet in the editor (top setting)

{
  "snippetHeader": "Dashboard Studio Snippet",
  "snippetType": "widget-snippet",
  "snippetFormatVersion": 1,
  "version": "1.7.4",
  "source": {
    "dashboardName": "Untitled",
    "page": 1,
    "createdAt": "2026-05-04T23:14:08.600Z"
  },
  "master": {
    "currentPage": 1
  },
  "widgets": {
    "switch_7986": {
      "type": "switch",
      "overrides": {
        "x": 410,
        "y": 520,
        "width": 260,
        "height": 110,
        "page": 1,
        "state": true,
        "outputTopic": "local/groupVisible",
        "metaName": "New Switch / Button"
      },
      "bindings": {}
    }
  },
  "groups": {
    "group_morte0s5_5zi": {
      "id": "group_morte0s5_5zi",
      "name": "Group 1",
      "locked": false,
      "visible": true,
      "bindings": {
        "visible": "local/groupVisible"
      },
      "overridePage": "",
      "dimBackgroundWhenVisible": false,
      "widgets": {
        "image_4903": {
          "type": "image",
          "overrides": {
            "x": 400,
            "y": 170,
            "width": 260,
            "height": 300,
            "page": 1,
            "metaName": "New Image"
          },
          "bindings": {}
        },
        "empty_8910": {
          "type": "empty",
          "overrides": {
            "x": 220,
            "y": 110,
            "width": 660,
            "height": 390,
            "page": 1,
            "metaName": "New Container"
          },
          "bindings": {}
        }
      }
    }
  }
}

If this also works fine, then it seems that the boolean value that comes from the flow is problematic again? Are you sure it outputs true / false? I fixed this translation problem in the test version. Can you install the test version?

Hello there,

Just a quickie, will have more time this evening to test.

For now I can already say that all-day-events for the previous day are still visible as they would be today.

I like the markdown view ‘1 day from’. I had not tested that one yet, just used the ‘day view’. In the ‘1 day from’ i’ts more how I like: Not really a hard tabel style, but the all day (including the ones from yesterday :wink: ) on top and the Morning, Afternoon,..

Gonna experiment with (removing) the icons this evening. I also saw that the ‘1day from’ is using html-tags. Does that mean we can also use html font tags or css for adding color, style,… in the new text-widget? In that case… It might be usefull to do some scripting to style the calendar. I’m using Claude AI mostly to write those scripts. in my experience he’s the best, although you have to feed him information about Homeyscript first…

Now of to work first :innocent:

From Use Markdown in Azure DevOps:
Set the column alignment (left, center, right) by using colons : in the second row,
such as |:--|:--:|--:|.

Case: using a Markdown table with text and numeric columns. The text should be left aligned and the numbers right. An option that looks at the alignment definition of the Markdown table and ignores the typography setting for horizontal alignment would help.

Thanks Michel !

FYI, I don’t use a container, I use the widget “Arrow/Line”. But you’re right, it’s better to use a container to draw a frame rather than a LINE/ARROW. I had the same problem!

Actually, after several attempts, I realized it was because of the Z-axis and the layers…

Shame on me ! Sorry for my mistake, and thanks again for your time :slight_smile:

Thanks. Did not know that. Funny thing: I previously wondered why the weird “:” was inside the markup. Researched the library I used, and it turns out it supports this as wel.. I shall try to find a neat way to support this without colliding with the separate font settings. :thinking:

No worries! I am glad you got it sorted out, but I would love to know exactly what the fix was. If I can understand where users are getting tripped up, I might be able to make the software a bit more intuitive. When you mentioned the Z-axis, did you mean the Z-index? …the layers? I am still trying to wrap my head around how that would interfere with the group visibility settings. :sweat_smile:

Hello again,

Emptying the configuration field to remove the PH-icons works.

Having Claude turn over the combined JSON-data into Markdown-text works. Maybe you don’t have to elaborate the possibilities too much. Those who don’t like your lay-out can create their own this way as you statet before.

fetching yesterday + 7 days and then filtering using my own claude-script or your ‘1 day from’ markdown also works perfectly. For me that makes the custom-date option obsolete.

It’s just strange that all-day-events from yesterday keep popping up.
I did some testing with fetching the calendars directly in a Homeyscript (which also crashes Homeyscript as we experienced before with your first try-out). It seems to have to do something with the timezone. But I can’t continue testing now as I’ve already reached my free-use limit of Claude for today :face_with_spiral_eyes:

Yeah, I discovered the bug of the all day / multiple day events that spans a day extra. So that will be solved. Also found enough other quirks that need solving :sweat_smile: . Also searching for a way to distinguish all day / multiple day and timed events more clearly without striving too far from Markdown standards.

I can’t give you many details because my setup was really just a test with a stack of widgets grouped one on top of the other (Z-Index). Several for SONOS and several for the snapshot from my intercom camera. And among them, there was one widget from Group 1 that remained underneath a widget from Group 2… if that makes sense !

I understand. When you have a ton of layered groups stacked on top of each other that hide and show based on dynamic values, I can totally see how some might get lost. Editing that setup in the editor is also a huge pain. There is a poorly documented better solution though. You can actually “teleport” groups from one page to another. If you open the demo and click “core telemetry” (this button is called differently in the stable 1.7.4 version) it brings up a popup overlay. That overlay is really just a bunch of grouped widgets hanging out on page 3. I simply override their current location using the “Override Page(s)” option in the group. The button has the target page in its ON value (1) and that same topic is dynamically linked in the “Override Page(s)” setting. Clicking the close button on the dialog just reverts the value back to 3. This way you can create all your overlay pages conveniently on different pages.

Extra tip if you need to select something behind something else: Using the middle mouse button (or ALT+Click) selects the widget / group behind that (and another click behind that again)

Hi together,

is there a guide somewhere on how to integrate Shelly roller shutter actuators?
I’ve generated 4 buttons for testing purposes:
1 Up
2 Stop
3 Down
4 Sun (70%)

I can easily set up 1 and 3 using AZ-rollo-107/windowcoverings_set and the value 100 for ON VALUE or 0 for ON VALUE. So that starts. Down/Up
4 also works with the value 70 there

But I do find it strange that ON VALUE and OFF VALUE exist at all; I would have expected just one value for a button.

Next—I don’t know how to implement STOP…
AZ-rollo-107/actionEvents and then “stop” in ON VALUE doesn’t work. Is there a specific function that needs to be enabled and used?
Otherwise, the first attempts were already very promising! Very cool app! THANK YOU for that!

Can anyone help me with this?
Is there perhaps a widget I haven’t discovered yet that can be used to control roller shutters or awnings?

Tommi

For window blinds and things like dim levels etc Homey uses ranges 0 to 1. So you probably have to use fractions like 0.7 to get 70%
I do not have the actuators myself, so I do not know the direct stop commands. But I assume there are flow cards to stop the actuators? You could easily activate the flow card using dashboard studio’s IF card.

New TEST version 1.8.4

  • Fixed: Selection group widgets (Switch/Button + Menu) now refresh reliably, even when the same value arrives again.
  • Fixed: Calendar all-day and multi-day events no longer appear one day later also in some cases.
  • Improved: Calendar week view ordering is now clearer and more consistent.
  • Improved: Recurring calendar events support more rule patterns and exceptions for better compatibility.
  • Improved: Calendar event ordering is now consistent across month/week/day views.
  • New: Load & Filter iCal can emit event type flags (timed/all-day/multi-day/recurring) for easier styling.
  • New: Calendar setting to show/hide icons, plus a configurable default icon.
  • Improved: Calendar event lines have a cleaner, consistent format (icon → time → title).
  • Fixed: Calendar day view now shows only the selected day.

@Bert_Onraedt So lots of improvements and fixes regarding the calendar flowcards. Also added an option in the Homey Dashboard Studio settings to disable all icons and set the default icon for events. Please check if your problems are fixed.

Also fixed :+1:

In recent DS versions (before v1.8), I had defined gauges and sliders with an SVG overlaid on top. By defining the line thickness of the gauge and slider to 1, this line was not visible.
With the most recent version, that line remains visible. I cannot set the line to thickness 0 or opacity 0, resulting in the image below. Is there anything else I can adjust so that I only see the SVG (without thin line), but can still use the slider or gauge?

The SVG uses transparency and a color gradient. Due to the color gradient of the background, I also cannot apply a line color that matches the background color.