Native WinUI 3 RTF editor for Windows — ribbon UI, macros, multi-window editing and an on-device AI sidebar. .NET 8.
See the code
Status: released and actively developed · Latest: v0.9.6 · Requires: Windows 10 1809 (build 17763) or later
A modern WordPad-inspired rich text editor built with WinUI 3 and .NET 8, featuring a Microsoft WordPad-style ribbon interface, tabbed documents, macro recording, a full suite of export options, and an on-device AI writing assistant powered by ONNX Runtime GenAI (CUDA/CPU) / Windows AI APIs.
Grab the latest portable build from Releases — unzip and run SmrtPad.exe. Self-contained, so no .NET runtime is needed.
Builds are currently unsigned; Windows SmartScreen will warn on first run. Choose More info → Run anyway if you trust the source.
RichEditBox (RTF and TXT open/save)ScaleTransform — Ctrl+Plus/Minus and Ctrl+Scroll; per-tab zoom level.docx via ZipArchive + XDocumentsmrtdoodle:// protocol; the current selection (if any) is sent as the initial canvas image over a per-session named pipeLauncher.QueryUriSupportAsync; if SmrtDoodle is not installed a dialog offers a Get from Store button that opens the Microsoft Store search for SmrtDoodleSmrtAI.Core library, reused by both apps<think>…</think> tags (including implicit pre-</think> reasoning from phi-4-mini) shown in a collapsible expander labelled "Thinking…"; collapses automatically once reasoning is complete so the response is front and centreComboBox selects the active skill (Summarize, Professional tone, Rewrite for clarity, Grammar fix, Shorten, Complete at cursor); single Apply button dispatches to the correct prompt templateGgufModelCatalog registers 12 local GGUF entries for the LLamaSharp/llama.cpp runner, including Gemma 4, Gemma 3, Phi, Llama and Qwen variants, with Hugging Face repository/file metadata and approximate GPU footprints. ModelSizeSelector separately defines the ONNX GenAI aliases, GPU/CPU footprints and configured Hugging Face source directories. The default AIDispatcherFactory.Create() path is currently wired to gemma-4-e2b with an 8 192-token context; CreateFromLocalPath can load either a local .gguf file or an ONNX GenAI directory containing genai_config.jsonModelSizeSelector.SelectBestAliasAsync and GetBestAliasForCapability scan the hard-coded PreferredAliases list in declaration order and return the first eligible entry that fits the active budget and headroom. They do not search for the largest eligible model. If none fits, the selector falls back to phi-4-miniModelDownloadService acquires configured ONNX GenAI variants from Hugging Face into %LOCALAPPDATA%\SmrtPad\models\<alias>\<gpu|cpu>. If genai_config.json already exists, it accepts and reuses that cached model directory without rechecking file sizes or completeness. During download acquisition, it enumerates source file sizes, skips an existing file only when its byte length matches, and writes other files to .tmp before moving them into place; those per-file size/completion checks apply to acquisition, not as a universal cache-integrity guarantee. Automatic acquisition is available only for aliases and variants present in the selector's Hugging Face source map; catalog metadata by itself is not a download implementation, and the hard-coded Gemma 4 default is not separate proof of an available download source<insert>…</insert> contract across all skills)LicenseOrchestrator and an IStoreContextAdapter seam, with a local Ed25519 license-key fallback. The current dependency-injection registration uses StubStoreContextAdapter rather than a live Store client, and that stub currently returns true; Debug builds also enable Pro flags directly. These development/code paths are not proof of a paid Windows Store entitlement, product SKU or release-time Store integration
Ctrl+Shift+N / Window menu); each window is fully independentSmrtPad.ico) shown in the taskbar, title bar, and Alt-Tab thumbnailSettingsService (JSON at %LOCALAPPDATA%\SmrtPad\settings.json)git clone https://github.com/JAD-Apps/SmrtPad.git
SmrtPad.slnx in Visual Studio 2022 or later.No configuration is required to build. .env.example documents optional local
toggles for the UI-test deploy script and the AI benchmark suite — copy it to
.env (gitignored) only if you need to change them.
dotnet test SmrtPad.Tests\SmrtPad.Tests.csproj -c Debug -p:Platform=x64
dotnet test SmrtPad.AI.Tests\SmrtPad.AI.Tests.csproj -c Debug -p:Platform=x64
SmrtPad includes a local Appium-based benchmark suite for the Smart Sidebar AI models. The benchmark exercises all supported sidebar skills across a curated prompt set, records latency and throughput, applies rule-based scoring, estimates electricity cost, and generates report artifacts for qualitative review.
For models that support reasoning (Qwen3, Phi-4 Mini Reasoning, DeepSeek-R1), each model is benchmarked in both no-thinking and thinking modes. GPU runs execute first (both modes), followed by CPU runs (both modes where applicable).
Build and deploy the packaged SmrtPad (Package) app so the local AUMID is registered.
Install Appium via npm.
Install the Appium Windows driver:
appium driver install --source=npm appium-windows-driver
Install WinAppDriver 1.2.1.
Start the local benchmark infrastructure:
powershell -ExecutionPolicy Bypass -File .\SmrtPad.UITests\Scripts\start-benchmark.ps1
Smoke validation:
dotnet test .\SmrtPad.UITests\SmrtPad.UITests.csproj -c Debug -p:Platform=x64 --filter "FullyQualifiedName=SmrtPad.UITests.Tests.ModelBenchmarkTests.SmokeTest_SinglePrompt"
Full benchmark:
dotnet test .\SmrtPad.UITests\SmrtPad.UITests.csproj -c Debug -p:Platform=x64 --filter "FullyQualifiedName=SmrtPad.UITests.Tests.ModelBenchmarkTests.RunFullBenchmark"
BENCHMARK_MODEL_FILTER — comma-separated model alias filter for subset runs, for example phi-4-mini or phi-4-mini,qwen2.5-1.5bBENCHMARK_GPU_WATTS — GPU power draw override, default 115BENCHMARK_CPU_WATTS — CPU power draw override, default 105BENCHMARK_NPU_WATTS — NPU power draw override, default 15BENCHMARK_ELECTRICITY_RATE — electricity cost in USD per kWh, default 0.12SMRTPAD_BENCHMARK_MODE — set to CPU to skip GPU runs and only execute CPU runs; omit (or set to GPU) for the default GPU-first-then-CPU matrixSMRTPAD_LLAMA_BACKEND_DIR — absolute path to a custom llama.cpp backend directory (must contain llama.dll + ggml.dll); used when the default CUDA 12 build does not support a required model architecture (e.g., Gemma 4)Each benchmark run produces:
benchmark-report-*.md — Markdown summary report (includes Mode column distinguishing Think / NoThink runs)benchmark-dashboard-*.html — static Chart.js live dashboard (per-model series split by reasoning tag)benchmark-results-*.json — raw machine-readable resultsbench-*-responses.jsonl — per-case response log (JSONL)qualitative-assessment-prompt-*.md — prompt for chat-based qualitative reviewArtifacts are written to BenchmarkResults\ at the solution root when discoverable. If the solution root cannot be resolved from the test host, the suite falls back to %TEMP%\SmrtPad-BenchmarkResults\.
The test suite covers:
NewDocument full state resetColorHelper hex parsing (6-digit, 8-digit, error cases)word/document.xml content, paragraph mapping)ModelSizeSelector alias/budget logic, HardwareProbeService VRAM/RAM probing, PromptTemplates output, AIDispatcher skill routing, ResponseCleaner output strippingSmrtPad/
├── SmrtAI.Core/ # Shared AI abstractions and IPC contract (net8.0 library)
│ ├── IAIDispatcher.cs # AI dispatcher interface (shared with SmrtPad.AI)
│ ├── AIDispatcherAvailability.cs # Backend availability DTOs
│ ├── SemanticSearchModels.cs # Semantic search records
│ ├── SmrtDoodleIpcContract.cs # Protocol URI builder and pipe-name helpers
│ └── SmrtDoodleFrame.cs # Length-prefixed JSON frame serializer
├── SmrtPad/
│ ├── Assets/ # App icon (SmrtPad.ico/.png), SmrtDoodle icons
│ ├── Controls/ # SmartSidebar, SidebarChatEntry, SidebarChatTemplateSelector
│ ├── Converters/ # NonEmptyStringToVisibilityConverter
│ ├── Helpers/ # ColorHelper, DocxExportHelper, DocumentImportHelper,
│ │ # DocumentTemplates, MacroHelper, OneDriveHelper,
│ │ # ParagraphStyleHelper, PdfHelper, ResourceHelper,
│ │ # ResponseCleaner, RtfHelper, RulerHelper
│ ├── Models/ # DocumentTemplate
│ ├── Services/ # AIDispatcherProxy, DialogService, FileService,
│ │ # SettingsService, SmrtDoodleIpcService
│ │ # (+ IDialogService, IFileService, ISettingsService)
│ ├── Strings/ # 9 locale .resw files (en-US, de-DE, es-ES, fr-FR,
│ │ # ja-JP, zh-Hans, ar-SA, ru-RU, ur-PK)
│ ├── ViewModels/ # EditorViewModel
│ ├── Views/ # FileBackstageView
│ ├── MainWindow.xaml # Main window with ribbon UI
│ ├── MainWindow.xaml.cs # Code-behind — editor logic, ribbon handlers
│ ├── App.xaml # Application resources and ThemeDictionaries
│ └── App.xaml.cs # Entry point, DI container, multi-window factory
├── SmrtPad.AI/
│ ├── Skills/ # AIRewriteSkill, AutoCompleteSkill, GrammarFixSkill,
│ │ # ShortenSkill, SummarizerSkill, ToneShifterSkill
│ ├── AIDispatcher.cs # Core streaming dispatcher with skill-key routing;
│ │ # exposes PreferredReasoningMode / SetPreferredReasoningMode
│ ├── AIDispatcherFactory.cs # DI factory — hardware probing, model selection;
│ │ # CreateFromLocalPath honours preferred reasoning mode
│ ├── ConcreteLlamaSharpModelAdapter.cs # LLamaSharp (llama.cpp) GGUF inference adapter;
│ │ # CUDA 12 DLL pre-loading, ggml backend discovery,
│ │ # reasoning-mode-aware chat templating
│ ├── ConcreteOrtGenAiModelAdapter.cs # ORT GenAI in-process inference adapter
│ ├── GgufModelCatalog.cs # GGUF model registry (alias → HuggingFace repo + GPU size)
│ ├── ModelDownloadService.cs # HuggingFace Hub model downloader
│ ├── HardwareProbeService.cs # DXGI VRAM + system RAM detection
│ ├── ModelPromptPolicy.cs # SupportsThinkingMode, NormalizeMode, BuildSystemPrompt,
│ │ # ApplyPromptControls, DetectAliasFromPath
│ ├── ModelSizeSelector.cs # Hardware-budget → alias + context-token selection
│ └── PromptTemplates.cs # Model-neutral per-skill prompt templates + FreeformChat
├── SmrtPad.AI.Tests/ # Unit tests for AI engine components
├── SmrtPad (Package)/ # MSIX packaging project
├── SmrtPad.Tests/
│ ├── EditorTests.cs # ViewModel unit tests
│ ├── IntegrationTests.cs # Helper + service integration tests
│ ├── LocalizationTests.cs # Locale completeness tests
│ └── ResponseCleanerTests.cs # ResponseCleaner unit tests
├── README.md
└── CHANGELOG.md
Ribbon design inspired by UltraPad, a modernized WordPad replacement for Windows 11.
SmrtPad is source-available, not open source, under the PolyForm Noncommercial License 1.0.0.
You may read, build and modify the source for any noncommercial purpose. Commercial use — including redistribution, resale, or publishing to an application store — is reserved to JAD Apps. For a commercial licence, get in touch via jadapps.app.
© 2026 John Donnelly, trading as JAD Apps.
C#
97.7%
PowerShell
2.3%
Native WinUI 3 RTF editor for Windows — ribbon UI, macros, multi-window editing and an on-device AI sidebar. .NET 8.
See the code
Status: released and actively developed · Latest: v0.9.6 · Requires: Windows 10 1809 (build 17763) or later
A modern WordPad-inspired rich text editor built with WinUI 3 and .NET 8, featuring a Microsoft WordPad-style ribbon interface, tabbed documents, macro recording, a full suite of export options, and an on-device AI writing assistant powered by ONNX Runtime GenAI (CUDA/CPU) / Windows AI APIs.
Grab the latest portable build from Releases — unzip and run SmrtPad.exe. Self-contained, so no .NET runtime is needed.
Builds are currently unsigned; Windows SmartScreen will warn on first run. Choose More info → Run anyway if you trust the source.
RichEditBox (RTF and TXT open/save)ScaleTransform — Ctrl+Plus/Minus and Ctrl+Scroll; per-tab zoom level.docx via ZipArchive + XDocumentsmrtdoodle:// protocol; the current selection (if any) is sent as the initial canvas image over a per-session named pipeLauncher.QueryUriSupportAsync; if SmrtDoodle is not installed a dialog offers a Get from Store button that opens the Microsoft Store search for SmrtDoodleSmrtAI.Core library, reused by both apps<think>…</think> tags (including implicit pre-</think> reasoning from phi-4-mini) shown in a collapsible expander labelled "Thinking…"; collapses automatically once reasoning is complete so the response is front and centreComboBox selects the active skill (Summarize, Professional tone, Rewrite for clarity, Grammar fix, Shorten, Complete at cursor); single Apply button dispatches to the correct prompt templateGgufModelCatalog registers 12 local GGUF entries for the LLamaSharp/llama.cpp runner, including Gemma 4, Gemma 3, Phi, Llama and Qwen variants, with Hugging Face repository/file metadata and approximate GPU footprints. ModelSizeSelector separately defines the ONNX GenAI aliases, GPU/CPU footprints and configured Hugging Face source directories. The default AIDispatcherFactory.Create() path is currently wired to gemma-4-e2b with an 8 192-token context; CreateFromLocalPath can load either a local .gguf file or an ONNX GenAI directory containing genai_config.jsonModelSizeSelector.SelectBestAliasAsync and GetBestAliasForCapability scan the hard-coded PreferredAliases list in declaration order and return the first eligible entry that fits the active budget and headroom. They do not search for the largest eligible model. If none fits, the selector falls back to phi-4-miniModelDownloadService acquires configured ONNX GenAI variants from Hugging Face into %LOCALAPPDATA%\SmrtPad\models\<alias>\<gpu|cpu>. If genai_config.json already exists, it accepts and reuses that cached model directory without rechecking file sizes or completeness. During download acquisition, it enumerates source file sizes, skips an existing file only when its byte length matches, and writes other files to .tmp before moving them into place; those per-file size/completion checks apply to acquisition, not as a universal cache-integrity guarantee. Automatic acquisition is available only for aliases and variants present in the selector's Hugging Face source map; catalog metadata by itself is not a download implementation, and the hard-coded Gemma 4 default is not separate proof of an available download source<insert>…</insert> contract across all skills)LicenseOrchestrator and an IStoreContextAdapter seam, with a local Ed25519 license-key fallback. The current dependency-injection registration uses StubStoreContextAdapter rather than a live Store client, and that stub currently returns true; Debug builds also enable Pro flags directly. These development/code paths are not proof of a paid Windows Store entitlement, product SKU or release-time Store integration
Ctrl+Shift+N / Window menu); each window is fully independentSmrtPad.ico) shown in the taskbar, title bar, and Alt-Tab thumbnailSettingsService (JSON at %LOCALAPPDATA%\SmrtPad\settings.json)git clone https://github.com/JAD-Apps/SmrtPad.git
SmrtPad.slnx in Visual Studio 2022 or later.No configuration is required to build. .env.example documents optional local
toggles for the UI-test deploy script and the AI benchmark suite — copy it to
.env (gitignored) only if you need to change them.
dotnet test SmrtPad.Tests\SmrtPad.Tests.csproj -c Debug -p:Platform=x64
dotnet test SmrtPad.AI.Tests\SmrtPad.AI.Tests.csproj -c Debug -p:Platform=x64
SmrtPad includes a local Appium-based benchmark suite for the Smart Sidebar AI models. The benchmark exercises all supported sidebar skills across a curated prompt set, records latency and throughput, applies rule-based scoring, estimates electricity cost, and generates report artifacts for qualitative review.
For models that support reasoning (Qwen3, Phi-4 Mini Reasoning, DeepSeek-R1), each model is benchmarked in both no-thinking and thinking modes. GPU runs execute first (both modes), followed by CPU runs (both modes where applicable).
Build and deploy the packaged SmrtPad (Package) app so the local AUMID is registered.
Install Appium via npm.
Install the Appium Windows driver:
appium driver install --source=npm appium-windows-driver
Install WinAppDriver 1.2.1.
Start the local benchmark infrastructure:
powershell -ExecutionPolicy Bypass -File .\SmrtPad.UITests\Scripts\start-benchmark.ps1
Smoke validation:
dotnet test .\SmrtPad.UITests\SmrtPad.UITests.csproj -c Debug -p:Platform=x64 --filter "FullyQualifiedName=SmrtPad.UITests.Tests.ModelBenchmarkTests.SmokeTest_SinglePrompt"
Full benchmark:
dotnet test .\SmrtPad.UITests\SmrtPad.UITests.csproj -c Debug -p:Platform=x64 --filter "FullyQualifiedName=SmrtPad.UITests.Tests.ModelBenchmarkTests.RunFullBenchmark"
BENCHMARK_MODEL_FILTER — comma-separated model alias filter for subset runs, for example phi-4-mini or phi-4-mini,qwen2.5-1.5bBENCHMARK_GPU_WATTS — GPU power draw override, default 115BENCHMARK_CPU_WATTS — CPU power draw override, default 105BENCHMARK_NPU_WATTS — NPU power draw override, default 15BENCHMARK_ELECTRICITY_RATE — electricity cost in USD per kWh, default 0.12SMRTPAD_BENCHMARK_MODE — set to CPU to skip GPU runs and only execute CPU runs; omit (or set to GPU) for the default GPU-first-then-CPU matrixSMRTPAD_LLAMA_BACKEND_DIR — absolute path to a custom llama.cpp backend directory (must contain llama.dll + ggml.dll); used when the default CUDA 12 build does not support a required model architecture (e.g., Gemma 4)Each benchmark run produces:
benchmark-report-*.md — Markdown summary report (includes Mode column distinguishing Think / NoThink runs)benchmark-dashboard-*.html — static Chart.js live dashboard (per-model series split by reasoning tag)benchmark-results-*.json — raw machine-readable resultsbench-*-responses.jsonl — per-case response log (JSONL)qualitative-assessment-prompt-*.md — prompt for chat-based qualitative reviewArtifacts are written to BenchmarkResults\ at the solution root when discoverable. If the solution root cannot be resolved from the test host, the suite falls back to %TEMP%\SmrtPad-BenchmarkResults\.
The test suite covers:
NewDocument full state resetColorHelper hex parsing (6-digit, 8-digit, error cases)word/document.xml content, paragraph mapping)ModelSizeSelector alias/budget logic, HardwareProbeService VRAM/RAM probing, PromptTemplates output, AIDispatcher skill routing, ResponseCleaner output strippingSmrtPad/
├── SmrtAI.Core/ # Shared AI abstractions and IPC contract (net8.0 library)
│ ├── IAIDispatcher.cs # AI dispatcher interface (shared with SmrtPad.AI)
│ ├── AIDispatcherAvailability.cs # Backend availability DTOs
│ ├── SemanticSearchModels.cs # Semantic search records
│ ├── SmrtDoodleIpcContract.cs # Protocol URI builder and pipe-name helpers
│ └── SmrtDoodleFrame.cs # Length-prefixed JSON frame serializer
├── SmrtPad/
│ ├── Assets/ # App icon (SmrtPad.ico/.png), SmrtDoodle icons
│ ├── Controls/ # SmartSidebar, SidebarChatEntry, SidebarChatTemplateSelector
│ ├── Converters/ # NonEmptyStringToVisibilityConverter
│ ├── Helpers/ # ColorHelper, DocxExportHelper, DocumentImportHelper,
│ │ # DocumentTemplates, MacroHelper, OneDriveHelper,
│ │ # ParagraphStyleHelper, PdfHelper, ResourceHelper,
│ │ # ResponseCleaner, RtfHelper, RulerHelper
│ ├── Models/ # DocumentTemplate
│ ├── Services/ # AIDispatcherProxy, DialogService, FileService,
│ │ # SettingsService, SmrtDoodleIpcService
│ │ # (+ IDialogService, IFileService, ISettingsService)
│ ├── Strings/ # 9 locale .resw files (en-US, de-DE, es-ES, fr-FR,
│ │ # ja-JP, zh-Hans, ar-SA, ru-RU, ur-PK)
│ ├── ViewModels/ # EditorViewModel
│ ├── Views/ # FileBackstageView
│ ├── MainWindow.xaml # Main window with ribbon UI
│ ├── MainWindow.xaml.cs # Code-behind — editor logic, ribbon handlers
│ ├── App.xaml # Application resources and ThemeDictionaries
│ └── App.xaml.cs # Entry point, DI container, multi-window factory
├── SmrtPad.AI/
│ ├── Skills/ # AIRewriteSkill, AutoCompleteSkill, GrammarFixSkill,
│ │ # ShortenSkill, SummarizerSkill, ToneShifterSkill
│ ├── AIDispatcher.cs # Core streaming dispatcher with skill-key routing;
│ │ # exposes PreferredReasoningMode / SetPreferredReasoningMode
│ ├── AIDispatcherFactory.cs # DI factory — hardware probing, model selection;
│ │ # CreateFromLocalPath honours preferred reasoning mode
│ ├── ConcreteLlamaSharpModelAdapter.cs # LLamaSharp (llama.cpp) GGUF inference adapter;
│ │ # CUDA 12 DLL pre-loading, ggml backend discovery,
│ │ # reasoning-mode-aware chat templating
│ ├── ConcreteOrtGenAiModelAdapter.cs # ORT GenAI in-process inference adapter
│ ├── GgufModelCatalog.cs # GGUF model registry (alias → HuggingFace repo + GPU size)
│ ├── ModelDownloadService.cs # HuggingFace Hub model downloader
│ ├── HardwareProbeService.cs # DXGI VRAM + system RAM detection
│ ├── ModelPromptPolicy.cs # SupportsThinkingMode, NormalizeMode, BuildSystemPrompt,
│ │ # ApplyPromptControls, DetectAliasFromPath
│ ├── ModelSizeSelector.cs # Hardware-budget → alias + context-token selection
│ └── PromptTemplates.cs # Model-neutral per-skill prompt templates + FreeformChat
├── SmrtPad.AI.Tests/ # Unit tests for AI engine components
├── SmrtPad (Package)/ # MSIX packaging project
├── SmrtPad.Tests/
│ ├── EditorTests.cs # ViewModel unit tests
│ ├── IntegrationTests.cs # Helper + service integration tests
│ ├── LocalizationTests.cs # Locale completeness tests
│ └── ResponseCleanerTests.cs # ResponseCleaner unit tests
├── README.md
└── CHANGELOG.md
Ribbon design inspired by UltraPad, a modernized WordPad replacement for Windows 11.
SmrtPad is source-available, not open source, under the PolyForm Noncommercial License 1.0.0.
You may read, build and modify the source for any noncommercial purpose. Commercial use — including redistribution, resale, or publishing to an application store — is reserved to JAD Apps. For a commercial licence, get in touch via jadapps.app.
© 2026 John Donnelly, trading as JAD Apps.
C#
97.7%
PowerShell
2.3%