diff --git a/app/node/CMakeLists.txt b/app/node/CMakeLists.txt
index ef1978c21..6c903dacc 100644
--- a/app/node/CMakeLists.txt
+++ b/app/node/CMakeLists.txt
@@ -27,6 +27,7 @@ add_subdirectory(input)
add_subdirectory(keying)
add_subdirectory(math)
add_subdirectory(output)
+add_subdirectory(plugins)
add_subdirectory(project)
add_subdirectory(time)
diff --git a/app/node/plugins/CMakeLists.txt b/app/node/plugins/CMakeLists.txt
new file mode 100644
index 000000000..2eb07ea2f
--- /dev/null
+++ b/app/node/plugins/CMakeLists.txt
@@ -0,0 +1,22 @@
+# Olive - Non-Linear Video Editor
+# Copyright (C) 2022 Olive Team
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+set(OLIVE_SOURCES
+ ${OLIVE_SOURCES}
+ node/plugins/Plugin.h
+ node/plugins/Plugin.cpp
+ PARENT_SCOPE
+)
diff --git a/app/node/plugins/Plugin.cpp b/app/node/plugins/Plugin.cpp
new file mode 100644
index 000000000..3b096a3ce
--- /dev/null
+++ b/app/node/plugins/Plugin.cpp
@@ -0,0 +1,46 @@
+//
+// Created by katherinesolar on 25-8-3.
+//
+
+#include "Plugin.h"
+QString olive::plugin::PluginNode::Name() const
+{
+ if (methods.name) {
+ char buffer[64]={0};
+ bool ok=methods.name(buffer, 64);
+ if (ok) {
+ return QString(buffer);
+ }
+ }
+ return "";
+}
+
+QString olive::plugin::PluginNode::Description() const
+{
+ if (methods.description) {
+ char buffer[1024] = { 0 };
+ bool ok = methods.description(buffer, 1024);
+ if (ok) {
+ return QString(buffer);
+ }
+ }
+ return "";
+}
+void olive::plugin::PluginNode::Value(const NodeValueRow &value,
+ const NodeGlobals &globals,
+ NodeValueTable *table) const
+{
+ methods.value(&node_ctx_functions);
+}
+
+QString olive::plugin::PluginNode::id() const
+{
+ if (methods.id) {
+ char buffer[64]={0};
+ bool ok=methods.id(buffer, 64);
+ if (ok) {
+ return QString(buffer);
+ }
+ }
+ return "";
+}
\ No newline at end of file
diff --git a/app/node/plugins/Plugin.h b/app/node/plugins/Plugin.h
new file mode 100644
index 000000000..b8a4f326a
--- /dev/null
+++ b/app/node/plugins/Plugin.h
@@ -0,0 +1,44 @@
+//
+// Created by katherinesolar on 25-8-3.
+//
+
+#ifndef PLUGIN_H
+#define PLUGIN_H
+#include "node/node.h"
+#include "pluginSupport/Plugin.h"
+#include "pluginSupport/olive_plugin.h"
+namespace olive
+{
+namespace plugin
+{
+
+class PluginNode : public olive::Node{
+public:
+ PluginNode():Node()
+ {
+ memset(&methods, 0, sizeof(olive_node_methods));
+ };
+ explicit PluginNode(struct olive_node_methods methods):Node()
+ {
+ this->methods=methods;
+ }
+ void setMethods(struct olive_node_methods methods)
+ {
+ this->methods=methods;
+ }
+ QString Name() const override;
+ QString id() const override;
+ QVector Category() const override;
+ QString Description() const override;
+ void Value(const NodeValueRow &value,
+ const NodeGlobals &globals, NodeValueTable *table) const override;
+private:
+ struct olive_node_methods methods;
+
+};
+
+}
+}
+
+
+#endif //PLUGIN_H
diff --git a/app/pluginSupport/CMakeLists.txt b/app/pluginSupport/CMakeLists.txt
index 59c97c6a8..2690f7bb8 100644
--- a/app/pluginSupport/CMakeLists.txt
+++ b/app/pluginSupport/CMakeLists.txt
@@ -2,5 +2,6 @@ set(OLIVE_SOURCES
${OLIVE_SOURCES}
pluginSupport/Plugin.cpp
pluginSupport/Plugin.h
+ pluginSupport/olive_plugin.h
PARENT_SCOPE
)
\ No newline at end of file
diff --git a/app/pluginSupport/Plugin.cpp b/app/pluginSupport/Plugin.cpp
index 970578474..4702c159c 100644
--- a/app/pluginSupport/Plugin.cpp
+++ b/app/pluginSupport/Plugin.cpp
@@ -3,3 +3,4 @@
//
#include "Plugin.h"
+olive_node_ctx_functions node_ctx_functions;
\ No newline at end of file
diff --git a/app/pluginSupport/Plugin.h b/app/pluginSupport/Plugin.h
index 607477937..7bb2b308e 100644
--- a/app/pluginSupport/Plugin.h
+++ b/app/pluginSupport/Plugin.h
@@ -4,28 +4,43 @@
#ifndef PLUGIN_H
#define PLUGIN_H
-#include