diff --git a/packages/app/constants/settings/components/widgetsView/index.jsx b/packages/app/constants/settings/components/widgetsView/index.jsx
new file mode 100644
index 00000000..c48f7106
--- /dev/null
+++ b/packages/app/constants/settings/components/widgetsView/index.jsx
@@ -0,0 +1,59 @@
+import React from "react"
+import * as antd from "antd"
+
+import { Icons } from "components/Icons"
+import { openModal as openWidgetsBrowserModal } from "components/WidgetsBrowser"
+import WidgetItemPreview from "components/WidgetItemPreview"
+
+import "./index.less"
+
+export default class WidgetsView extends React.Component {
+ state = {
+ loadedWidgets: this.props.ctx.currentValue ?? [],
+ }
+
+ render() {
+ return
+
+ {
+ this.state.loadedWidgets.map((manifest) => {
+ return
{
+ app.cores.widgets.uninstall(manifest._id)
+ }}
+ onInstall={() => {
+ app.cores.widgets.install(manifest._id)
+ }}
+ onUpdate={() => {
+ app.cores.widgets.install(manifest._id, {
+ update: true,
+ })
+ }}
+ onChangeVisible={(visible) => {
+ app.cores.widgets.toogleVisibility(manifest._id, visible)
+ }}
+ />
+ })
+ }
+
+
+
}
+ onClick={openWidgetsBrowserModal}
+ >
+ Add widget
+
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/packages/app/constants/settings/components/widgetsView/index.less b/packages/app/constants/settings/components/widgetsView/index.less
new file mode 100644
index 00000000..76c23b9a
--- /dev/null
+++ b/packages/app/constants/settings/components/widgetsView/index.less
@@ -0,0 +1,54 @@
+.widgets_load {
+ display: flex;
+ flex-direction: column;
+
+ gap: 20px;
+
+ .widgets_load_list {
+ display: flex;
+ flex-direction: column;
+
+ gap: 10px;
+
+ .widget_load_list_item {
+ display: flex;
+ flex-direction: row;
+
+ align-items: center;
+ justify-content: space-between;
+
+ padding: 10px;
+
+ border: 1px var(--border-color) solid;
+ border-radius: 12px;
+
+ .widget_load_list_item_info {
+ display: flex;
+ flex-direction: row;
+
+ gap: 20px;
+ }
+
+ .widget_load_list_item_icon {
+ display: flex;
+ flex-direction: row;
+
+ align-items: center;
+ justify-content: center;
+
+ align-self: center;
+
+ height: 60px;
+ width: 60px;
+
+ img {
+ height: 100%;
+ width: 100%;
+
+ object-fit: contain;
+ }
+
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/app/constants/settings/widgets/index.jsx b/packages/app/constants/settings/widgets/index.jsx
new file mode 100644
index 00000000..e1ac97e8
--- /dev/null
+++ b/packages/app/constants/settings/widgets/index.jsx
@@ -0,0 +1,25 @@
+import loadable from "@loadable/component"
+
+export default {
+ id: "widgets",
+ icon: "List",
+ label: "Widgets",
+ group: "app",
+ settings: [
+ {
+ id: "widgets.urls",
+ title: "Widgets",
+ icon: "List",
+ component: loadable(() => import("../components/widgetsView")),
+ defaultValue: () => {
+ if (typeof app.cores.widgets === "undefined") {
+ return []
+ }
+
+ return app.cores.widgets.getInstalled()
+ },
+ reloadValueOnUpdateEvent: "widgets:update",
+ storaged: false,
+ }
+ ]
+}
\ No newline at end of file