diff --git a/internal/glance/templates/stack.html b/internal/glance/templates/stack.html
new file mode 100644
index 00000000..77d4f3de
--- /dev/null
+++ b/internal/glance/templates/stack.html
@@ -0,0 +1,9 @@
+{{ template "widget-base.html" . }}
+
+{{ define "widget-content-classes" }}widget-content-frameless{{ end }}
+
+{{ define "widget-content" }}
+ {{- range $i, $widget := .Widgets }}
+ {{- .Render -}}
+ {{- end }}
+{{ end }}
\ No newline at end of file
diff --git a/internal/glance/widget-stack.go b/internal/glance/widget-stack.go
new file mode 100644
index 00000000..bebae7d4
--- /dev/null
+++ b/internal/glance/widget-stack.go
@@ -0,0 +1,53 @@
+package glance
+
+import (
+ "context"
+ "errors"
+ "html/template"
+ "time"
+)
+
+var stackWidgetTemplate = mustParseTemplate("stack.html", "widget-base.html")
+
+type stackWidget struct {
+ widgetBase `yaml:",inline"`
+ containerWidgetBase `yaml:",inline"`
+}
+
+func (widget *stackWidget) initialize() error {
+ widget.withError(nil)
+ widget.HideHeader = true
+
+ for i := range widget.Widgets {
+
+ if widget.Widgets[i].GetType() == "stack" {
+ return errors.New("nested stacks are not supported")
+ } else if widget.Widgets[i].GetType() == "group" {
+ return errors.New("groups inside of stacks are not supported")
+ } else if widget.Widgets[i].GetType() == "split-column" {
+ return errors.New("split columns inside of stacks are not supported")
+ }
+ }
+
+ if err := widget.containerWidgetBase._initializeWidgets(); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (widget *stackWidget) update(ctx context.Context) {
+ widget.containerWidgetBase._update(ctx)
+}
+
+func (widget *stackWidget) setProviders(providers *widgetProviders) {
+ widget.containerWidgetBase._setProviders(providers)
+}
+
+func (widget *stackWidget) requiresUpdate(now *time.Time) bool {
+ return widget.containerWidgetBase._requiresUpdate(now)
+}
+
+func (widget *stackWidget) Render() template.HTML {
+ return widget.renderTemplate(widget, stackWidgetTemplate)
+}
diff --git a/internal/glance/widget.go b/internal/glance/widget.go
index 832ba217..c9913307 100644
--- a/internal/glance/widget.go
+++ b/internal/glance/widget.go
@@ -83,6 +83,8 @@ func newWidget(widgetType string) (widget, error) {
w = &torrentsWidget{}
case "to-do":
w = &todoWidget{}
+ case "stack":
+ w = &stackWidget{}
case "trending-repositories":
w = &trendingRepositoriesWidget{}
default: