Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Checkup.csproj
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net10.0-windows</TargetFramework><UseWPF>true</UseWPF><UseWindowsForms>true</UseWindowsForms><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><Version>1.1.0</Version><EnableDefaultCompileItems>false</EnableDefaultCompileItems><EnableDefaultPageItems>false</EnableDefaultPageItems><EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition><Product>Checkup</Product><Title>Checkup</Title><Company>informent</Company></PropertyGroup><ItemGroup><Compile Include="App.xaml.cs;MainWindow.xaml.cs;CheckupEngine.cs;SupportBundle.cs"/><ApplicationDefinition Include="App.xaml"/><Page Include="MainWindow.xaml"/><InternalsVisibleTo Include="CheckupEngineTests"/></ItemGroup></Project>
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net10.0-windows</TargetFramework><UseWPF>true</UseWPF><UseWindowsForms>true</UseWindowsForms><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><Version>1.1.1</Version><EnableDefaultCompileItems>false</EnableDefaultCompileItems><EnableDefaultPageItems>false</EnableDefaultPageItems><EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition><Product>Checkup</Product><Title>Checkup</Title><Company>informent</Company></PropertyGroup><ItemGroup><Compile Include="App.xaml.cs;MainWindow.xaml.cs;CheckupEngine.cs;SupportBundle.cs"/><ApplicationDefinition Include="App.xaml"/><Page Include="MainWindow.xaml"/><InternalsVisibleTo Include="CheckupEngineTests"/></ItemGroup></Project>
2 changes: 1 addition & 1 deletion MainWindow.xaml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<Window x:Class="Checkup.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Checkup" Width="1100" Height="720" MinWidth="900" MinHeight="600" Background="{StaticResource Bg}" WindowStartupLocation="CenterScreen"><Grid Margin="34,28"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Grid><StackPanel><TextBlock Text="CHECKUP" Foreground="{StaticResource Accent}" FontSize="12" FontWeight="Bold"/><TextBlock Text="Understand your PC before changing it." FontSize="29" FontWeight="SemiBold" Margin="0,7,0,0"/><TextBlock Text="A transparent Windows health check with reversible repairs." Foreground="{StaticResource Muted}" Margin="0,5,0,0"/></StackPanel><Border HorizontalAlignment="Right" Background="{StaticResource Panel}" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="6" Padding="14,9"><StackPanel><TextBlock Text="READ-ONLY MODE" Foreground="{StaticResource Accent}" FontSize="10" FontWeight="Bold"/><TextBlock Text="Nothing changes without review" Foreground="{StaticResource Text}" Margin="0,3,0,0"/></StackPanel></Border></Grid><Border Grid.Row="1" Background="{StaticResource Panel}" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="7" Padding="20" Margin="0,26,0,20"><Grid><StackPanel><TextBlock Text="SYSTEM CHECK" Foreground="{StaticResource Muted}" FontSize="10" FontWeight="Bold"/><TextBlock x:Name="SummaryText" Text="Ready to inspect this PC" FontSize="20" FontWeight="SemiBold" Margin="0,5,0,0"/><TextBlock x:Name="EvidenceText" Text="Checkup starts with evidence, not guesses." Foreground="{StaticResource Muted}" Margin="0,5,0,0"/></StackPanel><StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center"><Button x:Name="ScanButton" Content="Run system scan" Click="Scan_Click" Background="{StaticResource Accent}" Foreground="#0E201D"/><Button x:Name="ReportButton" Content="Export report" Click="Report_Click" IsEnabled="False"/></StackPanel></Grid></Border><Border Grid.Row="2" Background="{StaticResource Panel}" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="7" Padding="20"><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid><TextBlock Text="FINDINGS" Foreground="{StaticResource Muted}" FontSize="10" FontWeight="Bold"/><TextBlock x:Name="CountText" Text="No scan run yet" HorizontalAlignment="Right" Foreground="{StaticResource Muted}"/></Grid><ListBox x:Name="FindingsList" Grid.Row="1" Margin="0,15,0,0" Background="Transparent" BorderThickness="0"/></Grid></Border><TextBlock Grid.Row="3" Text="Checkup 1.1.0 · MIT licensed · Not affiliated with Microsoft or Windows" Foreground="{StaticResource Muted}" Margin="0,18,0,0"/></Grid></Window>
<Window x:Class="Checkup.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Checkup" Width="1100" Height="720" MinWidth="900" MinHeight="600" Background="{StaticResource Bg}" WindowStartupLocation="CenterScreen"><Grid Margin="34,28"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><Grid><StackPanel><TextBlock Text="CHECKUP" Foreground="{StaticResource Accent}" FontSize="12" FontWeight="Bold"/><TextBlock Text="Understand your PC before changing it." FontSize="29" FontWeight="SemiBold" Margin="0,7,0,0"/><TextBlock Text="A transparent Windows health check with reversible repairs." Foreground="{StaticResource Muted}" Margin="0,5,0,0"/></StackPanel><Border HorizontalAlignment="Right" Background="{StaticResource Panel}" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="6" Padding="14,9"><StackPanel><TextBlock Text="READ-ONLY MODE" Foreground="{StaticResource Accent}" FontSize="10" FontWeight="Bold"/><TextBlock Text="Nothing changes without review" Foreground="{StaticResource Text}" Margin="0,3,0,0"/></StackPanel></Border></Grid><Border Grid.Row="1" Background="{StaticResource Panel}" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="7" Padding="20" Margin="0,26,0,20"><Grid><StackPanel><TextBlock Text="SYSTEM CHECK" Foreground="{StaticResource Muted}" FontSize="10" FontWeight="Bold"/><TextBlock x:Name="SummaryText" Text="Ready to inspect this PC" FontSize="20" FontWeight="SemiBold" Margin="0,5,0,0"/><TextBlock x:Name="EvidenceText" Text="Checkup starts with evidence, not guesses." Foreground="{StaticResource Muted}" Margin="0,5,0,0"/></StackPanel><StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center"><Button x:Name="ScanButton" Content="Run system scan" Click="Scan_Click" Background="{StaticResource Accent}" Foreground="#0E201D"/><Button x:Name="ReportButton" Content="Export report" Click="Report_Click" IsEnabled="False"/></StackPanel></Grid></Border><Border Grid.Row="2" Background="{StaticResource Panel}" BorderBrush="{StaticResource Line}" BorderThickness="1" CornerRadius="7" Padding="20"><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid><TextBlock Text="FINDINGS" Foreground="{StaticResource Muted}" FontSize="10" FontWeight="Bold"/><TextBlock x:Name="CountText" Text="No scan run yet" HorizontalAlignment="Right" Foreground="{StaticResource Muted}"/></Grid><ListBox x:Name="FindingsList" Grid.Row="1" Margin="0,15,0,0" Background="Transparent" BorderThickness="0"/></Grid></Border><TextBlock Grid.Row="3" Text="Checkup 1.1.1 · MIT licensed · Not affiliated with Microsoft or Windows" Foreground="{StaticResource Muted}" Margin="0,18,0,0"/></Grid></Window>
8 changes: 4 additions & 4 deletions MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ public partial class MainWindow : Window
private IReadOnlyList<Finding> findings = Array.Empty<Finding>();
public MainWindow() { InitializeComponent(); if (ScanButton.Parent is System.Windows.Controls.StackPanel oldActions && oldActions.Parent is System.Windows.Controls.Grid grid) { var actions = new System.Windows.Controls.WrapPanel { HorizontalAlignment = System.Windows.HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center, MaxWidth = 410 }; while (oldActions.Children.Count > 0) { var child = oldActions.Children[0]; oldActions.Children.RemoveAt(0); actions.Children.Add(child); } var index = grid.Children.IndexOf(oldActions); grid.Children.RemoveAt(index); grid.Children.Insert(index, actions); AddActionButton(actions, "Enter product key", (_, _) => OpenActivationTool("3")); AddSettingsButton(actions, "Activation settings", "ms-settings:activation"); AddActionButton(actions, "Phone activation", (_, _) => OpenActivationTool("4")); AddSettingsButton(actions, "Storage settings", "ms-settings:storagesense"); AddSettingsButton(actions, "Windows Update", "ms-settings:windowsupdate"); AddSettingsButton(actions, "Network settings", "ms-settings:network-status"); } Opacity = 0; Loaded += (_, _) => BeginAnimation(OpacityProperty, new System.Windows.Media.Animation.DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(260))); }
private void AddActionButton(System.Windows.Controls.Panel panel, string label, RoutedEventHandler handler) { var button = new System.Windows.Controls.Button { Content = label, ToolTip = "Open the official Windows activation workflow", Padding = new Thickness(10, 8, 10, 8) }; button.Click += handler; panel.Children.Add(button); }
private void OpenActivationTool(string mode) { try { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("slui.exe", mode) { UseShellExecute = true }); EvidenceText.Text = mode == "3" ? "Windows product-key activation opened. Enter a valid key to activate this installation." : "Windows phone activation opened. Follow Microsoft’s official instructions."; } catch { OpenSettings("ms-settings:activation"); } }
private void OpenActivationTool(string mode) { try { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("slui.exe", mode) { UseShellExecute = true }); EvidenceText.Text = mode == "3" ? "Windows product-key activation opened. Enter a valid key to activate this installation." : "Windows phone activation opened. Follow Microsoft’s official instructions."; } catch { OpenSettings("ms-settings:activation"); } }
private void AddSettingsButton(System.Windows.Controls.Panel panel, string label, string uri) { var button = new System.Windows.Controls.Button { Content = label, ToolTip = "Open the official Windows settings page", Padding = new Thickness(10, 8, 10, 8) }; button.Click += (_, _) => OpenSettings(uri); panel.Children.Add(button); }
private void OpenSettings(string uri) { try { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(uri) { UseShellExecute = true }); } catch (Exception ex) { EvidenceText.Text = $"Could not open Windows settings: {ex.Message}"; } }
private async void Scan_Click(object sender, RoutedEventArgs e) { ScanButton.IsEnabled = false; SummaryText.Text = "Inspecting system…"; EvidenceText.Text = "Reading evidence without changing settings."; try { findings = await Task.Run(CheckupEngine.Scan); FindingsList.ItemsSource = findings.Select(f => $"{(f.Level == FindingLevel.Good ? "✓" : "!")} {f.Title}\n {f.Explanation}\n Evidence: {f.Evidence}").ToArray(); var attention = findings.Count(f => f.Level != FindingLevel.Good); SummaryText.Text = attention == 0 ? "Your system looks healthy" : $"{attention} item(s) need review"; CountText.Text = $"{findings.Count} checks · {attention} requiring attention"; EvidenceText.Text = "Scan complete · no changes were applied."; ReportButton.IsEnabled = true; } catch (Exception ex) { SummaryText.Text = "Scan could not complete"; EvidenceText.Text = ex.Message; } finally { ScanButton.IsEnabled = true; } }
private void Report_Click(object sender, RoutedEventArgs e) { if (findings.Count == 0) return; using var dialog = new System.Windows.Forms.SaveFileDialog { Filter = "Checkup support bundle (*.zip)|*.zip", FileName = $"openfix-support-{DateTime.Now:yyyyMMdd-HHmm}.zip" }; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { var result = SupportBundle.Export(dialog.FileName, findings); EvidenceText.Text = $"Support bundle saved · {result.SizeBytes / 1024d:0.0} KB · SHA-256 {result.Sha256[..12]}…"; } catch (Exception ex) { EvidenceText.Text = $"Could not export support bundle: {ex.Message}"; } } }
private async void Scan_Click(object sender, RoutedEventArgs e) { ScanButton.IsEnabled = false; SummaryText.Text = "Inspecting system…"; EvidenceText.Text = "Reading evidence without changing settings."; try { findings = await Task.Run(CheckupEngine.Scan); FindingsList.ItemsSource = findings.Select(f => $"{(f.Level == FindingLevel.Good ? "✓" : "!")} {f.Title}\n {f.Explanation}\n Evidence: {f.Evidence}").ToArray(); var attention = findings.Count(f => f.Level != FindingLevel.Good); SummaryText.Text = attention == 0 ? "Your system looks healthy" : $"{attention} item(s) need review"; CountText.Text = $"{findings.Count} checks · {attention} requiring attention"; EvidenceText.Text = "Scan complete · no changes were applied."; ReportButton.IsEnabled = true; } catch (Exception ex) { SummaryText.Text = "Scan could not complete"; EvidenceText.Text = ex.Message; } finally { ScanButton.IsEnabled = true; } }
private void Report_Click(object sender, RoutedEventArgs e) { if (findings.Count == 0) return; using var dialog = new System.Windows.Forms.SaveFileDialog { Filter = "Checkup support bundle (*.zip)|*.zip", FileName = $"openfix-support-{DateTime.Now:yyyyMMdd-HHmm}.zip" }; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { try { var result = SupportBundle.Export(dialog.FileName, findings); EvidenceText.Text = $"Support bundle saved · {result.SizeBytes / 1024d:0.0} KB · SHA-256 {result.Sha256[..12]}…"; } catch (Exception ex) { EvidenceText.Text = $"Could not export support bundle: {ex.Message}"; } } }
protected override void OnContentRendered(EventArgs e) { base.OnContentRendered(e); UpdateVersionLabel(this); }
private static void UpdateVersionLabel(System.Windows.DependencyObject parent)
{
for (var i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i);
if (child is System.Windows.Controls.TextBlock text && text.Text.StartsWith("Checkup 0.1.0", StringComparison.Ordinal)) text.Text = "Checkup 1.1.0 · MIT licensed · Not affiliated with Microsoft or Windows";
if (child is System.Windows.Controls.TextBlock text && text.Text.StartsWith("Checkup 0.1.0", StringComparison.Ordinal)) text.Text = "Checkup 1.1.1 · MIT licensed · Not affiliated with Microsoft or Windows";
UpdateVersionLabel(child);
}
}
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Checkup is a read-only-first Windows health and troubleshooting tool.

