Arx 0.5.4: Ready to audit screen in two rows; label Fine-tuned AI Model
Browse files- app/package.json +1 -1
- app/renderer/app.js +17 -9
- app/renderer/index.html +1 -1
- app/renderer/styles.css +18 -5
- index.html +3 -3
app/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"name": "devseis-endpoint-auditor",
|
| 3 |
"productName": "Arx",
|
| 4 |
-
"version": "0.5.
|
| 5 |
"description": "Read-only endpoint audit for ISO 27001, GDPR and the EU AI Act, with a local AI auditor.",
|
| 6 |
"author": {
|
| 7 |
"name": "Devseis",
|
|
|
|
| 1 |
{
|
| 2 |
"name": "devseis-endpoint-auditor",
|
| 3 |
"productName": "Arx",
|
| 4 |
+
"version": "0.5.4",
|
| 5 |
"description": "Read-only endpoint audit for ISO 27001, GDPR and the EU AI Act, with a local AI auditor.",
|
| 6 |
"author": {
|
| 7 |
"name": "Devseis",
|
app/renderer/app.js
CHANGED
|
@@ -48,24 +48,32 @@ async function prepare() {
|
|
| 48 |
showApproval();
|
| 49 |
}
|
| 50 |
|
| 51 |
-
// 2. Approval: show everything that will be checked
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
function showApproval() {
|
| 53 |
$('plan').innerHTML = '';
|
|
|
|
|
|
|
| 54 |
for (const section of plan.sections) {
|
|
|
|
| 55 |
const box = document.createElement('div');
|
| 56 |
-
box.className =
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
const list =
|
| 63 |
for (const check of section.checks) {
|
| 64 |
const item = document.createElement('li');
|
| 65 |
item.textContent = check.name;
|
| 66 |
list.appendChild(item);
|
| 67 |
}
|
| 68 |
-
box.append(title, list);
|
| 69 |
$('plan').appendChild(box);
|
| 70 |
}
|
| 71 |
show('approve');
|
|
|
|
| 48 |
showApproval();
|
| 49 |
}
|
| 50 |
|
| 51 |
+
// 2. Approval: show everything that will be checked (row 1: baseline + GDPR, row 2: AI Act + organisation)
|
| 52 |
+
const SECTION_INFO = {
|
| 53 |
+
baseline: { icon: '🛡️', title: 'Security baseline', sub: 'Passwords, accounts, antivirus, firewall, screen lock, USB, encryption, updates' },
|
| 54 |
+
gdpr: { icon: '🔐', title: 'GDPR technical controls', sub: 'Updates, logging, time, backup, guest and remote access, diagnostics' },
|
| 55 |
+
aiact: { icon: '🤖', title: 'EU AI Act', sub: 'AI tools on this computer and how they are governed' },
|
| 56 |
+
org: { icon: '🏢', title: 'Organisation', sub: 'Company records and policies, answered in organisational.conf' },
|
| 57 |
+
};
|
| 58 |
function showApproval() {
|
| 59 |
$('plan').innerHTML = '';
|
| 60 |
+
const total = plan.sections.reduce((n, s) => n + s.checks.length, 0);
|
| 61 |
+
$('plan-total').textContent = `${total} checks in ${plan.sections.length} groups`;
|
| 62 |
for (const section of plan.sections) {
|
| 63 |
+
const info = SECTION_INFO[section.id] || { icon: '•', title: section.title, sub: '' };
|
| 64 |
const box = document.createElement('div');
|
| 65 |
+
box.className = `section section-${section.id}`;
|
| 66 |
+
box.innerHTML = `<div class="section-head"><span class="section-icon"></span><div class="section-titles"><h3></h3><p></p></div><span class="count"></span></div><ul></ul>`;
|
| 67 |
+
box.querySelector('.section-icon').textContent = info.icon;
|
| 68 |
+
box.querySelector('h3').textContent = info.title;
|
| 69 |
+
box.querySelector('p').textContent = info.sub;
|
| 70 |
+
box.querySelector('.count').textContent = `${section.checks.length} checks`;
|
| 71 |
+
const list = box.querySelector('ul');
|
| 72 |
for (const check of section.checks) {
|
| 73 |
const item = document.createElement('li');
|
| 74 |
item.textContent = check.name;
|
| 75 |
list.appendChild(item);
|
| 76 |
}
|
|
|
|
| 77 |
$('plan').appendChild(box);
|
| 78 |
}
|
| 79 |
show('approve');
|
app/renderer/index.html
CHANGED
|
@@ -28,7 +28,7 @@
|
|
| 28 |
<!-- 2. Approval -->
|
| 29 |
<section class="screen hidden" id="screen-approve">
|
| 30 |
<h1>Ready to audit this computer</h1>
|
| 31 |
-
<p class="lead">The audit only <b>reads</b> settings. It changes nothing unless you later choose <b>Fix</b>.
|
| 32 |
<div class="sections" id="plan"></div>
|
| 33 |
<label class="option"><input type="checkbox" id="elevated" checked> Run with administrator rights (recommended — without them some checks cannot be read)</label>
|
| 34 |
<div class="actions">
|
|
|
|
| 28 |
<!-- 2. Approval -->
|
| 29 |
<section class="screen hidden" id="screen-approve">
|
| 30 |
<h1>Ready to audit this computer</h1>
|
| 31 |
+
<p class="lead">The audit only <b>reads</b> settings. It changes nothing unless you later choose <b>Fix</b>. <span id="plan-total"></span>:</p>
|
| 32 |
<div class="sections" id="plan"></div>
|
| 33 |
<label class="option"><input type="checkbox" id="elevated" checked> Run with administrator rights (recommended — without them some checks cannot be read)</label>
|
| 34 |
<div class="actions">
|
app/renderer/styles.css
CHANGED
|
@@ -23,11 +23,6 @@ h2 { font-size: 19px; margin: 0 0 8px; }
|
|
| 23 |
.progress { height: 10px; background: var(--line); border-radius: 999px; overflow: hidden; margin-top: 10px; }
|
| 24 |
.progress.thin { height: 6px; margin: 12px 0 4px; }
|
| 25 |
.progress > div { height: 100%; width: 0; background: linear-gradient(90deg, var(--blue), var(--red)); transition: width .25s; }
|
| 26 |
-
.sections { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 12px; margin-bottom: 14px; }
|
| 27 |
-
.section { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; }
|
| 28 |
-
.section h3 { font-size: 14px; margin: 0 0 6px; display: flex; justify-content: space-between; }
|
| 29 |
-
.section h3 span { color: var(--muted); font-weight: 500; }
|
| 30 |
-
.section ul { margin: 0; padding-left: 18px; font-size: 13px; color: var(--muted); max-height: 170px; overflow: auto; }
|
| 31 |
.option { display: flex; gap: 8px; align-items: flex-start; margin: 6px 0 18px; font-size: 14px; }
|
| 32 |
.actions { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; }
|
| 33 |
button { font: inherit; font-weight: 600; border-radius: 10px; padding: 10px 18px; cursor: pointer; border: 1px solid transparent; }
|
|
@@ -67,3 +62,21 @@ label.fix-item input { margin-top: 4px; width: 16px; height: 16px; accent-color:
|
|
| 67 |
.fix-results, .fix-list { margin: 8px 0 0; padding-left: 4px; list-style: none; font-size: 14px; }
|
| 68 |
.fix-results li, .fix-list li { margin-bottom: 6px; }
|
| 69 |
button:disabled { opacity: .5; cursor: default; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
.progress { height: 10px; background: var(--line); border-radius: 999px; overflow: hidden; margin-top: 10px; }
|
| 24 |
.progress.thin { height: 6px; margin: 12px 0 4px; }
|
| 25 |
.progress > div { height: 100%; width: 0; background: linear-gradient(90deg, var(--blue), var(--red)); transition: width .25s; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
.option { display: flex; gap: 8px; align-items: flex-start; margin: 6px 0 18px; font-size: 14px; }
|
| 27 |
.actions { display: flex; gap: 10px; justify-content: flex-end; flex-wrap: wrap; }
|
| 28 |
button { font: inherit; font-weight: 600; border-radius: 10px; padding: 10px 18px; cursor: pointer; border: 1px solid transparent; }
|
|
|
|
| 62 |
.fix-results, .fix-list { margin: 8px 0 0; padding-left: 4px; list-style: none; font-size: 14px; }
|
| 63 |
.fix-results li, .fix-list li { margin-bottom: 6px; }
|
| 64 |
button:disabled { opacity: .5; cursor: default; }
|
| 65 |
+
|
| 66 |
+
/* Approval screen: two rows of two groups */
|
| 67 |
+
.sections { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 16px; }
|
| 68 |
+
.section { background: var(--card); border: 1px solid var(--line); border-radius: 14px; padding: 14px 16px 12px; display: flex; flex-direction: column; min-width: 0; }
|
| 69 |
+
.section-head { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 10px; }
|
| 70 |
+
.section-icon { font-size: 20px; line-height: 1.2; }
|
| 71 |
+
.section-titles { flex: 1; min-width: 0; }
|
| 72 |
+
.section h3 { font-size: 15px; margin: 0; line-height: 1.3; }
|
| 73 |
+
.section-titles p { margin: 2px 0 0; font-size: 12px; color: var(--muted); line-height: 1.4; }
|
| 74 |
+
.section .count { flex-shrink: 0; white-space: nowrap; font-size: 12px; font-weight: 600; color: var(--red); background: color-mix(in srgb, var(--red) 10%, transparent); border-radius: 999px; padding: 3px 10px; }
|
| 75 |
+
.section ul { margin: 0; padding: 0; list-style: none; font-size: 13px; color: var(--muted); overflow: auto; max-height: 232px; border-top: 1px solid var(--line); padding-top: 8px; }
|
| 76 |
+
.section li { position: relative; padding: 3px 0 3px 18px; line-height: 1.35; }
|
| 77 |
+
.section li::before { content: '✓'; position: absolute; left: 0; top: 3px; color: var(--ok); font-weight: 700; font-size: 12px; }
|
| 78 |
+
.section-aiact ul, .section-org ul { max-height: none; }
|
| 79 |
+
@media (max-width: 760px) { .sections { grid-template-columns: 1fr; } }
|
| 80 |
+
.section-baseline ul, .section-gdpr ul { columns: 2; column-gap: 18px; max-height: 300px; }
|
| 81 |
+
.section-baseline li, .section-gdpr li { break-inside: avoid; font-size: 12.5px; }
|
| 82 |
+
@media (max-width: 900px) { .section-baseline ul, .section-gdpr ul { columns: 1; } }
|
index.html
CHANGED
|
@@ -31,7 +31,7 @@
|
|
| 31 |
<!-- ===== Landing ===== -->
|
| 32 |
<main id="landing">
|
| 33 |
<section class="wrap hero">
|
| 34 |
-
<p class="eyebrow"><img src="app/build/icon.png" alt="">Arx - Fine
|
| 35 |
<h1>Is your computer secure?<br><span class="grad">Find out in a minute.</span></h1>
|
| 36 |
<p class="lead">A free audit of your Mac, Windows or Linux computer: <b><span data-count>70</span> checks</b> mapped to <b>ISO 27001</b>, <b>GDPR</b> and the <b>EU AI Act</b>. A small AI on your computer writes the report, and on Mac and Linux Arx can <b>fix problems for you</b>. It runs offline. <u>Nothing is uploaded.</u></p>
|
| 37 |
|
|
@@ -60,7 +60,7 @@
|
|
| 60 |
<label class="btn" for="reportFile" title="Open the …-evidence.json file Arx saves next to each report">Open a report</label>
|
| 61 |
<input type="file" id="reportFile" accept=".json,application/json" hidden>
|
| 62 |
</div>
|
| 63 |
-
<p class="tiny muted" id="heroMeta">Free · open source · version 0.5.
|
| 64 |
</section>
|
| 65 |
|
| 66 |
<section class="wrap">
|
|
@@ -99,7 +99,7 @@
|
|
| 99 |
</section>
|
| 100 |
|
| 101 |
<section class="wrap section" id="install">
|
| 102 |
-
<div class="section-head"><h2>Install Arx</h2><span class="tiny muted" id="dlVersion">Version 0.5.
|
| 103 |
<p class="muted install-why">One command installs Arx and opens it. It downloads Arx from Hugging Face, <b>checks its SHA-256 fingerprint</b> against the published one, and refuses to install if anything differs. Because Terminal downloads it, your computer does not block it: no "Open Anyway", no security warning.</p>
|
| 104 |
<div class="dl-grid">
|
| 105 |
<article class="dl-card" data-os="mac">
|
|
|
|
| 31 |
<!-- ===== Landing ===== -->
|
| 32 |
<main id="landing">
|
| 33 |
<section class="wrap hero">
|
| 34 |
+
<p class="eyebrow"><img src="app/build/icon.png" alt="">Arx - Fine-tuned AI Model</p>
|
| 35 |
<h1>Is your computer secure?<br><span class="grad">Find out in a minute.</span></h1>
|
| 36 |
<p class="lead">A free audit of your Mac, Windows or Linux computer: <b><span data-count>70</span> checks</b> mapped to <b>ISO 27001</b>, <b>GDPR</b> and the <b>EU AI Act</b>. A small AI on your computer writes the report, and on Mac and Linux Arx can <b>fix problems for you</b>. It runs offline. <u>Nothing is uploaded.</u></p>
|
| 37 |
|
|
|
|
| 60 |
<label class="btn" for="reportFile" title="Open the …-evidence.json file Arx saves next to each report">Open a report</label>
|
| 61 |
<input type="file" id="reportFile" accept=".json,application/json" hidden>
|
| 62 |
</div>
|
| 63 |
+
<p class="tiny muted" id="heroMeta">Free · open source · version 0.5.4</p>
|
| 64 |
</section>
|
| 65 |
|
| 66 |
<section class="wrap">
|
|
|
|
| 99 |
</section>
|
| 100 |
|
| 101 |
<section class="wrap section" id="install">
|
| 102 |
+
<div class="section-head"><h2>Install Arx</h2><span class="tiny muted" id="dlVersion">Version 0.5.4</span></div>
|
| 103 |
<p class="muted install-why">One command installs Arx and opens it. It downloads Arx from Hugging Face, <b>checks its SHA-256 fingerprint</b> against the published one, and refuses to install if anything differs. Because Terminal downloads it, your computer does not block it: no "Open Anyway", no security warning.</p>
|
| 104 |
<div class="dl-grid">
|
| 105 |
<article class="dl-card" data-os="mac">
|