Compare commits
3 commits
17c6b27bfe
...
c356c1d4c5
| Author | SHA1 | Date | |
|---|---|---|---|
| c356c1d4c5 | |||
| d7c41f07fe | |||
| 42472ee024 |
29 changed files with 2289 additions and 36 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -8,7 +8,9 @@ pnpm-debug.log*
|
||||||
lerna-debug.log*
|
lerna-debug.log*
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
dist
|
# dist/ was previously generated by Vite; now it holds the static UI (dist/index.html).
|
||||||
|
# Ignore generated assets but track the hand-crafted index.html.
|
||||||
|
dist/assets/
|
||||||
dist-ssr
|
dist-ssr
|
||||||
*.local
|
*.local
|
||||||
|
|
||||||
|
|
|
||||||
753
dist/index.html
vendored
Normal file
753
dist/index.html
vendored
Normal file
|
|
@ -0,0 +1,753 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Robin</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: #0f172a;
|
||||||
|
--surface: #1e293b;
|
||||||
|
--surface2: #334155;
|
||||||
|
--border: #475569;
|
||||||
|
--text: #f1f5f9;
|
||||||
|
--muted: #94a3b8;
|
||||||
|
--accent: #f97316;
|
||||||
|
--accent-bg: #1c0a00;
|
||||||
|
--info: #3b82f6;
|
||||||
|
--success: #22c55e;
|
||||||
|
--warning: #f59e0b;
|
||||||
|
--error: #ef4444;
|
||||||
|
--radius: 6px;
|
||||||
|
--font: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
||||||
|
--mono: 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
|
||||||
|
}
|
||||||
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||||
|
html, body {
|
||||||
|
height: 100%; background: var(--bg); color: var(--text);
|
||||||
|
font-family: var(--font); font-size: 14px; line-height: 1.5; overflow: hidden;
|
||||||
|
}
|
||||||
|
#app { display: flex; flex-direction: column; height: 100vh; }
|
||||||
|
|
||||||
|
header {
|
||||||
|
display: flex; align-items: center; gap: 8px;
|
||||||
|
padding: 10px 14px; background: var(--surface);
|
||||||
|
border-bottom: 1px solid var(--border); flex-shrink: 0; user-select: none;
|
||||||
|
}
|
||||||
|
header .logo { font-size: 18px; line-height: 1; }
|
||||||
|
header h1 { font-size: 15px; font-weight: 600; color: var(--text); flex: 1; }
|
||||||
|
.status-dot {
|
||||||
|
width: 8px; height: 8px; border-radius: 50%;
|
||||||
|
background: var(--muted); flex-shrink: 0; transition: background 0.3s;
|
||||||
|
}
|
||||||
|
.status-dot.ok { background: var(--success); }
|
||||||
|
.status-dot.warn { background: var(--warning); }
|
||||||
|
.status-dot.error { background: var(--error); }
|
||||||
|
.status-label { font-size: 11px; color: var(--muted); }
|
||||||
|
|
||||||
|
.tabs {
|
||||||
|
display: flex; background: var(--surface);
|
||||||
|
border-bottom: 1px solid var(--border); flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.tab-btn {
|
||||||
|
padding: 7px 14px; background: none;
|
||||||
|
border: none; border-bottom: 2px solid transparent;
|
||||||
|
color: var(--muted); cursor: pointer; font-size: 13px;
|
||||||
|
font-family: var(--font); transition: color 0.15s, border-color 0.15s;
|
||||||
|
display: flex; align-items: center; gap: 5px;
|
||||||
|
}
|
||||||
|
.tab-btn:hover { color: var(--text); }
|
||||||
|
.tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }
|
||||||
|
.badge {
|
||||||
|
display: inline-flex; align-items: center; justify-content: center;
|
||||||
|
background: var(--accent); color: #fff; font-size: 10px; font-weight: 700;
|
||||||
|
border-radius: 999px; min-width: 16px; height: 16px; padding: 0 4px; line-height: 1;
|
||||||
|
}
|
||||||
|
.badge.hidden { display: none; }
|
||||||
|
|
||||||
|
.pane { display: none; flex-direction: column; flex: 1; overflow: hidden; min-height: 0; }
|
||||||
|
.pane.active { display: flex; }
|
||||||
|
|
||||||
|
#onboarding {
|
||||||
|
flex: 1; display: flex; flex-direction: column;
|
||||||
|
align-items: center; justify-content: flex-start;
|
||||||
|
padding: 24px 20px; gap: 14px; text-align: center; overflow-y: auto;
|
||||||
|
}
|
||||||
|
#onboarding.hidden { display: none; }
|
||||||
|
#onboarding .bird { font-size: 48px; line-height: 1; }
|
||||||
|
#onboarding h2 { font-size: 18px; font-weight: 600; }
|
||||||
|
#onboarding p { font-size: 13px; color: var(--muted); max-width: 300px; }
|
||||||
|
.form-group { width: 100%; max-width: 320px; text-align: left; }
|
||||||
|
.form-group label {
|
||||||
|
display: block; font-size: 12px; color: var(--muted);
|
||||||
|
margin-bottom: 4px; text-transform: uppercase; letter-spacing: 0.05em;
|
||||||
|
}
|
||||||
|
.form-group select, .form-group input {
|
||||||
|
width: 100%; padding: 8px 10px; background: var(--surface2);
|
||||||
|
border: 1px solid var(--border); border-radius: var(--radius);
|
||||||
|
color: var(--text); font-size: 13px; font-family: var(--font);
|
||||||
|
outline: none; transition: border-color 0.15s;
|
||||||
|
}
|
||||||
|
.form-group select:focus, .form-group input:focus { border-color: var(--accent); }
|
||||||
|
.form-group select option { background: var(--surface2); }
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
padding: 8px 16px; border-radius: var(--radius); border: none;
|
||||||
|
font-size: 13px; font-family: var(--font); font-weight: 500;
|
||||||
|
cursor: pointer; transition: opacity 0.15s;
|
||||||
|
}
|
||||||
|
.btn:hover { opacity: 0.85; } .btn:active { opacity: 0.7; }
|
||||||
|
.btn:disabled { opacity: 0.4; cursor: not-allowed; }
|
||||||
|
.btn-primary { background: var(--accent); color: #fff; }
|
||||||
|
.btn-ghost { background: transparent; border: 1px solid var(--border); color: var(--muted); }
|
||||||
|
.btn-ghost:hover { color: var(--text); border-color: var(--text); }
|
||||||
|
.btn-icon {
|
||||||
|
width: 34px; height: 34px; padding: 0; display: flex;
|
||||||
|
align-items: center; justify-content: center; font-size: 16px;
|
||||||
|
background: var(--accent); color: #fff; border-radius: var(--radius);
|
||||||
|
border: none; cursor: pointer; flex-shrink: 0; transition: opacity 0.15s;
|
||||||
|
}
|
||||||
|
.btn-icon:hover { opacity: 0.85; } .btn-icon:active { opacity: 0.7; }
|
||||||
|
.btn-icon:disabled { opacity: 0.4; cursor: not-allowed; }
|
||||||
|
|
||||||
|
#messages {
|
||||||
|
flex: 1; overflow-y: auto; padding: 12px;
|
||||||
|
display: flex; flex-direction: column; gap: 10px; min-height: 0;
|
||||||
|
}
|
||||||
|
#messages::-webkit-scrollbar { width: 4px; }
|
||||||
|
#messages::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
|
||||||
|
.msg {
|
||||||
|
max-width: 90%; padding: 8px 12px; border-radius: var(--radius);
|
||||||
|
font-size: 13px; line-height: 1.55; word-break: break-word;
|
||||||
|
}
|
||||||
|
.msg.user {
|
||||||
|
background: var(--accent-bg); border: 1px solid var(--accent);
|
||||||
|
align-self: flex-end;
|
||||||
|
}
|
||||||
|
.msg.assistant {
|
||||||
|
background: var(--surface); border: 1px solid var(--border);
|
||||||
|
align-self: flex-start;
|
||||||
|
}
|
||||||
|
.msg.assistant pre {
|
||||||
|
background: var(--surface2); padding: 8px 10px; border-radius: 4px;
|
||||||
|
font-family: var(--mono); font-size: 12px;
|
||||||
|
overflow-x: auto; margin: 6px 0; white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
.msg.assistant code {
|
||||||
|
background: var(--surface2); padding: 1px 4px;
|
||||||
|
border-radius: 3px; font-family: var(--mono); font-size: 12px;
|
||||||
|
}
|
||||||
|
.msg-role {
|
||||||
|
font-size: 10px; color: var(--muted);
|
||||||
|
text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
.msg.user .msg-role { color: var(--accent); }
|
||||||
|
.msg.system-msg {
|
||||||
|
background: transparent; border: 1px dashed var(--border);
|
||||||
|
align-self: center; color: var(--muted);
|
||||||
|
font-size: 12px; max-width: 100%; text-align: center;
|
||||||
|
}
|
||||||
|
.typing-cursor {
|
||||||
|
display: inline-block; width: 7px; height: 13px;
|
||||||
|
background: var(--accent); border-radius: 1px;
|
||||||
|
vertical-align: middle; animation: blink 0.9s step-end infinite; margin-left: 2px;
|
||||||
|
}
|
||||||
|
@keyframes blink { 50% { opacity: 0; } }
|
||||||
|
.chat-input-row {
|
||||||
|
display: flex; gap: 8px; padding: 10px 12px;
|
||||||
|
border-top: 1px solid var(--border);
|
||||||
|
background: var(--surface); flex-shrink: 0; align-items: flex-end;
|
||||||
|
}
|
||||||
|
#chat-input {
|
||||||
|
flex: 1; padding: 8px 10px; background: var(--surface2);
|
||||||
|
border: 1px solid var(--border); border-radius: var(--radius);
|
||||||
|
color: var(--text); font-size: 13px; font-family: var(--font);
|
||||||
|
resize: none; outline: none; line-height: 1.4;
|
||||||
|
max-height: 100px; overflow-y: auto; transition: border-color 0.15s;
|
||||||
|
}
|
||||||
|
#chat-input:focus { border-color: var(--accent); }
|
||||||
|
#chat-input::placeholder { color: var(--muted); }
|
||||||
|
|
||||||
|
#events-list {
|
||||||
|
flex: 1; overflow-y: auto; padding: 10px;
|
||||||
|
display: flex; flex-direction: column; gap: 8px; min-height: 0;
|
||||||
|
}
|
||||||
|
#events-list::-webkit-scrollbar { width: 4px; }
|
||||||
|
#events-list::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
|
||||||
|
.event-card {
|
||||||
|
padding: 10px 12px; background: var(--surface);
|
||||||
|
border: 1px solid var(--border); border-radius: var(--radius);
|
||||||
|
border-left: 3px solid var(--muted);
|
||||||
|
}
|
||||||
|
.event-card.severity-warn { border-left-color: var(--warning); }
|
||||||
|
.event-card.severity-crit { border-left-color: var(--error); }
|
||||||
|
.event-card.severity-info { border-left-color: var(--info); }
|
||||||
|
.event-card-header { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
|
||||||
|
.event-title { font-size: 13px; font-weight: 600; flex: 1; }
|
||||||
|
.severity-badge {
|
||||||
|
font-size: 10px; font-weight: 700; text-transform: uppercase;
|
||||||
|
padding: 2px 6px; border-radius: 3px; letter-spacing: 0.04em;
|
||||||
|
}
|
||||||
|
.severity-badge.warn { background: #422006; color: var(--warning); }
|
||||||
|
.severity-badge.crit { background: #450a0a; color: var(--error); }
|
||||||
|
.severity-badge.info { background: #0c1a3a; color: var(--info); }
|
||||||
|
.event-body { font-size: 12px; color: var(--muted); margin-bottom: 4px; }
|
||||||
|
.event-meta { font-size: 11px; color: var(--border); font-family: var(--mono); }
|
||||||
|
.events-toolbar {
|
||||||
|
display: flex; align-items: center; gap: 8px; padding: 8px 10px;
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
background: var(--surface); flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.events-toolbar span { flex: 1; font-size: 12px; color: var(--muted); }
|
||||||
|
.empty-state {
|
||||||
|
flex: 1; display: flex; flex-direction: column;
|
||||||
|
align-items: center; justify-content: center;
|
||||||
|
gap: 8px; color: var(--muted); font-size: 13px; padding: 24px; text-align: center;
|
||||||
|
}
|
||||||
|
.empty-state .icon { font-size: 32px; opacity: 0.4; }
|
||||||
|
|
||||||
|
#pane-debug {
|
||||||
|
flex: 1; overflow-y: auto; padding: 12px;
|
||||||
|
display: flex; flex-direction: column; gap: 12px; min-height: 0;
|
||||||
|
}
|
||||||
|
#pane-debug::-webkit-scrollbar { width: 4px; }
|
||||||
|
#pane-debug::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
|
||||||
|
.debug-section {
|
||||||
|
background: var(--surface); border: 1px solid var(--border);
|
||||||
|
border-radius: var(--radius); overflow: hidden;
|
||||||
|
}
|
||||||
|
.debug-section-header {
|
||||||
|
padding: 8px 12px; font-size: 11px; font-weight: 600;
|
||||||
|
text-transform: uppercase; letter-spacing: 0.07em;
|
||||||
|
color: var(--muted); background: var(--surface2);
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
.debug-rows { padding: 8px 0; }
|
||||||
|
.debug-row { display: flex; align-items: center; padding: 5px 12px; gap: 8px; font-size: 12px; }
|
||||||
|
.debug-row .key { width: 130px; flex-shrink: 0; color: var(--muted); }
|
||||||
|
.debug-row .val { color: var(--text); font-family: var(--mono); font-size: 12px; word-break: break-all; }
|
||||||
|
.debug-row .val.ok { color: var(--success); }
|
||||||
|
.debug-row .val.warn { color: var(--warning); }
|
||||||
|
.debug-row .val.err { color: var(--error); }
|
||||||
|
.notif-select {
|
||||||
|
background: var(--surface2); border: 1px solid var(--border); border-radius: 4px;
|
||||||
|
color: var(--text); font-size: 12px; font-family: var(--font);
|
||||||
|
padding: 2px 6px; outline: none; cursor: pointer;
|
||||||
|
}
|
||||||
|
.notif-select:focus { border-color: var(--accent); }
|
||||||
|
.notif-select option { background: var(--surface2); }
|
||||||
|
.hidden { display: none !important; }
|
||||||
|
.scroll-anchor { height: 1px; flex-shrink: 0; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app">
|
||||||
|
<header>
|
||||||
|
<span class="logo">🐦</span>
|
||||||
|
<h1>Robin</h1>
|
||||||
|
<span class="status-label" id="status-label">connecting…</span>
|
||||||
|
<span class="status-dot" id="status-dot"></span>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div id="onboarding">
|
||||||
|
<div class="bird">🐦</div>
|
||||||
|
<h2>Welcome to Robin</h2>
|
||||||
|
<p>Set up your migration profile so Robin can give you personalised help.</p>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="src-os">Coming from</label>
|
||||||
|
<select id="src-os">
|
||||||
|
<option value="macos">macOS</option>
|
||||||
|
<option value="windows" selected>Windows</option>
|
||||||
|
<option value="linux">Linux (different distro)</option>
|
||||||
|
<option value="android">Android</option>
|
||||||
|
<option value="ipad">iPad / iOS</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="distro">Your Linux distro (blank to auto-detect)</label>
|
||||||
|
<input type="text" id="distro" placeholder="e.g. linuxmint, ubuntu, arch" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="dual-boot">Dual-booting with (optional)</label>
|
||||||
|
<select id="dual-boot">
|
||||||
|
<option value="">None</option>
|
||||||
|
<option value="windows">Windows</option>
|
||||||
|
<option value="macos">macOS</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary" id="onboarding-save" style="width:100%;max-width:320px">Get started</button>
|
||||||
|
<p id="onboarding-error" class="hidden" style="color:var(--error);font-size:12px"></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tabs hidden" id="tabs">
|
||||||
|
<button class="tab-btn active" data-tab="chat">Chat</button>
|
||||||
|
<button class="tab-btn" data-tab="events">Events <span class="badge hidden" id="events-badge">0</span></button>
|
||||||
|
<button class="tab-btn" data-tab="debug">Debug</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pane active" id="pane-chat">
|
||||||
|
<div id="messages">
|
||||||
|
<div class="msg system-msg" id="welcome-msg">Robin is watching your system logs. Ask me anything about Linux!</div>
|
||||||
|
<div class="scroll-anchor" id="chat-bottom"></div>
|
||||||
|
</div>
|
||||||
|
<div class="chat-input-row">
|
||||||
|
<textarea id="chat-input" rows="1" placeholder="Ask Robin… (Enter to send, Shift+Enter for newline)" aria-label="Chat message"></textarea>
|
||||||
|
<button class="btn-icon" id="send-btn" title="Send (Enter)" aria-label="Send">▶</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pane" id="pane-events">
|
||||||
|
<div class="events-toolbar">
|
||||||
|
<span id="events-count">No events yet</span>
|
||||||
|
<button class="btn btn-ghost" id="clear-events-btn" style="font-size:12px;padding:4px 10px">Clear</button>
|
||||||
|
</div>
|
||||||
|
<div id="events-list">
|
||||||
|
<div class="empty-state" id="events-empty">
|
||||||
|
<span class="icon">📋</span>
|
||||||
|
<span>No system events matched yet.<br>Robin is watching your logs.</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pane" id="pane-debug">
|
||||||
|
<div class="debug-section">
|
||||||
|
<div class="debug-section-header">Migration Profile</div>
|
||||||
|
<div class="debug-rows">
|
||||||
|
<div class="debug-row"><span class="key">Source OS</span><span class="val" id="dbg-source-os">—</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Distro</span><span class="val" id="dbg-distro">—</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Distro family</span><span class="val" id="dbg-distro-family">—</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Dual boot</span><span class="val" id="dbg-dual-boot">none</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Fluency level</span><span class="val" id="dbg-fluency">0 / 5</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="debug-section">
|
||||||
|
<div class="debug-section-header">LLM Config</div>
|
||||||
|
<div class="debug-rows">
|
||||||
|
<div class="debug-row"><span class="key">Ollama URL</span><span class="val" id="dbg-ollama-url">—</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Model</span><span class="val" id="dbg-ollama-model">—</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Connection</span><span class="val" id="dbg-ollama-status">—</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="debug-section">
|
||||||
|
<div class="debug-section-header">Notifications</div>
|
||||||
|
<div class="debug-rows">
|
||||||
|
<div class="debug-row">
|
||||||
|
<span class="key">Level</span>
|
||||||
|
<select class="notif-select" id="notif-level-select" aria-label="Notification level">
|
||||||
|
<option value="off">Off</option>
|
||||||
|
<option value="badge_only">Badge only</option>
|
||||||
|
<option value="badge_and_toast">Badge + toast</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="debug-section">
|
||||||
|
<div class="debug-section-header">App Info</div>
|
||||||
|
<div class="debug-rows">
|
||||||
|
<div class="debug-row"><span class="key">Tier</span><span class="val" id="dbg-tier">free</span></div>
|
||||||
|
<div class="debug-row"><span class="key">Events captured</span><span class="val" id="dbg-event-count">0</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="debug-section">
|
||||||
|
<div class="debug-section-header">Profile</div>
|
||||||
|
<div class="debug-rows">
|
||||||
|
<div class="debug-row">
|
||||||
|
<button class="btn btn-ghost" id="reset-onboarding-btn" style="font-size:12px;padding:4px 10px">Change migration profile…</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
"use strict";
|
||||||
|
/* Robin frontend -- vanilla JS, Tauri 2 IPC (withGlobalTauri: true)
|
||||||
|
No build step, no npm, no Node required.
|
||||||
|
|
||||||
|
Security note: All user-supplied and LLM-supplied text goes through
|
||||||
|
setTextContent() / DOM text nodes rather than innerHTML.
|
||||||
|
The chat markdown renderer builds the DOM tree element-by-element so
|
||||||
|
no unsanitised HTML is ever passed to innerHTML.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var _invoke = null;
|
||||||
|
var _listen = null;
|
||||||
|
|
||||||
|
// State
|
||||||
|
var currentConfig = null;
|
||||||
|
var streamBuf = '';
|
||||||
|
var streamMsgEl = null;
|
||||||
|
var isSending = false;
|
||||||
|
var eventCount = 0;
|
||||||
|
var newEventCount = 0;
|
||||||
|
|
||||||
|
function $(id) { return document.getElementById(id); }
|
||||||
|
|
||||||
|
// ── DOM refs
|
||||||
|
var statusDot = $('status-dot');
|
||||||
|
var statusLabel = $('status-label');
|
||||||
|
var onboardingEl = $('onboarding');
|
||||||
|
var tabsEl = $('tabs');
|
||||||
|
var messagesEl = $('messages');
|
||||||
|
var chatBottom = $('chat-bottom');
|
||||||
|
var chatInput = $('chat-input');
|
||||||
|
var sendBtn = $('send-btn');
|
||||||
|
var eventsList = $('events-list');
|
||||||
|
var eventsEmpty = $('events-empty');
|
||||||
|
var eventsCountEl = $('events-count');
|
||||||
|
var eventsBadge = $('events-badge');
|
||||||
|
var onbError = $('onboarding-error');
|
||||||
|
var dbgEventCount = $('dbg-event-count');
|
||||||
|
|
||||||
|
// ── Status
|
||||||
|
function setStatus(state, label) {
|
||||||
|
statusDot.className = 'status-dot ' + state;
|
||||||
|
statusLabel.textContent = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Timestamp
|
||||||
|
function fmtTs(ts) {
|
||||||
|
if (!ts) return '';
|
||||||
|
var d = new Date(ts * 1000);
|
||||||
|
var p = function(n) { return String(n).padStart(2,'0'); };
|
||||||
|
return p(d.getHours()) + ':' + p(d.getMinutes()) + ':' + p(d.getSeconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Scroll
|
||||||
|
function scrollBottom() { chatBottom.scrollIntoView({ behavior: 'smooth' }); }
|
||||||
|
|
||||||
|
// ── Tabs
|
||||||
|
document.querySelectorAll('.tab-btn').forEach(function(btn) {
|
||||||
|
btn.addEventListener('click', function() {
|
||||||
|
var tab = btn.dataset.tab;
|
||||||
|
document.querySelectorAll('.tab-btn').forEach(function(b) { b.classList.remove('active'); });
|
||||||
|
document.querySelectorAll('.pane').forEach(function(p) { p.classList.remove('active'); });
|
||||||
|
btn.classList.add('active');
|
||||||
|
$('pane-' + tab).classList.add('active');
|
||||||
|
if (tab === 'chat') {
|
||||||
|
if (_invoke) _invoke('panel_opened').catch(function(){});
|
||||||
|
clearBadge(); scrollBottom();
|
||||||
|
} else {
|
||||||
|
if (_invoke) _invoke('panel_closed').catch(function(){});
|
||||||
|
if (tab === 'events') clearBadge();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// ── Badge
|
||||||
|
function bumpBadge() {
|
||||||
|
newEventCount++;
|
||||||
|
var chatActive = document.querySelector('[data-tab="chat"]').classList.contains('active');
|
||||||
|
if (!chatActive) {
|
||||||
|
eventsBadge.textContent = newEventCount > 99 ? '99+' : String(newEventCount);
|
||||||
|
eventsBadge.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function clearBadge() { newEventCount = 0; eventsBadge.classList.add('hidden'); }
|
||||||
|
|
||||||
|
// ── Event cards -- built with DOM methods; no innerHTML for user data
|
||||||
|
function addEventCard(ev) {
|
||||||
|
eventsEmpty.classList.add('hidden');
|
||||||
|
var sev = (ev.severity || 'info').toLowerCase();
|
||||||
|
|
||||||
|
var card = document.createElement('div');
|
||||||
|
card.className = 'event-card severity-' + sev;
|
||||||
|
|
||||||
|
var header = document.createElement('div');
|
||||||
|
header.className = 'event-card-header';
|
||||||
|
|
||||||
|
var titleEl = document.createElement('span');
|
||||||
|
titleEl.className = 'event-title';
|
||||||
|
titleEl.textContent = ev.title; // textContent: safe
|
||||||
|
|
||||||
|
var sevBadge = document.createElement('span');
|
||||||
|
sevBadge.className = 'severity-badge ' + sev;
|
||||||
|
sevBadge.textContent = sev; // textContent: safe
|
||||||
|
|
||||||
|
header.appendChild(titleEl);
|
||||||
|
header.appendChild(sevBadge);
|
||||||
|
|
||||||
|
var bodyEl = document.createElement('div');
|
||||||
|
bodyEl.className = 'event-body';
|
||||||
|
bodyEl.textContent = ev.body; // textContent: safe
|
||||||
|
|
||||||
|
var metaEl = document.createElement('div');
|
||||||
|
metaEl.className = 'event-meta';
|
||||||
|
metaEl.textContent = ev.pattern_id + ' \xB7 ' + fmtTs(ev.timestamp); // textContent: safe
|
||||||
|
|
||||||
|
card.appendChild(header);
|
||||||
|
card.appendChild(bodyEl);
|
||||||
|
card.appendChild(metaEl);
|
||||||
|
|
||||||
|
var first = eventsList.querySelector('.event-card');
|
||||||
|
if (first) { eventsList.insertBefore(card, first); } else { eventsList.appendChild(card); }
|
||||||
|
|
||||||
|
eventCount++;
|
||||||
|
dbgEventCount.textContent = String(eventCount);
|
||||||
|
eventsCountEl.textContent = eventCount + ' event' + (eventCount !== 1 ? 's' : '');
|
||||||
|
bumpBadge();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Chat: add a bubble
|
||||||
|
function addMsg(role, text) {
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.className = 'msg ' + role;
|
||||||
|
if (role !== 'system-msg') {
|
||||||
|
var lbl = document.createElement('div');
|
||||||
|
lbl.className = 'msg-role';
|
||||||
|
lbl.textContent = role === 'user' ? 'You' : 'Robin';
|
||||||
|
div.appendChild(lbl);
|
||||||
|
}
|
||||||
|
var body = document.createElement('div');
|
||||||
|
body.className = 'msg-content';
|
||||||
|
if (role === 'system-msg') {
|
||||||
|
body.textContent = text; // textContent: safe
|
||||||
|
} else if (role === 'user') {
|
||||||
|
body.textContent = text; // user text: no formatting needed
|
||||||
|
} else {
|
||||||
|
renderMdInto(body, text); // markdown renderer builds DOM nodes
|
||||||
|
}
|
||||||
|
div.appendChild(body);
|
||||||
|
messagesEl.insertBefore(div, chatBottom);
|
||||||
|
scrollBottom();
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Markdown renderer: builds DOM nodes, never assigns innerHTML with user data
|
||||||
|
// Supports: ```code blocks``` and `inline code`. All other text is text nodes.
|
||||||
|
function renderMdInto(container, text) {
|
||||||
|
// Split on fenced code blocks
|
||||||
|
var parts = text.split(/(```[\s\S]*?```)/g);
|
||||||
|
parts.forEach(function(part) {
|
||||||
|
if (part.startsWith('```')) {
|
||||||
|
var code = part.slice(3, -3).replace(/^\n/, '');
|
||||||
|
var pre = document.createElement('pre');
|
||||||
|
var codeEl = document.createElement('code');
|
||||||
|
codeEl.textContent = code; // textContent: safe, displays < > & correctly
|
||||||
|
pre.appendChild(codeEl);
|
||||||
|
container.appendChild(pre);
|
||||||
|
} else {
|
||||||
|
// Handle inline code within this segment
|
||||||
|
var inlineParts = part.split(/(`[^`\n]+`)/g);
|
||||||
|
inlineParts.forEach(function(seg) {
|
||||||
|
if (seg.startsWith('`') && seg.endsWith('`') && seg.length > 2) {
|
||||||
|
var codeEl = document.createElement('code');
|
||||||
|
codeEl.textContent = seg.slice(1, -1); // textContent: safe
|
||||||
|
container.appendChild(codeEl);
|
||||||
|
} else {
|
||||||
|
// Plain text: convert newlines to <br> using text nodes + br elements
|
||||||
|
var lines = seg.split('\n');
|
||||||
|
lines.forEach(function(line, i) {
|
||||||
|
container.appendChild(document.createTextNode(line));
|
||||||
|
if (i < lines.length - 1) container.appendChild(document.createElement('br'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Streaming
|
||||||
|
function startStream() {
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.className = 'msg assistant';
|
||||||
|
var lbl = document.createElement('div');
|
||||||
|
lbl.className = 'msg-role';
|
||||||
|
lbl.textContent = 'Robin';
|
||||||
|
div.appendChild(lbl);
|
||||||
|
var body = document.createElement('div');
|
||||||
|
body.className = 'msg-content';
|
||||||
|
var cursor = document.createElement('span');
|
||||||
|
cursor.className = 'typing-cursor';
|
||||||
|
body.appendChild(cursor);
|
||||||
|
div.appendChild(body);
|
||||||
|
messagesEl.insertBefore(div, chatBottom);
|
||||||
|
streamMsgEl = div;
|
||||||
|
streamBuf = '';
|
||||||
|
scrollBottom();
|
||||||
|
}
|
||||||
|
|
||||||
|
function appendToken(token) {
|
||||||
|
if (!streamMsgEl) startStream();
|
||||||
|
streamBuf += token;
|
||||||
|
// Rebuild the content node from scratch on each token.
|
||||||
|
// This is simple and correct; for very long responses it could be optimised
|
||||||
|
// by appending incrementally, but correctness wins here.
|
||||||
|
var body = streamMsgEl.querySelector('.msg-content');
|
||||||
|
while (body.firstChild) body.removeChild(body.firstChild);
|
||||||
|
renderMdInto(body, streamBuf);
|
||||||
|
var cursor = document.createElement('span');
|
||||||
|
cursor.className = 'typing-cursor';
|
||||||
|
body.appendChild(cursor);
|
||||||
|
scrollBottom();
|
||||||
|
}
|
||||||
|
|
||||||
|
function endStream() {
|
||||||
|
if (!streamMsgEl) return;
|
||||||
|
var body = streamMsgEl.querySelector('.msg-content');
|
||||||
|
while (body.firstChild) body.removeChild(body.firstChild);
|
||||||
|
renderMdInto(body, streamBuf);
|
||||||
|
streamMsgEl = null; streamBuf = '';
|
||||||
|
isSending = false;
|
||||||
|
sendBtn.disabled = false;
|
||||||
|
chatInput.disabled = false;
|
||||||
|
chatInput.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Send
|
||||||
|
async function sendMessage() {
|
||||||
|
var text = chatInput.value.trim();
|
||||||
|
if (!text || isSending || !_invoke) return;
|
||||||
|
isSending = true;
|
||||||
|
sendBtn.disabled = true; chatInput.disabled = true;
|
||||||
|
chatInput.value = ''; chatInput.style.height = 'auto';
|
||||||
|
addMsg('user', text);
|
||||||
|
try {
|
||||||
|
await _invoke('chat', { message: text });
|
||||||
|
} catch(err) {
|
||||||
|
isSending = false; sendBtn.disabled = false; chatInput.disabled = false;
|
||||||
|
addMsg('system-msg', 'Error: ' + String(err));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chatInput.addEventListener('keydown', function(e) {
|
||||||
|
if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); }
|
||||||
|
});
|
||||||
|
sendBtn.addEventListener('click', sendMessage);
|
||||||
|
chatInput.addEventListener('input', function() {
|
||||||
|
chatInput.style.height = 'auto';
|
||||||
|
chatInput.style.height = Math.min(chatInput.scrollHeight, 100) + 'px';
|
||||||
|
});
|
||||||
|
|
||||||
|
// ── Clear events
|
||||||
|
$('clear-events-btn').addEventListener('click', function() {
|
||||||
|
eventsList.querySelectorAll('.event-card').forEach(function(c) { c.remove(); });
|
||||||
|
eventsEmpty.classList.remove('hidden');
|
||||||
|
eventCount = 0; dbgEventCount.textContent = '0';
|
||||||
|
eventsCountEl.textContent = 'No events yet'; clearBadge();
|
||||||
|
});
|
||||||
|
|
||||||
|
// ── Notification level
|
||||||
|
$('notif-level-select').addEventListener('change', function() {
|
||||||
|
if (_invoke) _invoke('update_notification_level', { level: this.value }).catch(function(e) {
|
||||||
|
console.error('update_notification_level:', e);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// ── Debug panel
|
||||||
|
function populateDebug(cfg) {
|
||||||
|
if (!cfg) return;
|
||||||
|
var m = cfg.migration;
|
||||||
|
if (m) {
|
||||||
|
$('dbg-source-os').textContent = m.source_os || '—';
|
||||||
|
$('dbg-distro').textContent = m.distro || '—';
|
||||||
|
$('dbg-distro-family').textContent = m.source_distro_family || '(auto)';
|
||||||
|
$('dbg-dual-boot').textContent = m.dual_boot_with || 'none';
|
||||||
|
$('dbg-fluency').textContent = (m.fluency_level || 0) + ' / 5';
|
||||||
|
} else {
|
||||||
|
$('dbg-source-os').textContent = '(not configured)';
|
||||||
|
}
|
||||||
|
$('dbg-ollama-url').textContent = (cfg.ollama && cfg.ollama.base_url) || '—';
|
||||||
|
$('dbg-ollama-model').textContent = (cfg.ollama && cfg.ollama.model) || '—';
|
||||||
|
$('dbg-tier').textContent = cfg.tier || 'free';
|
||||||
|
var lvl = (cfg.display && cfg.display.notification_level) || 'badge_and_toast';
|
||||||
|
$('notif-level-select').value = lvl;
|
||||||
|
probeOllama(cfg.ollama && cfg.ollama.base_url);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function probeOllama(url) {
|
||||||
|
var el = $('dbg-ollama-status');
|
||||||
|
if (!url) { el.textContent = 'no URL'; el.className = 'val err'; return; }
|
||||||
|
try {
|
||||||
|
var res = await fetch(url + '/api/tags', { signal: AbortSignal.timeout(3000) });
|
||||||
|
if (res.ok) {
|
||||||
|
var data = await res.json();
|
||||||
|
var count = (data.models && data.models.length) || 0;
|
||||||
|
el.textContent = 'reachable (' + count + ' model' + (count !== 1 ? 's' : '') + ')';
|
||||||
|
el.className = 'val ok';
|
||||||
|
} else {
|
||||||
|
el.textContent = 'HTTP ' + res.status; el.className = 'val warn';
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
el.textContent = 'unreachable'; el.className = 'val err';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Onboarding
|
||||||
|
function showOnboarding() {
|
||||||
|
onboardingEl.classList.remove('hidden'); tabsEl.classList.add('hidden');
|
||||||
|
document.querySelectorAll('.pane').forEach(function(p) { p.classList.remove('active'); });
|
||||||
|
setStatus('warn', 'setup needed');
|
||||||
|
}
|
||||||
|
function showMain() {
|
||||||
|
onboardingEl.classList.add('hidden'); tabsEl.classList.remove('hidden');
|
||||||
|
$('pane-chat').classList.add('active');
|
||||||
|
document.querySelectorAll('.tab-btn').forEach(function(b) { b.classList.remove('active'); });
|
||||||
|
document.querySelector('[data-tab="chat"]').classList.add('active');
|
||||||
|
if (_invoke) _invoke('panel_opened').catch(function(){});
|
||||||
|
setStatus('ok', 'ready');
|
||||||
|
}
|
||||||
|
|
||||||
|
$('onboarding-save').addEventListener('click', async function() {
|
||||||
|
onbError.classList.add('hidden');
|
||||||
|
var srcOs = $('src-os').value;
|
||||||
|
var distro = $('distro').value.trim() || 'unknown';
|
||||||
|
var dualBoot = $('dual-boot').value || null;
|
||||||
|
try {
|
||||||
|
await _invoke('complete_onboarding', {
|
||||||
|
sourceOs: srcOs, distro: distro, sourceDistro: null, dualBootWith: dualBoot
|
||||||
|
});
|
||||||
|
currentConfig = await _invoke('get_config');
|
||||||
|
populateDebug(currentConfig);
|
||||||
|
showMain();
|
||||||
|
addMsg('system-msg', '✓ Profile saved. Robin is watching your logs.');
|
||||||
|
} catch(err) {
|
||||||
|
onbError.textContent = String(err); onbError.classList.remove('hidden');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('reset-onboarding-btn').addEventListener('click', showOnboarding);
|
||||||
|
|
||||||
|
// ── Init
|
||||||
|
async function init() {
|
||||||
|
_invoke = window.__TAURI__.core.invoke;
|
||||||
|
_listen = window.__TAURI__.event.listen;
|
||||||
|
|
||||||
|
await _listen('robin:chat-token', function(e) { appendToken(e.payload); });
|
||||||
|
await _listen('robin:chat-done', function() { endStream(); });
|
||||||
|
await _listen('robin:chat-error', function(e) {
|
||||||
|
endStream(); addMsg('system-msg', 'LLM error: ' + e.payload);
|
||||||
|
});
|
||||||
|
await _listen('robin:event', function(e) { addEventCard(e.payload); });
|
||||||
|
|
||||||
|
try {
|
||||||
|
currentConfig = await _invoke('get_config');
|
||||||
|
populateDebug(currentConfig);
|
||||||
|
} catch(e) { console.error('get_config:', e); setStatus('error', 'config error'); }
|
||||||
|
|
||||||
|
var needsSetup = true;
|
||||||
|
try { needsSetup = await _invoke('needs_onboarding'); } catch(e) {}
|
||||||
|
|
||||||
|
if (needsSetup) {
|
||||||
|
showOnboarding();
|
||||||
|
} else {
|
||||||
|
showMain();
|
||||||
|
try {
|
||||||
|
var pending = await _invoke('get_pending_events');
|
||||||
|
pending.forEach(addEventCard);
|
||||||
|
} catch(e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitAndInit(tries) {
|
||||||
|
if (window.__TAURI__ && window.__TAURI__.core) {
|
||||||
|
init().catch(function(e) { setStatus('error', 'init error'); console.error('Robin init:', e); });
|
||||||
|
} else if (tries > 0) {
|
||||||
|
setTimeout(function() { waitAndInit(tries - 1); }, 100);
|
||||||
|
} else {
|
||||||
|
setStatus('error', 'IPC unavailable');
|
||||||
|
$('welcome-msg').textContent = 'Could not connect to the Robin backend — try restarting the app.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
waitAndInit(30);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
54
manage.sh
54
manage.sh
|
|
@ -52,8 +52,7 @@ case "$cmd" in
|
||||||
|
|
||||||
start)
|
start)
|
||||||
# Start Robin in the background (daemonised via nohup).
|
# Start Robin in the background (daemonised via nohup).
|
||||||
# Also starts the Vite dev server if a release binary is not available
|
# No dev server needed — the webview loads dist/index.html directly.
|
||||||
# and Node/nvm is present, so the webview has something to connect to.
|
|
||||||
if pgrep -x "$APP_NAME" > /dev/null 2>&1; then
|
if pgrep -x "$APP_NAME" > /dev/null 2>&1; then
|
||||||
echo "Robin is already running (PID $(pgrep -x "$APP_NAME"))"
|
echo "Robin is already running (PID $(pgrep -x "$APP_NAME"))"
|
||||||
exit 0
|
exit 0
|
||||||
|
|
@ -62,21 +61,6 @@ case "$cmd" in
|
||||||
export DISPLAY="${DISPLAY:-:0}"
|
export DISPLAY="${DISPLAY:-:0}"
|
||||||
export RUST_LOG="${RUST_LOG:-robin_lib=info,warn}"
|
export RUST_LOG="${RUST_LOG:-robin_lib=info,warn}"
|
||||||
mkdir -p "$(dirname "$LOG_FILE")"
|
mkdir -p "$(dirname "$LOG_FILE")"
|
||||||
|
|
||||||
# If using the debug binary and no Vite server is running, start one.
|
|
||||||
if [[ "$bin" == *"target/debug"* ]] && ! curl -sf http://localhost:1420 > /dev/null 2>&1; then
|
|
||||||
NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
|
|
||||||
if [[ -s "$NVM_DIR/nvm.sh" ]] && command -v npm > /dev/null 2>&1 || { source "$NVM_DIR/nvm.sh" 2>/dev/null && command -v npm > /dev/null 2>&1; }; then
|
|
||||||
echo "Starting Vite dev server on :1420..."
|
|
||||||
nohup npm --prefix "$SCRIPT_DIR" run dev >> /tmp/robin-vite.log 2>&1 &
|
|
||||||
echo "Vite PID $! — logs: /tmp/robin-vite.log"
|
|
||||||
sleep 2 # give Vite time to bind before Robin connects
|
|
||||||
else
|
|
||||||
echo "Note: no release binary and Node not found — webview will show connection error."
|
|
||||||
echo "Run 'npm install && npm run dev' in $SCRIPT_DIR to fix this."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
nohup "$bin" >> "$LOG_FILE" 2>&1 &
|
nohup "$bin" >> "$LOG_FILE" 2>&1 &
|
||||||
echo "Robin started (PID $!). Logs: $LOG_FILE"
|
echo "Robin started (PID $!). Logs: $LOG_FILE"
|
||||||
;;
|
;;
|
||||||
|
|
@ -88,11 +72,6 @@ case "$cmd" in
|
||||||
else
|
else
|
||||||
echo "Robin is not running."
|
echo "Robin is not running."
|
||||||
fi
|
fi
|
||||||
# Stop Vite dev server if we started it.
|
|
||||||
if pgrep -f "vite" > /dev/null 2>&1; then
|
|
||||||
pkill -f "node.*vite" 2>/dev/null || true
|
|
||||||
echo "Vite dev server stopped."
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
restart)
|
restart)
|
||||||
|
|
@ -119,15 +98,27 @@ case "$cmd" in
|
||||||
;;
|
;;
|
||||||
|
|
||||||
dev)
|
dev)
|
||||||
echo "Starting Robin in dev mode (hot-reload)..."
|
# Dev mode: build debug binary and run it directly.
|
||||||
cd "$SCRIPT_DIR"
|
# The webview loads dist/index.html from the build artefact path —
|
||||||
npm run tauri dev
|
# no npm or Vite server required.
|
||||||
|
echo "Building and running Robin in dev mode..."
|
||||||
|
cargo build --manifest-path "$SCRIPT_DIR/src-tauri/Cargo.toml"
|
||||||
|
export DISPLAY="${DISPLAY:-:0}"
|
||||||
|
export RUST_LOG="${RUST_LOG:-robin_lib=debug,warn}"
|
||||||
|
exec "$DEBUG_BIN"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
build)
|
build)
|
||||||
echo "Building Robin release binary + installers..."
|
echo "Building Robin release binary..."
|
||||||
|
cargo build --release --manifest-path "$SCRIPT_DIR/src-tauri/Cargo.toml"
|
||||||
|
echo "Binary: $RELEASE_BIN"
|
||||||
|
;;
|
||||||
|
|
||||||
|
bundle)
|
||||||
|
# Full release bundle (.deb/.rpm/.AppImage) — requires Tauri CLI (npm install -g @tauri-apps/cli)
|
||||||
|
echo "Building Robin release bundle (deb/rpm/AppImage)..."
|
||||||
cd "$SCRIPT_DIR"
|
cd "$SCRIPT_DIR"
|
||||||
npm run tauri build
|
cargo tauri build
|
||||||
;;
|
;;
|
||||||
|
|
||||||
build-debug)
|
build-debug)
|
||||||
|
|
@ -258,7 +249,7 @@ Usage: ./manage.sh <command>
|
||||||
|
|
||||||
Running:
|
Running:
|
||||||
run Run in foreground (logs to terminal, Ctrl+C to quit)
|
run Run in foreground (logs to terminal, Ctrl+C to quit)
|
||||||
start Start in background
|
start Start in background (no dev server needed)
|
||||||
stop Stop background instance
|
stop Stop background instance
|
||||||
restart Stop then start
|
restart Stop then start
|
||||||
status Show whether Robin is running
|
status Show whether Robin is running
|
||||||
|
|
@ -266,8 +257,9 @@ Running:
|
||||||
|
|
||||||
Building:
|
Building:
|
||||||
build-debug Build debug binary (Rust only, no Node/npm needed)
|
build-debug Build debug binary (Rust only, no Node/npm needed)
|
||||||
build Build release binary + .deb/.rpm/.AppImage (needs Node + Tauri CLI)
|
build Build release binary (Rust only)
|
||||||
dev Start dev mode with hot-reload (needs Node + Tauri CLI)
|
bundle Build release bundle (.deb/.rpm/.AppImage) — requires Tauri CLI
|
||||||
|
dev Build debug binary and run it immediately
|
||||||
test Run Rust unit tests
|
test Run Rust unit tests
|
||||||
|
|
||||||
Installation:
|
Installation:
|
||||||
|
|
@ -281,6 +273,8 @@ Installation:
|
||||||
Dependencies:
|
Dependencies:
|
||||||
install-deps Install system deps (Debian/Ubuntu/Mint)
|
install-deps Install system deps (Debian/Ubuntu/Mint)
|
||||||
install-deps-arch Install system deps (Arch/Manjaro/CachyOS)
|
install-deps-arch Install system deps (Arch/Manjaro/CachyOS)
|
||||||
|
|
||||||
|
Note: No Node.js or npm required. The UI is a static HTML file bundled with the binary.
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
||||||
|
|
@ -134,3 +134,68 @@ match_text = "GPU HANG"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Graphics card stopped responding"
|
title = "Graphics card stopped responding"
|
||||||
body = "The graphics card froze and the driver recovered it — like a forced restart of the GPU. Games or video apps may have crashed. If this keeps happening, check that your graphics drivers are current: sudo pacman -Syu"
|
body = "The graphics card froze and the driver recovered it — like a forced restart of the GPU. Games or video apps may have crashed. If this keeps happening, check that your graphics drivers are current: sudo pacman -Syu"
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo pacman -S xorg-xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,3 +135,68 @@ match_text = "GStreamer: Failed to find plugin"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "Media format not supported"
|
title = "Media format not supported"
|
||||||
body = "Linux doesn't include some video/audio formats by default for legal reasons — unlike Android which bundles them. Install them on Ubuntu/Mint: sudo apt install ubuntu-restricted-extras — this adds MP3, MP4, and other common formats."
|
body = "Linux doesn't include some video/audio formats by default for legal reasons — unlike Android which bundles them. Install them on Ubuntu/Mint: sudo apt install ubuntu-restricted-extras — this adds MP3, MP4, and other common formats."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, most apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: apt-file search libname.so.6 (swap in the missing filename). Or search: apt-cache search libname. Install it: sudo apt install libpackagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo apt install xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,3 +100,68 @@ match_text = "GStreamer: Failed to find plugin"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "Media format not supported"
|
title = "Media format not supported"
|
||||||
body = "Linux doesn't include some video/audio formats by default. Install them from RPM Fusion: first enable it: sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm — then: sudo dnf install gstreamer1-plugins-bad-free gstreamer1-plugins-ugly"
|
body = "Linux doesn't include some video/audio formats by default. Install them from RPM Fusion: first enable it: sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm — then: sudo dnf install gstreamer1-plugins-bad-free gstreamer1-plugins-ugly"
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: dnf provides 'libname.so.6'. Or search: dnf search libname. Install it: sudo dnf install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo dnf install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -101,3 +101,68 @@ match_text = "Activation failed"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "Wi-Fi connection failed"
|
title = "Wi-Fi connection failed"
|
||||||
body = "Couldn't connect to the network. Check: nmcli device status — or use YaST -> Network Settings to diagnose."
|
body = "Couldn't connect to the network. Check: nmcli device status — or use YaST -> Network Settings to diagnose."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: zypper what-provides 'libname.so.6'. Or search: zypper search libname. Install it: sudo zypper install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo zypper install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -144,3 +144,68 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, most apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: apt-file search libname.so.6 (swap in the missing filename). Or search: apt-cache search libname. Install it: sudo apt install libpackagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo apt install xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,3 +134,57 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on Fedora: sudo dnf install steam (from RPM Fusion free)."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on Fedora: sudo dnf install steam (from RPM Fusion free)."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: dnf provides 'libname.so.6'. Or search: dnf search libname. Install it: sudo dnf install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -128,3 +128,68 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on openSUSE: sudo zypper install steam (from the games repo on OBS)."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on openSUSE: sudo zypper install steam (from the games repo on OBS)."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: zypper what-provides 'libname.so.6'. Or search: zypper search libname. Install it: sudo zypper install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo zypper install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -184,3 +184,57 @@ match_text = "Wine is not installed"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Lutris: Wine not found"
|
title = "Lutris: Wine not found"
|
||||||
body = "Lutris needs a Wine runner. In Lutris: Preferences -> Runners -> Wine -> Install — or: paru -S wine-staging"
|
body = "Lutris needs a Wine runner. In Lutris: Preferences -> Runners -> Wine -> Install — or: paru -S wine-staging"
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -142,3 +142,57 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on Fedora may also need: sudo dnf install steam (from RPM Fusion free repo)."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on Fedora may also need: sudo dnf install steam (from RPM Fusion free repo)."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: dnf provides 'libname.so.6'. Or search: dnf search libname. Install it: sudo dnf install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -118,3 +118,68 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on openSUSE: sudo zypper install steam (from the games repo on OBS)."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on openSUSE: sudo zypper install steam (from the games repo on OBS)."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: zypper what-provides 'libname.so.6'. Or search: zypper search libname. Install it: sudo zypper install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo zypper install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,3 +63,47 @@ match_text = "RTC time"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "System clock drifted after macOS boot"
|
title = "System clock drifted after macOS boot"
|
||||||
body = "macOS stores the hardware clock in local time; Linux stores it in UTC. This causes clock drift in dual-boot. Fix in Linux: timedatectl set-local-rtc 0 — then set macOS to UTC by running in Terminal: sudo systemsetup -setusingnetworktime off && sudo systemsetup -settime $(date -u +%H:%M:%S)"
|
body = "macOS stores the hardware clock in local time; Linux stores it in UTC. This causes clock drift in dual-boot. Fix in Linux: timedatectl set-local-rtc 0 — then set macOS to UTC by running in Terminal: sudo systemsetup -setusingnetworktime off && sudo systemsetup -settime $(date -u +%H:%M:%S)"
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -73,3 +73,47 @@ match_text = "ntfs-3g: Failed to open"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "NTFS permission error"
|
title = "NTFS permission error"
|
||||||
body = "ntfs-3g can't open the Windows partition. Check your /etc/fstab mount options — add uid=1000,gid=1000,umask=022 to give your Linux user access. Make sure Windows is fully shut down first."
|
body = "ntfs-3g can't open the Windows partition. Check your /etc/fstab mount options — add uid=1000,gid=1000,umask=022 to give your Linux user access. Make sure Windows is fully shut down first."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -170,3 +170,57 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -136,3 +136,68 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, most apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: apt-file search libname.so.6 (swap in the missing filename). Or search: apt-cache search libname. Install it: sudo apt install libpackagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo apt install xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -128,3 +128,68 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. For Steam on openSUSE: sudo zypper install steam (from the games repo on OBS)."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. For Steam on openSUSE: sudo zypper install steam (from the games repo on OBS)."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: zypper what-provides 'libname.so.6'. Or search: zypper search libname. Install it: sudo zypper install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo zypper install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -118,3 +118,68 @@ match_text = "GPU HANG"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Graphics card stopped responding"
|
title = "Graphics card stopped responding"
|
||||||
body = "The graphics system crashed and recovered — similar to an app freezing on iPad, but at a lower level. If this keeps happening during games or video, update your graphics drivers: sudo pacman -Syu"
|
body = "The graphics system crashed and recovered — similar to an app freezing on iPad, but at a lower level. If this keeps happening during games or video, update your graphics drivers: sudo pacman -Syu"
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo pacman -S xorg-xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,3 +135,68 @@ match_text = "GStreamer: Failed to find plugin"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "Video or audio format not supported"
|
title = "Video or audio format not supported"
|
||||||
body = "Linux needs extra packages to play some media formats. On Ubuntu/Mint: sudo apt install ubuntu-restricted-extras — this adds support for MP3, MP4, and other common formats."
|
body = "Linux needs extra packages to play some media formats. On Ubuntu/Mint: sudo apt install ubuntu-restricted-extras — this adds support for MP3, MP4, and other common formats."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, most apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: apt-file search libname.so.6 (swap in the missing filename). Or search: apt-cache search libname. Install it: sudo apt install libpackagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo apt install xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -100,3 +100,68 @@ match_text = "GStreamer: Failed to find plugin"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "Video or audio format not supported"
|
title = "Video or audio format not supported"
|
||||||
body = "Fedora needs extra packages for some media formats. Enable RPM Fusion: sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm — then: sudo dnf install gstreamer1-plugins-bad-free gstreamer1-plugins-ugly"
|
body = "Fedora needs extra packages for some media formats. Enable RPM Fusion: sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm — then: sudo dnf install gstreamer1-plugins-bad-free gstreamer1-plugins-ugly"
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: dnf provides 'libname.so.6'. Or search: dnf search libname. Install it: sudo dnf install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo dnf install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,3 +109,68 @@ match_text = "Activation failed"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "Wi-Fi connection failed"
|
title = "Wi-Fi connection failed"
|
||||||
body = "Check YaST -> Network Settings — or: nmcli device status — in a terminal."
|
body = "Check YaST -> Network Settings — or: nmcli device status — in a terminal."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: zypper what-provides 'libname.so.6'. Or search: zypper search libname. Install it: sudo zypper install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo zypper install xorg-x11-server-Xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -217,3 +217,57 @@ match_text = "Activation failed"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "NetworkManager: connection failed"
|
title = "NetworkManager: connection failed"
|
||||||
body = "nmcli device status — if a wifi adapter is missing, check dmesg for firmware errors. CachyOS ships most firmware in linux-firmware but some chips (Realtek 8852) need AUR packages."
|
body = "nmcli device status — if a wifi adapter is missing, check dmesg for firmware errors. CachyOS ships most firmware in linux-firmware but some chips (Realtek 8852) need AUR packages."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -175,3 +175,57 @@ match_text = "Failed to compile shader"
|
||||||
severity = "info"
|
severity = "info"
|
||||||
title = "RetroArch shader failed to compile"
|
title = "RetroArch shader failed to compile"
|
||||||
body = "A graphical shader couldn't load. Try switching preset in Settings -> Video -> Shaders."
|
body = "A graphical shader couldn't load. Try switching preset in Settings -> Video -> Shaders."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -170,3 +170,57 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Search for the package: pkgfile libname.so.6 (install pkgfile first: sudo pacman -S pkgfile && sudo pkgfile -u). Or search: pacman -Ss libname. Install it: sudo pacman -S packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -136,3 +136,68 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, most apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: apt-file search libname.so.6 (swap in the missing filename). Or search: apt-cache search libname. Install it: sudo apt install libpackagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo apt install xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -144,3 +144,57 @@ match_text = "wine: cannot find"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Proton runtime issue"
|
title = "Proton runtime issue"
|
||||||
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on Fedora: sudo dnf install steam (from RPM Fusion free)."
|
body = "Right-click game in Steam -> Properties -> Local Files -> Verify integrity. Steam on Fedora: sudo dnf install steam (from RPM Fusion free)."
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: dnf provides 'libname.so.6'. Or search: dnf search libname. Install it: sudo dnf install packagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
|
||||||
|
|
@ -185,3 +185,79 @@ match_text = "ERROR: failed to write"
|
||||||
severity = "warn"
|
severity = "warn"
|
||||||
title = "Steam disk write error"
|
title = "Steam disk write error"
|
||||||
body = "Steam can't write to its library folder. Check: ls -la ~/.local/share/Steam"
|
body = "Steam can't write to its library folder. Check: ls -la ~/.local/share/Steam"
|
||||||
|
|
||||||
|
# ── Dynamic linker / shared libraries ────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "missing-shared-library"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "cannot open shared object file: No such file or directory"
|
||||||
|
severity = "warn"
|
||||||
|
title = "App is missing a system library"
|
||||||
|
body = "This program needs a shared library that isn't installed. On Linux, most apps use shared system libraries rather than bundling their own — unlike Windows .exe files. Find the right package: apt-file search libname.so.6 (swap in the missing filename). Or search by name: apt-cache search libname. Install it: sudo apt install libpackagename. Note: pip and pip3 cannot fix this — Python packages are not system libraries."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-network-wait"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Failed to start Network Wait Online"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: waiting for network"
|
||||||
|
body = "systemd is waiting for a full network connection before finishing boot. This is almost never needed on a desktop or laptop. Disable it: sudo systemctl disable systemd-networkd-wait-online.service NetworkManager-wait-online.service — then reboot. Unlike Windows, Linux lets you disable any boot step that isn't relevant to your setup."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-device-timeout"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "Timed out waiting for device"
|
||||||
|
severity = "warn"
|
||||||
|
title = "Boot is slow: a device that no longer exists"
|
||||||
|
body = "systemd is waiting for a disk, partition, or device that isn't connected. Common cause: /etc/fstab has an entry for an external drive or old partition. Check: cat /etc/fstab — look for lines pointing to drives that aren't always connected. Add the 'nofail' option to make them optional: UUID=xxx /mnt/point type defaults,nofail 0 0. Or comment the line out with #."
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "slow-boot-long-running-job"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "A start job is running for"
|
||||||
|
severity = "info"
|
||||||
|
title = "A service is taking a long time to start"
|
||||||
|
body = "A background service is taking longer than expected during boot. To find what's slowing your startup: open a terminal after booting and run: systemd-analyze blame — the top entries are the biggest contributors. For a visual timeline saved to a file: systemd-analyze plot > ~/boot-profile.svg — then open the SVG in a browser."
|
||||||
|
|
||||||
|
# ── SSH / remote access ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "ssh-permissions-key"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "WARNING: UNPROTECTED PRIVATE KEY FILE"
|
||||||
|
severity = "warn"
|
||||||
|
title = "SSH key permissions are too open"
|
||||||
|
body = "Your SSH private key is readable by other users on this system — SSH refuses to use it as a security measure. Fix: chmod 600 ~/.ssh/id_rsa (replace id_rsa with the key filename shown in the error). Also lock the directory: chmod 700 ~/.ssh. This is different from Windows where file permissions are mostly advisory."
|
||||||
|
|
||||||
|
# ── Flatpak ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "flatpak-missing-runtime"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "error: runtime/org."
|
||||||
|
severity = "warn"
|
||||||
|
title = "Flatpak app is missing a runtime"
|
||||||
|
body = "A Flatpak app can't find a required runtime (a shared set of libraries). Update all runtimes first: flatpak update — if that doesn't fix it, reinstall the app: flatpak install flathub com.example.AppName. Flatpak runtimes are like Windows runtime packages (VC++ Redistributable) but for Linux apps."
|
||||||
|
|
||||||
|
# ── Security (AppArmor) ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "apparmor-denial"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "apparmor=\"DENIED\""
|
||||||
|
severity = "warn"
|
||||||
|
title = "AppArmor blocked an application"
|
||||||
|
body = "AppArmor (a mandatory access control system) blocked a program from accessing a file or resource. This often happens with Wine, Bottles, or AppImages running software that wasn't installed through your package manager. To see what was blocked: sudo journalctl -b | grep apparmor. To temporarily put a profile in learning mode: sudo aa-complain /etc/apparmor.d/profile-name."
|
||||||
|
|
||||||
|
|
||||||
|
# ── Display / Wayland compatibility ──────────────────────────────────────────
|
||||||
|
|
||||||
|
[[patterns]]
|
||||||
|
id = "xwayland-crash"
|
||||||
|
sources = ["journald"]
|
||||||
|
match_text = "XWayland server terminated unexpectedly"
|
||||||
|
severity = "warn"
|
||||||
|
title = "XWayland crashed"
|
||||||
|
body = "XWayland is the compatibility layer that lets older X11 apps run under Wayland. It crashed, so apps that aren't Wayland-native will stop working until you restart your session. If XWayland keeps crashing: make sure it's installed (sudo apt install xwayland) and check GPU driver stability. Log out and back in to recover."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,10 @@
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"identifier": "tech.circuitforge.robin",
|
"identifier": "tech.circuitforge.robin",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../dist",
|
"frontendDist": "../dist"
|
||||||
"devUrl": "http://localhost:1420",
|
|
||||||
"beforeDevCommand": "npm run dev",
|
|
||||||
"beforeBuildCommand": "npm run build"
|
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
|
"withGlobalTauri": true,
|
||||||
"windows": [
|
"windows": [
|
||||||
{
|
{
|
||||||
"label": "chat",
|
"label": "chat",
|
||||||
|
|
@ -32,7 +30,7 @@
|
||||||
"tooltip": "Robin"
|
"tooltip": "Robin"
|
||||||
},
|
},
|
||||||
"security": {
|
"security": {
|
||||||
"csp": "default-src 'self'; connect-src http://localhost:* ipc: asset:"
|
"csp": "default-src 'self' tauri: asset: ipc:; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src ipc: http://ipc.localhost asset: http://localhost:*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bundle": {
|
"bundle": {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue