Building the UI

ForkBit plugins use standard PySide6 widgets. The app’s theme cascades automatically — your widgets look native without any extra styling.

Replace the content of main.py:

from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
    QHBoxLayout,
    QLabel,
    QLineEdit,
    QPlainTextEdit,
    QPushButton,
    QVBoxLayout,
)

from forkbit_sdk import BasePlugin


class ReleaseNotesPlugin(BasePlugin):

    def on_ready(self) -> None:
        layout = QVBoxLayout(self.container)
        layout.setContentsMargins(24, 24, 24, 24)
        layout.setSpacing(16)

        # Version input
        version_row = QHBoxLayout()
        version_row.addWidget(QLabel("Version:"))
        self.version_input = QLineEdit()
        self.version_input.setPlaceholderText("e.g. 1.0.0")
        version_row.addWidget(self.version_input)
        layout.addLayout(version_row)

        # Notes editor
        layout.addWidget(QLabel("Release Notes:"))
        self.editor = QPlainTextEdit()
        self.editor.setPlaceholderText("What's new in this release?")
        layout.addWidget(self.editor)

        # Action buttons
        button_row = QHBoxLayout()
        button_row.addStretch()

        save_btn = QPushButton("Save Draft")
        save_btn.clicked.connect(self._on_save)
        button_row.addWidget(save_btn)

        publish_btn = QPushButton("Publish")
        publish_btn.setProperty("class", "primary")
        publish_btn.clicked.connect(self._on_publish)
        button_row.addWidget(publish_btn)

        layout.addLayout(button_row)

    def _on_save(self) -> None:
        self.notify("Draft saved.", level="success")

    def _on_publish(self) -> None:
        version = self.version_input.text().strip()
        if not version:
            self.notify("Please enter a version number.", level="warning")
            return
        self.notify(f"Published v{version}!", level="success")

Styling tips

  • Use setProperty("class", "primary") for primary-styled buttons

  • Use spacing constants: 4, 8, 12, 16, 24, 32 px

  • Set setObjectName() on widgets if you need to target them with QSS

  • Don’t use setStyleSheet() — the app’s theme handles styling

Your plugin now has a functional editor UI. Next: Plugin Settings.