It scans for useful evidence: system-drive space, temporary-file growth, network availability, startup inventory, activation status, and scan safety. It then explains what it found in plain language and calculates a transparent 0–100 health score.
It scans for useful evidence: system-drive space, temporary-file growth, network availability, startup inventory, activation status, and scan safety. It then explains what it found in plain language and calculates a transparent 0–100 health score.

## Support bundles

Expand Down Expand Up @@ -38,12 +38,12 @@ Checkup replaces OpenFix. New builds use Checkup.exe and Checkup.csproj. Existin

Windows setup packages install Checkup for your current account, bundle the .NET runtime, create a Start menu shortcut and register an uninstaller. A desktop shortcut is optional. No administrator password or manual file copying is required. Existing settings and saved data stay in their current locations. The portable ZIP remains available.

Installer builds are being validated in the **Automatic setup** workflow. Once published, download `Checkup-vVERSION-setup.exe` from Releases and run it.
Download `Checkup-v1.1.1-setup.exe` from Releases and run it.

For unattended deployment:

```powershell
Start-Process .\Checkup-vVERSION-setup.exe -ArgumentList '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-' -Wait -PassThru
Start-Process .\Checkup-v1.1.1-setup.exe -ArgumentList '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-' -Wait -PassThru
```

Build from source with the [open-source Inno Setup compiler](https://github.com/jrsoftware/issrc) installed:
Expand Down