syncfusion-maui-chat — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-maui-chat (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Syncfusion .NET MAUI Chat control (SfChat) delivers a contemporary conversational UI for building chatbot interfaces, customer support screens, and multi-user messaging experiences. It supports rich message types, real-time typing indicators, suggestions, load-more history, swiping, and deep styling customization.
📄 Read: references/getting-started.md
Syncfusion.Maui.Chat)MauiProgram.csSfChat initialization in XAML and C#Messages and CurrentUser📄 Read: references/messages.md
TextMessage, DatePickerMessage, TimePickerMessage, CalendarMessageHyperlinkMessage, ImageMessage, CardMessageShowDeliveryState, DeliveryState enum, custom icons)AllowPinning, PinnedMessages, events, template)ChatMessageTemplateSelector📄 Read: references/data-binding.md
ObservableCollection<object> to MessagesCurrentUser differentiation of sender/receiverIMessage / ITextMessageItemsSourceConverter for external model binding📄 Read: references/suggestions.md
SfChat.Suggestions)TextMessage.Suggestions)SuggestionItemSelected event and command📄 Read: references/typing-indicator.md
ShowTypingIndicator)TypingIndicator📄 Read: references/load-more.md
LoadMoreBehavior)LoadMore event and LoadMoreCommandIsLazyLoading property📄 Read: references/events.md
SendMessage / SendMessageCommandImageTapped / ImageTappedCommandCardTapped / CardCommandSuggestionItemSelectedMessagePinned / MessageUnpinnedLoadMore / LoadMoreCommand📄 Read: references/styles.md
MessageShape options📄 Read: references/accessibility-localization.md
AutomationId for UI testing.resx resource files📄 Read: references/scrolling.md
ScrollToMessage)CanAutoScrollToBottom)ShowScrollToBottomButton)ScrollToBottomButtonTemplate)Scrolled event and ChatScrolledEventArgs (IsBottomReached, IsTopReached, ScrollOffset)📄 Read: references/advanced-features.md
SwipeStarted, SwipeEnded, swipe templates)AttachmentButtonView)MessageSpacing configurationShowMessageInputView)1. Install the NuGet package:
dotnet add package Syncfusion.Maui.Chat2. Register the handler in `MauiProgram.cs`:
using Syncfusion.Maui.Core.Hosting;
builder.ConfigureSyncfusionCore();3. Add `SfChat` in XAML:
<ContentPage xmlns:sfChat="clr-namespace:Syncfusion.Maui.Chat;assembly=Syncfusion.Maui.Chat"
xmlns:local="clr-namespace:MyApp">
<ContentPage.BindingContext>
<local:ChatViewModel/>
</ContentPage.BindingContext>
<sfChat:SfChat Messages="{Binding Messages}"
CurrentUser="{Binding CurrentUser}" />
</ContentPage>4. Define the ViewModel:
using Syncfusion.Maui.Chat;
public class ChatViewModel : INotifyPropertyChanged
{
public ObservableCollection<object> Messages { get; set; }
public Author CurrentUser { get; set; }
public ChatViewModel()
{
CurrentUser = new Author { Name = "Nancy" };
Messages = new ObservableCollection<object>
{
new TextMessage
{
Author = CurrentUser,
Text = "Hello! How can I help you today?"
},
new TextMessage
{
Author = new Author { Name = "Bot", Avatar = "bot.png" },
Text = "Hi Nancy! I am here to assist you."
}
};
}
public event PropertyChangedEventHandler PropertyChanged;
}// In ViewModel
public ICommand SendMessageCommand => new Command<object>(OnSendMessage);
private void OnSendMessage(object args)
{
var e = args as SendMessageEventArgs;
// ⚠️ IMPORTANT: By default, SfChat automatically adds the user's message to the
// Messages collection. Do NOT manually add it unless you set e.Handled = true
// Add bot response after user sends message
MainThread.BeginInvokeOnMainThread(async () =>
{
await Task.Delay(500); // Simulate processing
Messages.Add(new TextMessage
{
Author = new Author { Name = "Bot", Avatar = "bot.png" },
Text = $"You said: {e.Message.Text}"
});
});
}If you need full control over message addition, set `Handled = true`:
private void OnSendMessage(object args)
{
var e = args as SendMessageEventArgs;
e.Handled = true; // Prevent SfChat from auto-adding the message
// Now you must manually add the message
if (e.Message is TextMessage textMessage)
{
Messages.Add(textMessage); // You add it
// Then handle response...
}
}Messages.Add(new TextMessage
{
Author = new Author { Name = "Bot" },
Text = "How would you like to proceed?",
Suggestions = new ObservableCollection<ISuggestion>
{
new Suggestion { Text = "Option A" },
new Suggestion { Text = "Option B" }
}
});sfChat.ShowTypingIndicator = true;
sfChat.TypingIndicator = new TypingIndicator
{
Authors = new ObservableCollection<Author>
{
new Author { Name = "Bot", Avatar = "bot.png" }
},
Text = "Bot is typing..."
};| Property | Type | Purpose |
|---|---|---|
Messages | ObservableCollection<object> | Collection of all messages |
CurrentUser | Author | Identifies the local user (outgoing messages) |
ShowTypingIndicator | bool | Toggle typing indicator |
TypingIndicator | TypingIndicator | Set who is typing |
ShowDeliveryState | bool | Show sent/delivered/read/failed icons |
AllowPinning | bool | Enable message pinning |
MessageShape | MessageShape | Message bubble shape |
MessageSpacing | double | Vertical gap between messages |
ShowMessageInputView | bool | Show/hide the message editor |
LoadMoreBehavior | LoadMoreOption | Enable load-more on scroll |
AllowMultilineInput | bool | Allow multi-line message entry |
ShowKeyboardAlways | bool | Keep keyboard open after send |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.