mirror of
https://github.com/okieselbach/AutopilotMonitor.git
synced 2026-10-24 04:32:32 +00:00
feat(legal,agent): professionalize Terms/Privacy; wire SendTraceEvents gate
Rework the public Terms of Use and Privacy Policy from their early-days wording to match how the service actually runs today, and fix a setting that looked like a privacy control but gated nothing. Legal positioning: - glueckkanja AG operates the service and is the counterparty on BOTH plans (Community/Enterprise is a flag in one system, one subscription). Oliver Kieselbach is named as creator and maintainer of the open-source project and the Community edition, acting on behalf of glueckkanja AG and explicitly not a separate contracting party. - Community: free, "AS-IS", no availability or support commitment. Enterprise: written agreement incl. DPA, higher limits, MSP delegation. - Added business-use-only clause, simplified governing law (dropped the CISG exclusion - it governs sale of goods, not SaaS), split liability per plan, added an MSP delegation section and a rules-contribution clause covering the community rule pool. - Imprint links to the glueckkanja AG imprint, whose scope clause covers every service linking to it - no duplicated company data to go stale. Reachable from the landing footer and both help menus. Privacy Policy corrections (previous claims were inaccurate): - "No personal data is transmitted" - backend telemetry carries the UPN; only the browser SDK is cookie- and UPN-free. - "Not shared with third parties" - qualified for MSP delegation, customer-configured notification channels, the customer's own LLM via MCP, and agent-side geolocation. - Removed "data subject rights are not guaranteed"; GDPR rights are not optional. Added region, sub-processors, retention and IP handling. Agent - SendTraceEvents gate: The setting was plumbed from TenantConfiguration through to AgentConfiguration but never consumed; Trace severity only hides an event from the timeline view. The outbound IP was therefore always collected when geolocation is on (which is the default). Gate is now enforced in TelemetryEventEmitter.Emit, the single choke point before the transport enqueue. Dropped before the sequence counter advances so suppression leaves no gaps. Evaluated per event via Func<bool> so a mid-session remote-config merge takes effect. Fails open: an unwired or throwing accessor lets trace events flow, because the gate suppresses diagnostics and must not silently blind the timeline. Default stays on and the switch remains operator-only via the config table - deliberately not surfaced in the UI or documentation. Verified: solution builds clean, 1873 agent core tests pass, tsc --noEmit clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+96
-2
@@ -17,13 +17,25 @@ namespace AutopilotMonitor.Agent.V2.Core.Tests.Telemetry.Events
|
||||
FakeTelemetryTransport transport,
|
||||
out EventSequenceCounter counter,
|
||||
string sessionId = "sess-1",
|
||||
string tenantId = "tenant-1")
|
||||
string tenantId = "tenant-1",
|
||||
Func<bool>? traceEventsEnabled = null)
|
||||
{
|
||||
var tmp = new TempDirectory();
|
||||
counter = new EventSequenceCounter(new EventSequencePersistence(tmp.File("seq.json")));
|
||||
return new TelemetryEventEmitter(transport, counter, sessionId, tenantId);
|
||||
return new TelemetryEventEmitter(transport, counter, sessionId, tenantId, traceEventsEnabled);
|
||||
}
|
||||
|
||||
private static EnrollmentEvent NewTraceEvent(string eventType = "outbound_ip") =>
|
||||
new EnrollmentEvent
|
||||
{
|
||||
EventType = eventType,
|
||||
Severity = EventSeverity.Trace,
|
||||
Source = "test",
|
||||
Timestamp = At,
|
||||
Phase = EnrollmentPhase.Unknown,
|
||||
Message = "trace message",
|
||||
};
|
||||
|
||||
private static EnrollmentEvent NewTestEvent(string eventType = "enrollment_complete") =>
|
||||
new EnrollmentEvent
|
||||
{
|
||||
@@ -49,6 +61,7 @@ namespace AutopilotMonitor.Agent.V2.Core.Tests.Telemetry.Events
|
||||
Assert.Equal("sess-1", evt.SessionId);
|
||||
Assert.Equal("tenant-1", evt.TenantId);
|
||||
|
||||
Assert.NotNull(item);
|
||||
Assert.Equal(TelemetryItemKind.Event, item.Kind);
|
||||
Assert.Equal("tenant-1_sess-1", item.PartitionKey);
|
||||
Assert.Equal(evt.RowKey, item.RowKey);
|
||||
@@ -174,5 +187,86 @@ namespace AutopilotMonitor.Agent.V2.Core.Tests.Telemetry.Events
|
||||
Assert.Equal("test-reason", (string?)data["reason"]);
|
||||
Assert.Equal("Strong", (string?)data["wgConfidence"]);
|
||||
}
|
||||
|
||||
// ============================================================ Trace-event gate
|
||||
|
||||
[Fact]
|
||||
public void Trace_event_is_dropped_when_gate_is_off()
|
||||
{
|
||||
var transport = new FakeTelemetryTransport();
|
||||
var emitter = Build(transport, out _, traceEventsEnabled: () => false);
|
||||
|
||||
var item = emitter.Emit(NewTraceEvent());
|
||||
|
||||
Assert.Null(item);
|
||||
Assert.Equal(0, transport.EnqueueCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Trace_event_flows_when_gate_is_on()
|
||||
{
|
||||
var transport = new FakeTelemetryTransport();
|
||||
var emitter = Build(transport, out _, traceEventsEnabled: () => true);
|
||||
|
||||
Assert.NotNull(emitter.Emit(NewTraceEvent()));
|
||||
Assert.Equal(1, transport.EnqueueCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Trace_event_flows_when_no_gate_is_wired()
|
||||
{
|
||||
var transport = new FakeTelemetryTransport();
|
||||
var emitter = Build(transport, out _);
|
||||
|
||||
Assert.NotNull(emitter.Emit(NewTraceEvent()));
|
||||
Assert.Equal(1, transport.EnqueueCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Gate_off_does_not_suppress_non_trace_events()
|
||||
{
|
||||
var transport = new FakeTelemetryTransport();
|
||||
var emitter = Build(transport, out _, traceEventsEnabled: () => false);
|
||||
|
||||
foreach (var severity in new[] { EventSeverity.Info, EventSeverity.Warning, EventSeverity.Error })
|
||||
{
|
||||
var evt = NewTestEvent();
|
||||
evt.Severity = severity;
|
||||
Assert.NotNull(emitter.Emit(evt));
|
||||
}
|
||||
|
||||
Assert.Equal(3, transport.EnqueueCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dropped_trace_event_does_not_consume_a_sequence_number()
|
||||
{
|
||||
var transport = new FakeTelemetryTransport();
|
||||
var traceAllowed = true;
|
||||
// ReSharper disable once AccessToModifiedClosure — deliberate: the gate is read
|
||||
// per event, mirroring a mid-session remote-config merge.
|
||||
var emitter = Build(transport, out _, traceEventsEnabled: () => traceAllowed);
|
||||
|
||||
emitter.Emit(NewTestEvent()); // seq 1
|
||||
traceAllowed = false;
|
||||
emitter.Emit(NewTraceEvent()); // dropped — must not burn seq 2
|
||||
emitter.Emit(NewTestEvent()); // seq 2
|
||||
|
||||
Assert.Equal(2, transport.EnqueueCount);
|
||||
var first = JObject.Parse(transport.Enqueued[0].PayloadJson);
|
||||
var second = JObject.Parse(transport.Enqueued[1].PayloadJson);
|
||||
Assert.Equal(1, (long)first["Sequence"]!);
|
||||
Assert.Equal(2, (long)second["Sequence"]!);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Throwing_gate_fails_open_so_diagnostics_are_never_silently_lost()
|
||||
{
|
||||
var transport = new FakeTelemetryTransport();
|
||||
var emitter = Build(transport, out _, traceEventsEnabled: () => throw new InvalidOperationException("boom"));
|
||||
|
||||
Assert.NotNull(emitter.Emit(NewTraceEvent()));
|
||||
Assert.Equal(1, transport.EnqueueCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,6 +86,11 @@ namespace AutopilotMonitor.Agent.V2.Core.Orchestration
|
||||
// Production always passes null → Start() creates the real DeadlineScheduler.
|
||||
private readonly IDeadlineScheduler? _schedulerOverride;
|
||||
|
||||
// Live accessor for TenantConfiguration.SendTraceEvents — read per event by the
|
||||
// TelemetryEventEmitter so a mid-session remote-config merge takes effect. Null
|
||||
// (tests / legacy callers) means trace events always flow.
|
||||
private readonly Func<bool>? _traceEventsEnabled;
|
||||
|
||||
// Max-lifetime watchdog (M4.6.α). Timer is armed in Start() when _agentMaxLifetime != null.
|
||||
private System.Threading.Timer? _maxLifetimeTimer;
|
||||
private int _terminatedFired;
|
||||
@@ -166,7 +171,8 @@ namespace AutopilotMonitor.Agent.V2.Core.Orchestration
|
||||
TimeSpan? terminalDrainTimeout = null,
|
||||
TimeSpan? agentMaxLifetime = null,
|
||||
int uploadBatchSize = 100,
|
||||
IDeadlineScheduler? schedulerOverride = null)
|
||||
IDeadlineScheduler? schedulerOverride = null,
|
||||
Func<bool>? traceEventsEnabled = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(sessionId)) throw new ArgumentException("SessionId is mandatory.", nameof(sessionId));
|
||||
if (string.IsNullOrEmpty(tenantId)) throw new ArgumentException("TenantId is mandatory.", nameof(tenantId));
|
||||
@@ -206,6 +212,7 @@ namespace AutopilotMonitor.Agent.V2.Core.Orchestration
|
||||
_uploadBatchSize = uploadBatchSize;
|
||||
|
||||
_schedulerOverride = schedulerOverride;
|
||||
_traceEventsEnabled = traceEventsEnabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -402,7 +409,8 @@ namespace AutopilotMonitor.Agent.V2.Core.Orchestration
|
||||
// strukturelle Abhängigkeit erlischt damit, Architektur-Baseline-Test gate
|
||||
// shrinks to exactly two permitted callers.
|
||||
_eventSequenceCounter = new EventSequenceCounter(_eventSequencePersistence);
|
||||
var eventEmitter = new TelemetryEventEmitter(_transport, _eventSequenceCounter, _sessionId, _tenantId);
|
||||
var eventEmitter = new TelemetryEventEmitter(
|
||||
_transport, _eventSequenceCounter, _sessionId, _tenantId, _traceEventsEnabled);
|
||||
_signalEmitter = new TelemetrySignalEmitter(_transport, _sessionId, _tenantId);
|
||||
_transitionEmitter = new TelemetryTransitionEmitter(_transport, _sessionId, _tenantId);
|
||||
_timelineEmitter = new EventTimelineEmitter(eventEmitter);
|
||||
|
||||
@@ -30,12 +30,14 @@ namespace AutopilotMonitor.Agent.V2.Core.Telemetry.Events
|
||||
private readonly string _sessionId;
|
||||
private readonly string _tenantId;
|
||||
private readonly string _partitionKey;
|
||||
private readonly Func<bool>? _traceEventsEnabled;
|
||||
|
||||
public TelemetryEventEmitter(
|
||||
ITelemetryTransport transport,
|
||||
EventSequenceCounter sequenceCounter,
|
||||
string sessionId,
|
||||
string tenantId)
|
||||
string tenantId,
|
||||
Func<bool>? traceEventsEnabled = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(sessionId)) throw new ArgumentException("SessionId is mandatory.", nameof(sessionId));
|
||||
if (string.IsNullOrEmpty(tenantId)) throw new ArgumentException("TenantId is mandatory.", nameof(tenantId));
|
||||
@@ -44,13 +46,18 @@ namespace AutopilotMonitor.Agent.V2.Core.Telemetry.Events
|
||||
_sessionId = sessionId;
|
||||
_tenantId = tenantId;
|
||||
_partitionKey = $"{tenantId}_{sessionId}";
|
||||
_traceEventsEnabled = traceEventsEnabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Weist Sequence zu, serialisiert im Legacy-Wire-Format und enqueued via Transport.
|
||||
/// Thread-safe (EventSequenceCounter + ITelemetryTransport.Enqueue beide unter Lock).
|
||||
/// <para>
|
||||
/// Returns <c>null</c> when the event was suppressed by the trace-event gate — the
|
||||
/// only drop path. Both permitted callers ignore the return value.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
internal TelemetryItem Emit(EnrollmentEvent evt)
|
||||
internal TelemetryItem? Emit(EnrollmentEvent evt)
|
||||
{
|
||||
if (evt == null) throw new ArgumentNullException(nameof(evt));
|
||||
if (string.IsNullOrEmpty(evt.EventType))
|
||||
@@ -58,6 +65,16 @@ namespace AutopilotMonitor.Agent.V2.Core.Telemetry.Events
|
||||
throw new ArgumentException("EnrollmentEvent.EventType is mandatory.", nameof(evt));
|
||||
}
|
||||
|
||||
// Trace-event gate (TenantConfiguration.SendTraceEvents, default on). Dropped
|
||||
// before the sequence counter advances, so suppression leaves no gaps in the
|
||||
// per-session sequence and the timeline stays contiguous. Evaluated per event
|
||||
// rather than captured at construction: remote config is merged into the live
|
||||
// AgentConfiguration mid-session, and the gate must follow it.
|
||||
if (evt.Severity == EventSeverity.Trace && !TraceEventsEnabled())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
evt.Sequence = _sequenceCounter.Next();
|
||||
if (string.IsNullOrEmpty(evt.SessionId)) evt.SessionId = _sessionId;
|
||||
if (string.IsNullOrEmpty(evt.TenantId)) evt.TenantId = _tenantId;
|
||||
@@ -77,5 +94,23 @@ namespace AutopilotMonitor.Agent.V2.Core.Telemetry.Events
|
||||
|
||||
return _transport.Enqueue(draft);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fail-open: no gate wired (legacy ctor / tests) or a throwing accessor means trace
|
||||
/// events flow. The gate suppresses diagnostics, so a broken accessor must not be able
|
||||
/// to silently blind the timeline.
|
||||
/// </summary>
|
||||
private bool TraceEventsEnabled()
|
||||
{
|
||||
if (_traceEventsEnabled == null) return true;
|
||||
try
|
||||
{
|
||||
return _traceEventsEnabled();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,7 +132,10 @@ namespace AutopilotMonitor.Agent.V2.Runtime
|
||||
whiteGloveSealingPatternIds: whiteGloveSealingPatternIds,
|
||||
drainInterval: drainInterval,
|
||||
agentMaxLifetime: agentMaxLifetime,
|
||||
uploadBatchSize: uploadBatchSize))
|
||||
uploadBatchSize: uploadBatchSize,
|
||||
// Live read: remote config is merged into agentConfig mid-session, so the
|
||||
// trace-event gate must follow it rather than snapshot at construction.
|
||||
traceEventsEnabled: () => agentConfig.SendTraceEvents))
|
||||
{
|
||||
using (var shutdown = new ManualResetEventSlim(false))
|
||||
using (var shutdownComplete = new ManualResetEventSlim(false))
|
||||
|
||||
@@ -249,11 +249,17 @@ export default function AboutPage() {
|
||||
extended by the wider Windows Autopilot community.
|
||||
</p>
|
||||
<p className="text-gray-700 leading-relaxed mb-4">
|
||||
Autopilot Monitor was created by{" "}
|
||||
Autopilot Monitor was created and is maintained by{" "}
|
||||
<strong>Oliver Kieselbach</strong>, a Microsoft MVP and long-time contributor to the Windows
|
||||
Autopilot and Microsoft Intune community. The project is driven by real-world enterprise
|
||||
deployment experience and community feedback.
|
||||
</p>
|
||||
<p className="text-gray-700 leading-relaxed mb-4">
|
||||
The hosted service is operated by <strong>glueckkanja AG</strong> — see the{" "}
|
||||
<a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:text-blue-800 underline">Imprint</a> for company
|
||||
details and the <Link href="/terms" className="text-blue-600 hover:text-blue-800 underline">Terms of Use</Link>{" "}
|
||||
for what each plan does and does not commit to.
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-3 mt-5">
|
||||
<a
|
||||
href="https://github.com/okieselbach/Autopilot-Monitor"
|
||||
|
||||
@@ -838,6 +838,7 @@ export default function LandingPage() {
|
||||
<ul className="space-y-1.5">
|
||||
<li><a href="/privacy" className="text-xs text-gray-500 hover:text-blue-600 transition-colors">Privacy Policy</a></li>
|
||||
<li><a href="/terms" className="text-xs text-gray-500 hover:text-blue-600 transition-colors">Terms of Use</a></li>
|
||||
<li><a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="text-xs text-gray-500 hover:text-blue-600 transition-colors">Imprint</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -847,7 +848,7 @@ export default function LandingPage() {
|
||||
<div className="mt-8 pt-5 border-t border-gray-200 flex flex-col sm:flex-row items-center justify-between gap-2">
|
||||
<p className="text-[11px] text-gray-400">
|
||||
© 2026 Autopilot Monitor. Built with ❤️ by Oliver Kieselbach.{" "}
|
||||
<span className="inline-block">Powered by Azure.</span>
|
||||
<span className="inline-block">Hosted on Azure by glueckkanja AG.</span>
|
||||
</p>
|
||||
<p className="text-[11px] text-gray-400">
|
||||
Open source. Star us on{' '}
|
||||
|
||||
@@ -1,96 +1,212 @@
|
||||
import { PublicPageHeader } from "../../components/PublicPageHeader";
|
||||
|
||||
const LAST_UPDATED = "21 July 2026";
|
||||
const DOCS_SECURITY_FAQ = "https://docs.autopilotmonitor.com/trust/security-faq";
|
||||
const DOCS_SUBPROCESSORS = "https://docs.autopilotmonitor.com/trust/subprocessors";
|
||||
|
||||
function DocsLink({ href, children }: { href: string; children: React.ReactNode }) {
|
||||
return (
|
||||
<a
|
||||
href={href}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-indigo-600 hover:text-indigo-800 underline"
|
||||
>
|
||||
{children}
|
||||
</a>
|
||||
);
|
||||
}
|
||||
|
||||
export default function PrivacyPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-50">
|
||||
<PublicPageHeader title="Privacy Policy" />
|
||||
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8 space-y-6">
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Data Collection</h2>
|
||||
<p className="text-sm text-gray-500">Last updated: {LAST_UPDATED}</p>
|
||||
<p className="text-gray-700">
|
||||
This service collects and processes the following data to provide monitoring functionality:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>Device hardware information (manufacturer, model, serial number)</li>
|
||||
<li>Autopilot provisioning session data (status, events, timestamps)</li>
|
||||
<li>Azure AD/Entra ID tenant information</li>
|
||||
<li>User authentication information (UPN, display name, tenant ID)</li>
|
||||
<li>Operational telemetry and audit logs</li>
|
||||
<li>Anonymized usage telemetry (via Azure Application Insights, no cookies) — used to understand which features are used and improve the service. No personal data is transmitted.</li>
|
||||
</ul>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Data Processing Context</h2>
|
||||
<p className="text-gray-700">
|
||||
During an Autopilot enrollment, the user authenticates solely to verify their identity and initiate the process.
|
||||
After that, the user is not actively interacting with the device while provisioning runs. As a result, the data
|
||||
collected by the monitoring agent consists exclusively of <strong>technical enrollment events</strong> — no user
|
||||
activity, browsing data, or personal content is captured.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
Tenant administrators retain full control over collected data through the following options:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li><strong>Data Retention</strong> — configurable retention period per tenant (default 90 days); expired sessions are automatically purged</li>
|
||||
<li><strong>Delete Session</strong> — delete individual monitoring sessions on demand</li>
|
||||
<li><strong>Offboard Tenant</strong> — remove all data and configurations for a tenant from the service</li>
|
||||
</ul>
|
||||
<p className="text-gray-700">
|
||||
These controls ensure that no personal information accumulates in the backend beyond what is necessary for
|
||||
enrollment monitoring. The service is designed for operational transparency, not user surveillance.
|
||||
Autopilot Monitor collects technical telemetry about Windows Autopilot enrollments so that IT teams can see
|
||||
what happened during a device provisioning and why it failed. This policy explains what is collected, where it
|
||||
is stored, who can reach it, and how long it is kept. The technical detail behind every statement here is
|
||||
published in the <DocsLink href={DOCS_SECURITY_FAQ}>Security & Privacy FAQ</DocsLink>.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Data Storage & Security</h2>
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Roles: Who Is Responsible for What</h2>
|
||||
<p className="text-gray-700">
|
||||
The platform is built with a layered security architecture designed to protect data at every level:
|
||||
For enrollment telemetry, <strong>your organization is the controller and Autopilot Monitor acts as your
|
||||
processor</strong>. You decide which devices are monitored, what additional data your gather rules collect,
|
||||
how long it is retained, and when it is deleted.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
For operating the service itself — administrator accounts, the audit trail of portal actions, and operational
|
||||
telemetry — <strong>glueckkanja AG</strong> is the controller.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
glueckkanja AG, a German company certified to ISO/IEC 27001, operates Autopilot Monitor for{" "}
|
||||
<strong>both plans</strong> — the same service, the same infrastructure, the same protection measures. Company
|
||||
details are in the <a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">Imprint</a>.
|
||||
The project is maintained by Oliver Kieselbach, who acts in that role on behalf of glueckkanja AG and is the
|
||||
contact for the open-source project and the Community edition.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
A <strong>data processing agreement (DPA / AVV) is available on request</strong>, concluded with
|
||||
glueckkanja AG. On the Enterprise plan it forms part of the written agreement.
|
||||
</p>
|
||||
|
||||
<h3 className="text-lg font-medium text-gray-800 mt-4">Authentication & Device Identity</h3>
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">What We Collect</h2>
|
||||
<h3 className="text-lg font-medium text-gray-800 mt-4">From enrolling devices</h3>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>Device agents authenticate via <strong>Intune MDM client certificates</strong>, validated against the embedded Intune CA chain</li>
|
||||
<li>Web users authenticate via <strong>Microsoft Entra ID (Azure AD)</strong> with multi-tenant JWT validation</li>
|
||||
<li><strong>Autopilot device validation</strong> via Microsoft Graph — only registered Autopilot devices are accepted</li>
|
||||
<li>Optional <strong>hardware whitelist</strong> for additional device verification</li>
|
||||
<li>Per-device <strong>rate limiting</strong> (sliding window) to prevent abuse</li>
|
||||
<li><strong>Device identity</strong> — serial number, device name, manufacturer, model, and the Entra ID tenant the device enrolls into</li>
|
||||
<li><strong>Enrollment progress</strong> — phases, ESP stages, application and script results, policy activity, reboots, timings, and failure codes</li>
|
||||
<li><strong>Device context</strong> — OS build, hardware characteristics, disk and network state, plus whatever your own gather rules request</li>
|
||||
<li><strong>Approximate location</strong> — country, region, city, and approximate coordinates, if geolocation is enabled for your tenant</li>
|
||||
</ul>
|
||||
|
||||
<h3 className="text-lg font-medium text-gray-800 mt-4">Tenant Isolation</h3>
|
||||
<h3 className="text-lg font-medium text-gray-800 mt-4">From portal users</h3>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>Strict <strong>multi-tenant data isolation</strong> — all storage queries are partitioned by Tenant ID</li>
|
||||
<li>Real-time channels (SignalR) are scoped to <strong>tenant-specific groups</strong></li>
|
||||
<li>Independent configuration, audit logs, and device management per tenant</li>
|
||||
<li>Sign-in identity from Microsoft Entra ID — user principal name, display name, and tenant ID</li>
|
||||
<li>Audit records of administrative actions, including who performed them and when</li>
|
||||
<li>Operational request telemetry used to run and support the service</li>
|
||||
</ul>
|
||||
|
||||
<h3 className="text-lg font-medium text-gray-800 mt-4">Transport & Data Protection</h3>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>All communication encrypted via <strong>HTTPS/TLS</strong>; real-time updates via secure WebSocket</li>
|
||||
<li>Diagnostics upload URLs are issued on-demand, and never persisted on the device</li>
|
||||
<li>Azure Storage encryption at rest for all persisted data</li>
|
||||
<li>PII logging disabled in production environments</li>
|
||||
</ul>
|
||||
|
||||
<h3 className="text-lg font-medium text-gray-800 mt-4">Access Control</h3>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li><strong>Role-based access</strong>: Tenant Admin (full tenant management), Operator, Users</li>
|
||||
<li>Device blocking capabilities for compromised or unauthorized devices</li>
|
||||
<li>Comprehensive <strong>audit logging</strong> of administrative actions</li>
|
||||
</ul>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Data Sharing</h2>
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">What We Do Not Collect</h2>
|
||||
<p className="text-gray-700">
|
||||
Your data is not shared with third parties. Access is restricted to:
|
||||
During Autopilot provisioning the user signs in once to start the process and then does not interact with the
|
||||
device while it provisions. The agent captures <strong>no browsing history, no file or document content, no
|
||||
keystrokes, no screen content, and no application usage tracking</strong>. It removes itself when enrollment
|
||||
finishes. The service is designed for operational transparency, not user surveillance.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
Gather rules cannot be used to widen this: <code className="text-sm bg-gray-100 px-1 py-0.5 rounded">C:\Users</code>{" "}
|
||||
is always blocked for privacy reasons, and downloading files, creating users, manipulating boot configuration,
|
||||
and establishing persistence are hard-blocked and cannot be enabled by configuration.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">IP Addresses and Geolocation</h2>
|
||||
<p className="text-gray-700">
|
||||
Geolocation is a tenant setting and is <strong>enabled by default</strong>. While it is enabled:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>Authenticated users within your tenant</li>
|
||||
<li>Global Administrators (for platform operations and support)</li>
|
||||
<li>The <strong>session record</strong> stores only the derived location — country, region, city, and approximate coordinates. The IP is deliberately excluded from the location event shown in the timeline.</li>
|
||||
<li>The <strong>outbound public IP is additionally stored once per session as a separate diagnostic event.</strong> It is hidden from the timeline view by default, but it is retained and queryable, and it expires with your retention period like any other event.</li>
|
||||
<li>Service request telemetry does not carry device IP addresses; the platform masks them and the application never sets them.</li>
|
||||
<li>A source IP is also stored on <strong>distress reports</strong> — the emergency channel an agent uses to report that it is failing — as part of that incident record.</li>
|
||||
</ul>
|
||||
<p className="text-gray-700">
|
||||
<strong>Disabling geolocation stops all of this</strong> — no IP and no location data is collected. It is a
|
||||
tenant setting and also an agent command-line switch. Only the Geographic Performance view is affected.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Where Your Data Is Stored</h2>
|
||||
<p className="text-gray-700">
|
||||
All customer data — sessions, events, configuration, audit logs, diagnostics, and backups — is stored in
|
||||
Microsoft Azure in <strong>Germany West Central</strong>. The only component outside that region is the portal
|
||||
front-end, served as static assets from West Europe; it stores no customer data. There is no cross-region
|
||||
replication and no transfer of customer data outside the EU by the platform.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Who Can Access Your Data</h2>
|
||||
<p className="text-gray-700">
|
||||
Your data is not sold, and it is not shared with third parties for their own purposes. Access is limited to:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li><strong>Authenticated users in your own tenant</strong>, according to their role — Admin, Operator, Viewer, or a role-less Member limited to the Progress Portal</li>
|
||||
<li><strong>Platform operators</strong> — Global Admin for operations and support, and Global Reader for read-only support with configuration secrets redacted</li>
|
||||
<li><strong>Delegated (MSP) administrators you or your provider have been granted</strong> — read-only, limited to exactly the tenants in scope, with configuration secrets redacted, and with every grant and revocation written to <em>your</em> tenant's audit log so you can always see who was given access to your data</li>
|
||||
</ul>
|
||||
<p className="text-gray-700">
|
||||
Delegated administration is an Enterprise capability and is off unless explicitly granted. Full detail on the
|
||||
isolation model is in the <DocsLink href={DOCS_SECURITY_FAQ}>Security & Privacy FAQ</DocsLink>.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Sub-processors and Outbound Data Flows</h2>
|
||||
<p className="text-gray-700">
|
||||
<strong>Microsoft Azure is the only sub-processor that stores your data.</strong> Resend is used solely to
|
||||
deliver the onboarding approval email when a tenant is activated — it receives an administrator's email
|
||||
address and the tenant domain, never enrollment telemetry. Vulnerability reference data is pulled inbound from
|
||||
NVD, the CISA KEV catalog, and MSRC; no customer data is sent to them.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
Some data flows exist only because you configure them: your own Azure storage account for diagnostics,
|
||||
notification channels such as Teams, Slack, or a generic webhook, and your own AI assistant if a user connects
|
||||
one through the MCP integration. The platform itself makes no calls to any AI or LLM provider. The complete
|
||||
list is published as <DocsLink href={DOCS_SUBPROCESSORS}>Sub-processors</DocsLink>, and new sub-processors are
|
||||
announced there before they are introduced.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Diagnostics Uploads</h2>
|
||||
<p className="text-gray-700">
|
||||
Diagnostics upload is <strong>off by default</strong>. When enabled, the default destination is{" "}
|
||||
<strong>your own Azure storage account</strong> — the package never reaches our infrastructure. Hosted upload
|
||||
exists as an alternative but is opt-in only and requires an explicit administrator action behind a clearly
|
||||
marked disclosure that data leaves your tenant. It is never enabled silently.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">How Long We Keep Data</h2>
|
||||
<p className="text-gray-700">
|
||||
Retention is <strong>configured by you per tenant, defaulting to 90 days</strong> — 7 to 90 days on the
|
||||
Community plan and 7 to 365 days on Enterprise. Expired sessions are purged automatically. You additionally
|
||||
control:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li><strong>Delete session</strong> — remove an individual monitoring session on demand</li>
|
||||
<li><strong>Offboard tenant</strong> — remove your tenant's data and configuration from the service entirely, as a verified multi-phase cascade</li>
|
||||
</ul>
|
||||
<p className="text-gray-700">
|
||||
Two things intentionally survive tenant offboarding, neither of which contains enrollment telemetry or
|
||||
personal data:
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li><strong>Product feedback</strong> you submitted — it is not tied to enrollment data and is what improves the product.</li>
|
||||
<li><strong>Custom rules and IME log patterns</strong> you authored are archived rather than deleted. Detection knowledge is what makes this product useful, so contributed rules and patterns are subject to entering the community pool — the next organization hitting the same enrollment failure gets a diagnosis instead of a mystery. A rule is a detection definition, not device data.</li>
|
||||
</ul>
|
||||
<p className="text-gray-700">
|
||||
Either can be removed on request.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">How Your Data Is Protected</h2>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li><strong>Device authentication by mutual TLS</strong> using the Intune MDM client certificate, validated against pinned Intune root CAs rather than the operating system trust store — and rejected if no trust anchor loads</li>
|
||||
<li><strong>Autopilot device validation via Microsoft Graph</strong> — only devices registered in your tenant are accepted, with an optional hardware allow-list on top</li>
|
||||
<li><strong>Entra ID authentication</strong> for portal users with a restricted signing-algorithm allow-list and identity PII logging disabled</li>
|
||||
<li><strong>Fail-closed authorization</strong> — every API route must be registered with an access policy; an unregistered route is unreachable</li>
|
||||
<li><strong>Structural tenant isolation</strong> — storage partitioning by tenant, with the tenant identity taken from the validated token and never from a client-supplied header</li>
|
||||
<li><strong>Encryption</strong> — HTTPS with a TLS 1.2 floor in transit, Azure Storage encryption at rest with platform-managed keys</li>
|
||||
<li><strong>Managed identity instead of storage keys</strong>, and secret-less OIDC deployment pipelines</li>
|
||||
<li><strong>Rate limiting</strong> per device, per portal user, and per MCP user</li>
|
||||
<li><strong>Verifiable agent binaries</strong> — Sigstore build attestation plus a four-stage integrity chain through download, backend cross-check, and runtime self-verification</li>
|
||||
<li><strong>Manifest-first deletion</strong> — what will be deleted is captured, restorably, before anything is removed</li>
|
||||
</ul>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Your Rights</h2>
|
||||
<p className="text-gray-700">
|
||||
As this is an environment operated under best-effort principles, formal data subject rights (access, deletion, portability)
|
||||
are not guaranteed. However, we will make reasonable efforts to accommodate such requests on a case-by-case basis.
|
||||
Where the GDPR applies, you have the right to access, correction, deletion, restriction of processing,
|
||||
portability, and to object to processing. We act on such requests within the statutory time limits. In
|
||||
practice most requests resolve immediately in the portal, because deletion of individual sessions, full tenant
|
||||
offboarding, and the retention period are all controls you hold yourself.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
Where Autopilot Monitor acts as your processor, requests from your own employees should be directed to your
|
||||
organization; we support you in fulfilling them.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Changes to This Policy</h2>
|
||||
<p className="text-gray-700">
|
||||
Material changes are reflected in the "last updated" date above and announced through the service
|
||||
announcements in the portal. If you hold a signed data processing agreement, notification follows the terms of
|
||||
that agreement.
|
||||
</p>
|
||||
|
||||
<h2 className="text-xl font-semibold text-gray-900 mt-6">Contact</h2>
|
||||
<p className="text-gray-700">
|
||||
For privacy questions, a data processing agreement, or a data subject request, contact glueckkanja AG using
|
||||
the details in the <a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">Imprint</a>.
|
||||
For the open-source project and the Community edition you can also reach the maintainer via{" "}
|
||||
<a href="https://www.linkedin.com/in/oliver-kieselbach" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">LinkedIn</a>{" "}
|
||||
or open a{" "}
|
||||
<a href="https://github.com/okieselbach/Autopilot-Monitor/issues" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">GitHub issue</a>.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,47 +1,142 @@
|
||||
import { PublicPageHeader } from "../../components/PublicPageHeader";
|
||||
|
||||
const LAST_UPDATED = "21 July 2026";
|
||||
const DOCS_SECURITY_FAQ = "https://docs.autopilotmonitor.com/trust/security-faq";
|
||||
const DOCS_PLANS = "https://docs.autopilotmonitor.com/plans";
|
||||
|
||||
export default function TermsPage() {
|
||||
return (
|
||||
<div className="min-h-screen bg-gray-50">
|
||||
<PublicPageHeader title="Terms of Use" />
|
||||
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8 space-y-6">
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<p className="text-sm text-gray-500">Last updated: {LAST_UPDATED}</p>
|
||||
<p className="text-gray-700">
|
||||
By using this service, you agree to the following terms:
|
||||
Autopilot Monitor is provided by <strong>glueckkanja AG</strong>, a German company certified to ISO/IEC
|
||||
27001 — see the <a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">Imprint</a>.
|
||||
Both plans run on the same service and the same infrastructure; the plan determines operating limits,
|
||||
support, and contractual commitments, not how the service works.
|
||||
</p>
|
||||
<p className="text-gray-700">
|
||||
The project was created and is maintained by <strong>Oliver Kieselbach</strong>, who is also the contact for
|
||||
the open-source project and the Community edition. He acts in that role on behalf of glueckkanja AG; he is
|
||||
not a separate contracting party.
|
||||
</p>
|
||||
|
||||
<div className="grid gap-4 md:grid-cols-2 mt-4">
|
||||
<div className="p-4 border border-gray-200 rounded-lg">
|
||||
<h3 className="font-semibold text-gray-900 mb-1">Community</h3>
|
||||
<p className="text-sm text-gray-700">
|
||||
Free, invite-only, currently in Private Preview, and maintained by Oliver Kieselbach as an open
|
||||
community contribution. Provided <strong>without any commitment by glueckkanja AG</strong> as to
|
||||
availability, support, or fitness for a particular purpose. Support is community-based via GitHub.
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-4 border border-gray-200 rounded-lg">
|
||||
<h3 className="font-semibold text-gray-900 mb-1">Enterprise</h3>
|
||||
<p className="text-sm text-gray-700">
|
||||
Commercial plan under a written agreement with glueckkanja AG. Includes support and reliability
|
||||
commitments, a data processing agreement, higher operating limits, extended retention, and delegated
|
||||
(MSP) administration. Where that agreement differs from these terms, the agreement prevails.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-gray-700">
|
||||
The sections below apply to both plans unless stated otherwise. Plan details are documented under{" "}
|
||||
<a href={DOCS_PLANS} target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">Plans</a>.
|
||||
</p>
|
||||
|
||||
<div className="bg-blue-50 border-l-4 border-blue-400 p-4 rounded">
|
||||
<p className="text-blue-900 text-sm">
|
||||
<strong>Business use only.</strong> Autopilot Monitor is offered exclusively to businesses and
|
||||
organizations acting in a commercial or professional capacity. It is not offered to consumers.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Acceptable Use</h2>
|
||||
<p className="text-gray-700">By using this service, you agree that:</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>The service is used to monitor and troubleshoot Windows Autopilot deployments for devices your organization is entitled to manage.</li>
|
||||
<li>You are responsible for ensuring your use complies with your organization's policies, your works council or employee representation obligations, and applicable law — including informing your users about monitoring where required.</li>
|
||||
<li>Access requires authentication via Microsoft Entra ID, and each tenant's data is accessible only to authorized users of that tenant, or to parties you have granted delegated access.</li>
|
||||
<li>You will not attempt to access another tenant's data, circumvent security controls, or probe the service for vulnerabilities without prior written agreement.</li>
|
||||
<li>You will not use gather rules or any other configuration to collect data unrelated to enrollment diagnostics, or to monitor individual employees.</li>
|
||||
<li>You will not use the service to build a competing product, or resell access without an agreement permitting it.</li>
|
||||
<li>Automated access, including through the MCP integration, stays within the published rate limits and quotas.</li>
|
||||
</ul>
|
||||
<p className="text-gray-700">
|
||||
Responsible disclosure of a security issue is welcome and will not be treated as a violation — report it
|
||||
privately rather than publicly.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Delegated (MSP) Administration</h2>
|
||||
<p className="text-gray-700">
|
||||
Delegated administration lets a managing organization see a defined set of customer tenants from one place. It
|
||||
is an Enterprise capability and applies only where access has been granted.
|
||||
</p>
|
||||
<ul className="list-disc list-inside space-y-2 text-gray-700 ml-4">
|
||||
<li>This service is provided for monitoring and troubleshooting Windows Autopilot deployments in your organization.</li>
|
||||
<li>You are responsible for ensuring that your use of this service complies with your organization's policies and applicable laws.</li>
|
||||
<li>Access to this service requires proper authentication via Azure AD/Entra ID.</li>
|
||||
<li>Each tenant's data is isolated and accessible only to authorized users of that tenant.</li>
|
||||
<li>You must not attempt to access data belonging to other tenants or circumvent security measures.</li>
|
||||
<li>The service operator reserves the right to suspend or terminate access at any time without prior notice.</li>
|
||||
<li>Delegated access is <strong>read-only</strong> and limited to exactly the tenants in scope. Configuration secrets are redacted.</li>
|
||||
<li>A grant is either assigned by platform operators or delegated by the customer's own tenant admin; customer-initiated delegations require approval before they take effect.</li>
|
||||
<li>Every grant, revocation, and disablement is recorded in the <strong>managed customer tenant's</strong> audit log, so a customer can always determine who holds access to their data.</li>
|
||||
<li>A managing organization acts as a processor or sub-processor of its customers and is responsible for having the necessary agreements in place with them.</li>
|
||||
<li>Access can be revoked at any time by the customer or by platform operators and takes effect within seconds.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Legal Disclaimer</h2>
|
||||
<h2 className="text-xl font-semibold text-gray-900">Availability, Support and Data</h2>
|
||||
|
||||
<div className="bg-amber-50 border-l-4 border-amber-500 p-4 rounded">
|
||||
<h3 className="font-semibold text-amber-900 mb-2">AS-IS, No Warranty</h3>
|
||||
<h3 className="font-semibold text-amber-900 mb-2">Community plan: provided "AS-IS", no warranty</h3>
|
||||
<p className="text-amber-800 text-sm">
|
||||
This software is provided "AS-IS" without any warranty of any kind, either expressed or implied,
|
||||
including but not limited to the implied warranties of merchantability and fitness for a particular purpose.
|
||||
The Community plan is provided free of charge, "AS-IS", and without warranty of any kind, express
|
||||
or implied, including the implied warranties of merchantability and fitness for a particular purpose. It is
|
||||
currently in Private Preview: updates are frequent, availability is not guaranteed, and data structures may
|
||||
change. Production use is permitted and intended — with that trade-off understood.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-2 text-gray-700">
|
||||
<p><strong>No Liability:</strong> The service operator shall not be liable for any damages, including but not limited to direct, indirect, incidental, special, consequential, or punitive damages arising out of the use or inability to use this service.</p>
|
||||
<p><strong>No Service Level Agreement (SLA):</strong> This service is provided without any guaranteed uptime or availability. Service interruptions, maintenance windows, or complete shutdown may occur without prior notice.</p>
|
||||
<p><strong>No Data Backup Guarantee:</strong> While we implement data retention policies, we do not guarantee the preservation of your data. You are responsible for maintaining your own backups and records.</p>
|
||||
<p><strong>Best Effort Support:</strong> Support is provided on a best-effort basis with no guaranteed response times or resolution commitments.</p>
|
||||
<p><strong>Use at Your Own Risk:</strong> By using this service, you acknowledge that you do so at your own risk and that you are solely responsible for any consequences arising from your use of the service.</p>
|
||||
<p><strong>Active Development Notice:</strong> This project is under active development. Service interruptions or unexpected behavior can occur at any time, especially when updates are deployed to the backend, web application, or agent components.</p>
|
||||
<p><strong>Availability.</strong> The Community plan carries no uptime or availability commitment; interruptions, maintenance, and changes can occur without prior notice. The Enterprise plan carries the availability commitments set out in its agreement.</p>
|
||||
<p><strong>Support.</strong> Community support is best-effort via <a href="https://github.com/okieselbach/Autopilot-Monitor/issues" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">GitHub issues</a>, provided by the project maintainer and the community, with no guaranteed response or resolution time; built-in rules and IME log patterns are community-maintained. Enterprise support follows the response commitments in its agreement.</p>
|
||||
<p><strong>Data durability.</strong> Autopilot Monitor is a monitoring system, not a system of record. Configuration, authorization, and rule data is backed up daily; session and event telemetry is time-bounded operational data and is <strong>not</strong> backed up. Retain anything you need for compliance or reporting purposes in your own systems.</p>
|
||||
<p><strong>Liability.</strong> To the extent permitted by law, glueckkanja AG is not liable for indirect, incidental, special, consequential, or punitive damages, or for loss of data, profit, or business, arising from use of or inability to use the service. For the Community plan, which is provided free of charge, liability is limited to intent and gross negligence. Liability for injury to life, body or health and under mandatory statutory provisions remains unaffected. For the Enterprise plan, the liability provisions of the written agreement apply.</p>
|
||||
<p><strong>Use at your own risk.</strong> The service reports on enrollments; it does not perform them. Operational decisions you take based on its output remain your responsibility.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Third-Party Data Sources & Attributions</h2>
|
||||
<h2 className="text-xl font-semibold text-gray-900">Your Data, Suspension and Termination</h2>
|
||||
<div className="space-y-2 text-gray-700">
|
||||
<p><strong>Ownership.</strong> Your enrollment telemetry remains yours. Autopilot Monitor processes it to provide the service, as described in the <a href="/privacy" className="text-indigo-600 hover:text-indigo-800 underline">Privacy Policy</a>.</p>
|
||||
<p><strong>Your controls.</strong> You set the retention period, delete individual sessions, and offboard your tenant entirely at any time — no support ticket required.</p>
|
||||
<p><strong>Rules you contribute.</strong> Analyze rules, gather rules, and IME log patterns you author are detection definitions, not device data. By creating them you grant a non-exclusive, royalty-free right to retain them and to include them in the shared community rule pool, so that other organizations can benefit from a detection you built. This is the reciprocal side of a product whose built-in rules are community-maintained. You keep the right to use your own rules however you like, and you can request removal from the pool at any time.</p>
|
||||
<p><strong>Suspension.</strong> Access may be suspended where use threatens the integrity, security, or availability of the service or of other tenants — for example abusive request volumes or attempts to reach other tenants' data. Where circumstances permit, notice is given first.</p>
|
||||
<p><strong>Termination.</strong> You may stop using the service and offboard at any time. For the Community plan, the operator may discontinue the service or an individual tenant's access; reasonable advance notice will be given except where security requires immediate action. Enterprise termination follows its agreement.</p>
|
||||
<p><strong>After offboarding.</strong> Your tenant's data is removed through a verified multi-phase cascade. Product feedback you submitted, and custom rules and IME log patterns you authored, are intentionally retained — neither contains enrollment telemetry or personal data. Both are removed on request.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Security and Transparency</h2>
|
||||
<p className="text-gray-700">
|
||||
The vulnerability correlation feature uses the following external data sources to identify known vulnerabilities in installed software:
|
||||
The security architecture, data residency, sub-processors, retention and deletion behaviour, and an explicit
|
||||
statement of what the service does <em>not</em> do are published in the{" "}
|
||||
<a href={DOCS_SECURITY_FAQ} target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">Security & Privacy FAQ</a>.
|
||||
A signed data processing agreement is part of the Enterprise plan.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Third-Party Data Sources & Attributions</h2>
|
||||
<p className="text-gray-700">
|
||||
The vulnerability correlation feature uses the following external data sources to identify known
|
||||
vulnerabilities in installed software. These are inbound reference-data pulls — no customer data is sent to
|
||||
them.
|
||||
</p>
|
||||
<div className="space-y-3">
|
||||
<div className="p-4 border border-gray-200 rounded-lg">
|
||||
@@ -71,6 +166,15 @@ export default function TermsPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-white rounded-lg shadow p-6 space-y-4">
|
||||
<h2 className="text-xl font-semibold text-gray-900">Changes and Governing Law</h2>
|
||||
<div className="space-y-2 text-gray-700">
|
||||
<p><strong>Changes.</strong> These terms may be updated; the "last updated" date above reflects the current version, and material changes are announced through the service announcements in the portal. Continued use after a change constitutes acceptance.</p>
|
||||
<p><strong>Governing law.</strong> These terms are governed by German law. For the Enterprise plan, the governing-law and venue provisions of the written agreement apply.</p>
|
||||
<p><strong>Severability.</strong> If a provision is found unenforceable, the remaining provisions stay in effect.</p>
|
||||
<p><strong>Contact.</strong> Company details are in the <a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">Imprint</a>. For the project and the Community edition, reach the maintainer via <a href="https://www.linkedin.com/in/oliver-kieselbach" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">LinkedIn</a> or open a <a href="https://github.com/okieselbach/Autopilot-Monitor/issues" target="_blank" rel="noopener noreferrer" className="text-indigo-600 hover:text-indigo-800 underline">GitHub issue</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -536,6 +536,19 @@ export default function Navbar() {
|
||||
</svg>
|
||||
<span>Terms of Use</span>
|
||||
</Link>
|
||||
|
||||
<a
|
||||
href="https://www.glueckkanja.com/en/imprint"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full flex items-center gap-2.5 px-3 py-2 text-sm text-gray-700 hover:bg-gray-50 transition-colors"
|
||||
onClick={() => setShowHelp(false)}
|
||||
>
|
||||
<svg className="w-4 h-4 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" />
|
||||
</svg>
|
||||
<span>Imprint</span>
|
||||
</a>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -700,6 +713,10 @@ export default function Navbar() {
|
||||
<svg className="w-4 h-4 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}><path strokeLinecap="round" strokeLinejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" /></svg>
|
||||
<span>Terms of Use</span>
|
||||
</Link>
|
||||
<a href="https://www.glueckkanja.com/en/imprint" target="_blank" rel="noopener noreferrer" className="w-full flex items-center gap-2.5 px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors" onClick={() => { setShowOverflow(false); setOverflowSubmenu(null); }}>
|
||||
<svg className="w-4 h-4 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}><path strokeLinecap="round" strokeLinejoin="round" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" /></svg>
|
||||
<span>Imprint</span>
|
||||
</a>
|
||||
</>
|
||||
)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user