Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Ein direkter Befehl überspringt den Prüf-Prompt. Prüfen Sie die Quelle, bevor Sie ihn ausführen.
prefixPattern (optional): For panels that accept parameters (e.g., "image:")
3. Main Plugin Class
using LCDPossible.Core.Plugins;
using LCDPossible.Core.Rendering;
using LCDPossible.Plugins.{Name}.Panels;
namespaceLCDPossible.Plugins.{Name};
publicsealedclass {Name}Plugin : IPanelPlugin
{
publicstring PluginId => "lcdpossible.{name}";
publicstring DisplayName => "Plugin Display Name";
public Version Version => new(1, 0, 0);
publicstring Author => "Author Name";
public Version MinimumSdkVersion => new(1, 0, 0);
public IReadOnlyDictionary<string, PanelTypeInfo> PanelTypes { get; } =
new Dictionary<string, PanelTypeInfo>
{
["panel-id"] = new PanelTypeInfo
{
TypeId = "panel-id",
DisplayName = "Panel Name",
Description = "Description",
Category = "Category",
IsLive = true
}
};
public Task InitializeAsync(IPluginContext context, CancellationToken ct = default)
{
return Task.CompletedTask;
}
public IDisplayPanel? CreatePanel( panelTypeId, PanelCreationContext context)
{
typeId = panelTypeId.ToLowerInvariant();
IDisplayPanel? panel = typeId
{
=> PanelNamePanel(),
_ =>
};
(panel LCDPossible.Sdk.BaseLivePanel livePanel && context.ColorScheme != )
{
livePanel.SetColorScheme(context.ColorScheme);
}
panel;
}
{ }
}
Panel Implementation
Base Class: BaseLivePanel
Use BaseLivePanel from LCDPossible.Sdk for panels with:
Color scheme support
Common drawing utilities
Font loading helpers
using LCDPossible.Sdk;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
namespaceLCDPossible.Plugins.{Name}.Panels;
publicsealedclass {PanelName}Panel : BaseLivePanel
{
publicoverridestring PanelId => "panel-id";
publicoverridestring DisplayName => "Panel Name";
publicoverridebool IsLive => true; // Shows real-time datapublicoverridebool IsAnimated => false; // Self-managed frame timingpublicoverride Task InitializeAsync(CancellationToken ct = default)
{
// One-time setupreturn Task.CompletedTask;
}
publicoverride Task<Image<Rgba32>> RenderFrameAsync(
int width, int height, CancellationToken ct = default)
{
var image = new Image<Rgba32>(width, height, BackgroundColor);
image.Mutate(ctx =>
{
// Drawing code here
});
Task.FromResult(image);
}
}
Key Properties
Property
Type
Description
PanelId
string
Unique identifier matching plugin registration
DisplayName
string
Human-readable name
IsLive
bool
true if panel shows real-time/changing data
IsAnimated
bool
true if panel manages its own animation timing
Drawing Utilities (from BaseLivePanel)
// Colors from scheme
BackgroundColor, PrimaryTextColor, SecondaryTextColor, AccentColor
// Fonts (after InitializeAsync)
TitleFont, ValueFont, LabelFont, SmallFont
// Drawing helpers
DrawText(ctx, text, x, y, font, color, maxWidth);
DrawCenteredText(ctx, text, centerX, y, font, color);
DrawRightText(ctx, text, rightX, y, font, color);
DrawProgressBar(ctx, percentage, x, y, width, height, fillColor);
DrawVerticalBar(ctx, percentage, x, y, width, height, fillColor);
// Color helpers
GetUsageColor(percentage); // Green → Yellow → Red
GetTemperatureColor(celsius); // Blue → Green → Yellow → Red
Animation Patterns
Delta-Time Animation
For smooth, frame-rate independent animation:
private DateTime _lastUpdate = DateTime.UtcNow;
publicoverride Task<Image<Rgba32>> RenderFrameAsync(...)
{
var now = DateTime.UtcNow;
var deltaTime = (float)(now - _lastUpdate).TotalSeconds;
_lastUpdate = now;
// Use deltaTime for movement
_position += _velocity * deltaTime;
}
Time-Based Animation
For cyclical effects:
private DateTime _startTime = DateTime.UtcNow;
publicoverride Task<Image<Rgba32>> RenderFrameAsync(...)
{
var time = (float)(DateTime.UtcNow - _startTime).TotalSeconds;
// Use time for oscillationvar pulse = MathF.Sin(time * 2f) * 0.5f + 0.5f;
}
Common Drawing Operations
Shapes (SixLabors.ImageSharp.Drawing)
// Ellipse/Circle
ctx.Fill(color, new EllipsePolygon(centerX, centerY, radiusX, radiusY));
ctx.Fill(color, new EllipsePolygon(centerX, centerY, radius)); // Circle// Rectangle
ctx.Fill(color, new RectangleF(x, y, width, height));
// Line
ctx.DrawLine(color, thickness, new PointF(x1, y1), new PointF(x2, y2));
// Polygon pathvar path = new PathBuilder();
path.MoveTo(new PointF(x1, y1)); // MUST start with MoveTo
path.LineTo(new PointF(x2, y2));
path.LineTo(new PointF(x3, y3));
path.CloseFigure();
ctx.Fill(color, path.Build());
Per-Pixel Operations
For effects like plasma, fire, noise:
image.ProcessPixelRows(accessor =>
{
for (var y = 0; y < height; y++)
{
var row = accessor.GetRowSpan(y);
for (var x = 0; x < width; x++)
{
row[x] = new Rgba32(r, g, b);
}
}
});
Panel Type Categories
Category
Use For
System
CPU, RAM, GPU, network info
Screensaver
Animated visual effects
Media
Images, videos, GIFs
Web
HTML/website rendering
Integration
External services (Proxmox, etc.)
Registration Checklist
When adding a new panel:
Create {PanelName}Panel.cs in Panels/ folder
Add entry to PanelTypes dictionary in plugin class
Add case to CreatePanel switch statement
Add entry to plugin.json panelTypes array
Build and verify plugin loads
Common Issues
PathBuilder Lines from Origin
Problem: Lines drawn from (0,0) to first point
Solution: Always call MoveTo() before LineTo()