diff --git a/Flowlight.xcodeproj/project.pbxproj b/Flowlight.xcodeproj/project.pbxproj
index 84890792..d918aeec 100644
--- a/Flowlight.xcodeproj/project.pbxproj
+++ b/Flowlight.xcodeproj/project.pbxproj
@@ -2252,7 +2252,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 74;
+ CURRENT_PROJECT_VERSION = 75;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
@@ -2267,7 +2267,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 15.0;
- MARKETING_VERSION = 0.17.0;
+ MARKETING_VERSION = 0.17.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2313,7 +2313,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 74;
+ CURRENT_PROJECT_VERSION = 75;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 38RJUJHKZS;
ENABLE_HARDENED_RUNTIME = YES;
@@ -2328,7 +2328,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 15.0;
- MARKETING_VERSION = 0.17.0;
+ MARKETING_VERSION = 0.17.1;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2393,7 +2393,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 74;
+ CURRENT_PROJECT_VERSION = 75;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
@@ -2414,7 +2414,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 15.0;
- MARKETING_VERSION = 0.17.0;
+ MARKETING_VERSION = 0.17.1;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
diff --git a/Flowlight/Export/ExportSettingsView.swift b/Flowlight/Export/ExportSettingsView.swift
index c4e90428..940e49c1 100644
--- a/Flowlight/Export/ExportSettingsView.swift
+++ b/Flowlight/Export/ExportSettingsView.swift
@@ -171,7 +171,7 @@ struct ExportSettingsTab: View {
} header: {
Text(L("What Flowlight sends"))
} footer: {
- Text(L("A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down."))
+ Text(L("A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down."))
.font(.caption).foregroundStyle(.secondary)
}
}
@@ -239,7 +239,7 @@ struct ExportSettingsTab: View {
} header: {
Text(L("Status"))
} footer: {
- Text(L("Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight."))
+ Text(L("Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight."))
.font(.caption).foregroundStyle(.secondary)
}
}
diff --git a/Flowlight/Localization/de.lproj/Localizable.strings b/Flowlight/Localization/de.lproj/Localizable.strings
index b404b584..fdce169e 100644
--- a/Flowlight/Localization/de.lproj/Localizable.strings
+++ b/Flowlight/Localization/de.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "Live";
"AI Agents" = "KI-Agenten";
-"Reports" = "Berichte";
"Alerts" = "Warnungen";
"Rules" = "Regeln";
"Ask" = "Fragen";
@@ -321,7 +320,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "Hostnamen dieses Mac mitsenden";
"What Flowlight sends" = "Was Flowlight sendet";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Eine Zusammenfassung ist eine App, ein Hostname und eine IP-Adresse, über den Zeitraum addiert, in derselben Minutenauflösung, die Berichte nutzen – nie pro Verbindung und nie pro Paket. Zusammenfassungen gehen etwa zwei Minuten verzögert, sobald die zugehörige Minute vollständig ist; Warnungen gehen, sobald sie ausgelöst werden. Ein nicht erreichbarer Collector wird mit wachsender Verzögerung erneut versucht, und während er ausfällt, werden höchstens 10.000 Datensätze vorgehalten.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Eine Zusammenfassung ist eine App, ein Hostname und eine IP-Adresse, über den Zeitraum addiert, in derselben Minutenauflösung, die der Verlauf nutzt – nie pro Verbindung und nie pro Paket. Zusammenfassungen gehen etwa zwei Minuten verzögert, sobald die zugehörige Minute vollständig ist; Warnungen gehen, sobald sie ausgelöst werden. Ein nicht erreichbarer Collector wird mit wachsender Verzögerung erneut versucht, und während er ausfällt, werden höchstens 10.000 Datensätze vorgehalten.";
"Every field that can leave this Mac (%lld)" = "Jedes Feld, das diesen Mac verlassen kann (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Diese Liste ist alles – sie wird aus derselben Deklaration erzeugt, aus der die Nutzlast gebaut wird, und kann dem Code daher nicht nachhinken. Nie gesendet, in keinem Format und was auch sonst eingeschaltet ist: alles, was die HTTPS-Inspektion aufzeichnet. Header von Anfragen und Antworten, Bodys, Tool-Aufrufe und die Inhalte eines entschlüsselten Austauschs haben keinen Weg in einen Export.";
"Show What Would Be Sent…" = "Anzeigen, was gesendet würde…";
@@ -338,7 +337,7 @@
"Dropped" = "Verworfen";
"Retrying" = "Neuer Versuch";
"Status" = "Status";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exporte gehen als eigener Datenverkehr von Flowlight hinaus, Sie sehen sie also in Live und Berichten wie den jeder anderen App, und beim ersten Mal an ein neues Ziel erhalten Sie eine Erstkontakt-Warnung zu Flowlight.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exporte gehen als eigener Datenverkehr von Flowlight hinaus, Sie sehen sie also in Live und Verlauf wie den jeder anderen App, und beim ersten Mal an ein neues Ziel erhalten Sie eine Erstkontakt-Warnung zu Flowlight.";
"What would be sent" = "Was gesendet würde";
"Copy" = "Kopieren";
"Done" = "Fertig";
@@ -442,7 +441,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "%@ der Uploads dieses Agenten gingen an Nicht-KI-Hosts";
"Allowlist" = "Erlaubnisliste";
"Risk" = "Risiko";
-"Show Traffic in Reports" = "Datenverkehr in Berichten zeigen";
+"Show Traffic in History" = "Datenverkehr im Verlauf zeigen";
"None seen" = "Keine gesehen";
"Large upload" = "Großer Upload";
"%@ sent to hosts that aren't AI providers" = "%@ an Hosts gesendet, die keine KI-Anbieter sind";
@@ -481,7 +480,7 @@
"MCP servers (%lld)" = "MCP-Server (%lld)";
"MCP servers" = "MCP-Server";
"Guardrails" = "Schutzregeln";
-"Open in Reports" = "In Berichten öffnen";
+"Open in History" = "Im Verlauf öffnen";
"Only AI providers. Nothing else was contacted." = "Nur KI-Anbieter. Sonst wurde nichts kontaktiert.";
"the tool calls its model asks for" = "die Tool-Aufrufe, die sein Modell anfordert";
"tool calls" = "Tool-Aufrufe";
@@ -616,7 +615,7 @@
"Documentation" = "Dokumentation";
"1 query · %@" = "1 Abfrage · %@";
"%lld queries · %@" = "%lld Abfragen · %@";
-"Open these rows in Reports" = "Diese Zeilen in Berichten öffnen";
+"Open these rows in History" = "Diese Zeilen im Verlauf öffnen";
"Answered on this Mac · %@" = "Auf diesem Mac beantwortet · %@";
"1 request left this Mac · %@" = "1 Anfrage hat diesen Mac verlassen · %@";
"%lld requests left this Mac · %@" = "%lld Anfragen haben diesen Mac verlassen · %@";
@@ -1022,13 +1021,13 @@
"Zero" = "Null";
"Last 2 minutes" = "Letzte 2 Minuten";
"Application" = "App";
-"%@\nDouble-click to open in Reports" = "%@\nDoppelklick öffnet in Berichten";
+"%@\nDouble-click to open in History" = "%@\nDoppelklick öffnet im Verlauf";
"↓ In" = "↓ Empfangen";
"↑ Out" = "↑ Gesendet";
"Session ↓" = "Sitzung ↓";
"Session ↑" = "Sitzung ↑";
"Busiest destination" = "Aktivstes Ziel";
-"Show in Reports" = "In Berichten zeigen";
+"Show in History" = "Im Verlauf zeigen";
"Copy Bundle ID" = "Bundle-ID kopieren";
"Top talkers · average of the last 5 seconds" = "Aktivste Apps · Mittel der letzten 5 Sekunden";
"The network is quiet" = "Das Netzwerk ist ruhig";
@@ -1265,7 +1264,7 @@
"Nothing is being refused until %@." = "Bis %@ wird nichts verweigert.";
"Resume now" = "Jetzt fortsetzen";
"No rules yet" = "Noch keine Regeln";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Eine Regel benennt etwas – eine App, einen Agenten, ein Ziel oder eine URL – und sagt blockieren oder erlauben. Klicken Sie in Live, Berichten, KI-Agenten oder Inspizieren mit der rechten Maustaste auf eine Zeile, um eine Regel zu dem zu schreiben, was Sie gerade ansehen, oder beginnen Sie mit den Vorlagen: Dort stehen schon die Hosts, die eine Paketinstallation erreicht, und die, über die eine Datei den Mac verlässt.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Eine Regel benennt etwas – eine App, einen Agenten, ein Ziel oder eine URL – und sagt blockieren oder erlauben. Klicken Sie in Live, Verlauf, KI-Agenten oder Inspizieren mit der rechten Maustaste auf eine Zeile, um eine Regel zu dem zu schreiben, was Sie gerade ansehen, oder beginnen Sie mit den Vorlagen: Dort stehen schon die Hosts, die eine Paketinstallation erreicht, und die, über die eine Datei den Mac verlässt.";
"Browse Templates…" = "Vorlagen durchsuchen…";
"Write One…" = "Eine schreiben…";
"Nothing yet" = "Noch nichts";
@@ -1341,7 +1340,7 @@
"First contact with a new domain" = "Erster Kontakt mit einer neuen Domain";
"Connections to non-standard ports" = "Verbindungen zu Nicht-Standard-Ports";
"Ignore Apple's own apps" = "Apples eigene Apps ignorieren";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS spricht ständig mit Apple – Updates, iCloud, Push, Zeit – und all das zu melden verschüttet die eine Zeile, die zählt. Dieser Datenverkehr wird weiter aufgezeichnet, weiter in Live und Berichten gezeigt und unterliegt weiter jeder Regel und Schutzregel.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS spricht ständig mit Apple – Updates, iCloud, Push, Zeit – und all das zu melden verschüttet die eine Zeile, die zählt. Dieser Datenverkehr wird weiter aufgezeichnet, weiter in Live und Verlauf gezeigt und unterliegt weiter jeder Regel und Schutzregel.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "Agent nutzt E-Mail, Dateiübertragung, SSH, Tunnel oder Datenbanken";
"Agent connects to a raw IP on an unusual port" = "Agent verbindet sich über einen ungewöhnlichen Port mit einer reinen IP";
"Uploads to non-AI hosts above" = "Uploads an Nicht-KI-Hosts über";
@@ -1618,7 +1617,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1820,7 +1819,7 @@
"Showing %lld of %lld relationships" = "%lld von %lld Beziehungen werden angezeigt";
"Show %lld more relationships" = "%lld weitere Beziehungen anzeigen";
"Loads the next page without changing the Map" = "Lädt die nächste Seite, ohne die Karte zu ändern";
-"Select a relationship for an exact Reports scope." = "Wähle eine Beziehung für einen exakten Berichtsbereich aus.";
+"Select a relationship for an exact History scope." = "Wähle eine Beziehung für einen exakten Verlaufsbereich aus.";
"Period" = "Zeitraum";
"No traffic to visualize" = "Kein Datenverkehr zum Visualisieren";
"Flowlight has not observed any connections in this period." = "Flowlight hat in diesem Zeitraum keine Verbindungen beobachtet.";
@@ -1866,7 +1865,7 @@
"Select to inspect this connection" = "Auswählen, um diese Verbindung zu untersuchen";
"%lld exact destinations" = "%lld exakte Ziele";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ zu %@, %@ empfangen, %@ gesendet, %lld Verbindungen";
-"Show domain family in Reports" = "Domainfamilie in Berichte anzeigen";
+"Show domain family in History" = "Domainfamilie in Verlauf anzeigen";
/* 0.17.0 History and Connections */
"1 mo" = "1 Mon.";
diff --git a/Flowlight/Localization/en.lproj/Localizable.strings b/Flowlight/Localization/en.lproj/Localizable.strings
index ee9b98c7..95234425 100644
--- a/Flowlight/Localization/en.lproj/Localizable.strings
+++ b/Flowlight/Localization/en.lproj/Localizable.strings
@@ -67,7 +67,6 @@
/* App/AppNavigation.swift */
"Live" = "Live";
"AI Agents" = "AI Agents";
-"Reports" = "Reports";
"Alerts" = "Alerts";
"Rules" = "Rules";
"Ask" = "Ask";
@@ -323,7 +322,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "Include this Mac's host name";
"What Flowlight sends" = "What Flowlight sends";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down.";
"Every field that can leave this Mac (%lld)" = "Every field that can leave this Mac (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export.";
"Show What Would Be Sent…" = "Show What Would Be Sent…";
@@ -340,7 +339,7 @@
"Dropped" = "Dropped";
"Retrying" = "Retrying";
"Status" = "Status";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight.";
"What would be sent" = "What would be sent";
"Copy" = "Copy";
"Done" = "Done";
@@ -414,7 +413,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "%@ of this agent's uploads went to non-AI hosts";
"Allowlist" = "Allowlist";
"Risk" = "Risk";
-"Show Traffic in Reports" = "Show Traffic in Reports";
+"Show Traffic in History" = "Show Traffic in History";
"None seen" = "None seen";
"Large upload" = "Large upload";
"%@ sent to hosts that aren't AI providers" = "%@ sent to hosts that aren't AI providers";
@@ -453,7 +452,7 @@
"MCP servers (%lld)" = "MCP servers (%lld)";
"MCP servers" = "MCP servers";
"Guardrails" = "Guardrails";
-"Open in Reports" = "Open in Reports";
+"Open in History" = "Open in History";
"Only AI providers. Nothing else was contacted." = "Only AI providers. Nothing else was contacted.";
"the tool calls its model asks for" = "the tool calls its model asks for";
"tool calls" = "tool calls";
@@ -588,7 +587,7 @@
"Documentation" = "Documentation";
"1 query · %@" = "1 query · %@";
"%lld queries · %@" = "%lld queries · %@";
-"Open these rows in Reports" = "Open these rows in Reports";
+"Open these rows in History" = "Open these rows in History";
"Answered on this Mac · %@" = "Answered on this Mac · %@";
"1 request left this Mac · %@" = "1 request left this Mac · %@";
"%lld requests left this Mac · %@" = "%lld requests left this Mac · %@";
@@ -971,13 +970,13 @@
"Zero" = "Zero";
"Last 2 minutes" = "Last 2 minutes";
"Application" = "Application";
-"%@\nDouble-click to open in Reports" = "%@\nDouble-click to open in Reports";
+"%@\nDouble-click to open in History" = "%@\nDouble-click to open in History";
"↓ In" = "↓ In";
"↑ Out" = "↑ Out";
"Session ↓" = "Session ↓";
"Session ↑" = "Session ↑";
"Busiest destination" = "Busiest destination";
-"Show in Reports" = "Show in Reports";
+"Show in History" = "Show in History";
"Copy Bundle ID" = "Copy Bundle ID";
"Top talkers · average of the last 5 seconds" = "Top talkers · average of the last 5 seconds";
"The network is quiet" = "The network is quiet";
@@ -1197,7 +1196,7 @@
"Nothing is being refused until %@." = "Nothing is being refused until %@.";
"Resume now" = "Resume now";
"No rules yet" = "No rules yet";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by.";
"Browse Templates…" = "Browse Templates…";
"Write One…" = "Write One…";
"Nothing yet" = "Nothing yet";
@@ -1273,7 +1272,7 @@
"First contact with a new domain" = "First contact with a new domain";
"Connections to non-standard ports" = "Connections to non-standard ports";
"Ignore Apple's own apps" = "Ignore Apple's own apps";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "Agent uses email, file transfer, SSH, tunnels or databases";
"Agent connects to a raw IP on an unusual port" = "Agent connects to a raw IP on an unusual port";
"Uploads to non-AI hosts above" = "Uploads to non-AI hosts above";
@@ -1617,7 +1616,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1819,7 +1818,7 @@
"Showing %lld of %lld relationships" = "Showing %lld of %lld relationships";
"Show %lld more relationships" = "Show %lld more relationships";
"Loads the next page without changing the Map" = "Loads the next page without changing the Map";
-"Select a relationship for an exact Reports scope." = "Select a relationship for an exact Reports scope.";
+"Select a relationship for an exact History scope." = "Select a relationship for an exact History scope.";
"Period" = "Period";
"No traffic to visualize" = "No traffic to visualize";
"Flowlight has not observed any connections in this period." = "Flowlight has not observed any connections in this period.";
@@ -1865,7 +1864,7 @@
"Select to inspect this connection" = "Select to inspect this connection";
"%lld exact destinations" = "%lld exact destinations";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ to %@, received %@, sent %@, %lld connections";
-"Show domain family in Reports" = "Show domain family in Reports";
+"Show domain family in History" = "Show domain family in History";
/* 0.17.0 History and Connections */
"1 mo" = "1 mo";
diff --git a/Flowlight/Localization/es.lproj/Localizable.strings b/Flowlight/Localization/es.lproj/Localizable.strings
index 56d26af1..c0407caa 100644
--- a/Flowlight/Localization/es.lproj/Localizable.strings
+++ b/Flowlight/Localization/es.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "En vivo";
"AI Agents" = "Agentes de IA";
-"Reports" = "Informes";
"Alerts" = "Alertas";
"Rules" = "Reglas";
"Ask" = "Preguntar";
@@ -321,7 +320,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "Incluir el nombre de host de este Mac";
"What Flowlight sends" = "Qué envía Flowlight";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agregado es una app, un nombre de host y una dirección IP sumados a lo largo del periodo, con la misma granularidad de minuto que usa Informes: nunca por conexión ni por paquete. Los agregados van unos dos minutos por detrás, cuando el minuto al que pertenecen está completo; las alertas se envían en cuanto se generan. Si no se puede contactar con un colector, se reintenta con un retardo creciente y se guardan como máximo 10.000 registros mientras está caído.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agregado es una app, un nombre de host y una dirección IP sumados a lo largo del periodo, con la misma granularidad de minuto que usa Historial: nunca por conexión ni por paquete. Los agregados van unos dos minutos por detrás, cuando el minuto al que pertenecen está completo; las alertas se envían en cuanto se generan. Si no se puede contactar con un colector, se reintenta con un retardo creciente y se guardan como máximo 10.000 registros mientras está caído.";
"Every field that can leave this Mac (%lld)" = "Todos los campos que pueden salir de este Mac (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Esa lista es todo: se genera a partir de la misma declaración con la que se construye el contenido, así que no puede quedarse atrás respecto al código. Nunca se envía, en ningún formato y por mucho que esté activado, nada de lo que registra la inspección HTTPS. Las cabeceras de peticiones y respuestas, los cuerpos, las llamadas a herramientas y el contenido de cualquier intercambio descifrado no tienen ninguna vía hacia una exportación.";
"Show What Would Be Sent…" = "Ver qué se enviaría…";
@@ -338,7 +337,7 @@
"Dropped" = "Descartados";
"Retrying" = "Reintentando";
"Status" = "Estado";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Las exportaciones salen como tráfico propio de Flowlight, así que aparecen en En vivo y en Informes como las de cualquier otra app, y la primera vez que vayan a un sitio nuevo recibirás una alerta de primer contacto sobre Flowlight.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Las exportaciones salen como tráfico propio de Flowlight, así que aparecen en En vivo y en Historial como las de cualquier otra app, y la primera vez que vayan a un sitio nuevo recibirás una alerta de primer contacto sobre Flowlight.";
"What would be sent" = "Qué se enviaría";
"Copy" = "Copiar";
"Done" = "Hecho";
@@ -442,7 +441,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "%@ de las subidas de este agente fueron a hosts no IA";
"Allowlist" = "Lista de permitidos";
"Risk" = "Riesgo";
-"Show Traffic in Reports" = "Ver el tráfico en Informes";
+"Show Traffic in History" = "Ver el tráfico en Historial";
"None seen" = "No se ha visto ninguno";
"Large upload" = "Subida grande";
"%@ sent to hosts that aren't AI providers" = "%@ enviados a hosts que no son proveedores de IA";
@@ -481,7 +480,7 @@
"MCP servers (%lld)" = "Servidores MCP (%lld)";
"MCP servers" = "Servidores MCP";
"Guardrails" = "Salvaguardas";
-"Open in Reports" = "Abrir en Informes";
+"Open in History" = "Abrir en Historial";
"Only AI providers. Nothing else was contacted." = "Solo proveedores de IA. No contactó con nada más.";
"the tool calls its model asks for" = "las llamadas a herramientas que pide su modelo";
"tool calls" = "llamadas a herramientas";
@@ -616,7 +615,7 @@
"Documentation" = "Documentación";
"1 query · %@" = "1 consulta · %@";
"%lld queries · %@" = "%lld consultas · %@";
-"Open these rows in Reports" = "Abrir estas filas en Informes";
+"Open these rows in History" = "Abrir estas filas en Historial";
"Answered on this Mac · %@" = "Respondido en este Mac · %@";
"1 request left this Mac · %@" = "1 petición ha salido de este Mac · %@";
"%lld requests left this Mac · %@" = "%lld peticiones han salido de este Mac · %@";
@@ -1022,13 +1021,13 @@
"Zero" = "Cero";
"Last 2 minutes" = "Últimos 2 minutos";
"Application" = "Aplicación";
-"%@\nDouble-click to open in Reports" = "%@\nDoble clic para abrir en Informes";
+"%@\nDouble-click to open in History" = "%@\nDoble clic para abrir en Historial";
"↓ In" = "↓ Entrada";
"↑ Out" = "↑ Salida";
"Session ↓" = "Sesión ↓";
"Session ↑" = "Sesión ↑";
"Busiest destination" = "Destino más activo";
-"Show in Reports" = "Ver en Informes";
+"Show in History" = "Ver en Historial";
"Copy Bundle ID" = "Copiar el ID del paquete";
"Top talkers · average of the last 5 seconds" = "Más activas · media de los últimos 5 segundos";
"The network is quiet" = "La red está tranquila";
@@ -1265,7 +1264,7 @@
"Nothing is being refused until %@." = "No se rechazará nada hasta %@.";
"Resume now" = "Reanudar ahora";
"No rules yet" = "Todavía no hay reglas";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regla nombra algo —una app, un agente, un destino o una URL— y dice si se bloquea o se permite. Con el clic derecho en cualquier fila de En vivo, Informes, Agentes de IA o Inspeccionar se escribe una regla sobre lo que estás viendo; también se puede partir de la biblioteca, que ya sabe a qué hosts llega la instalación de un paquete y por cuáles sale un archivo.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regla nombra algo —una app, un agente, un destino o una URL— y dice si se bloquea o se permite. Con el clic derecho en cualquier fila de En vivo, Historial, Agentes de IA o Inspeccionar se escribe una regla sobre lo que estás viendo; también se puede partir de la biblioteca, que ya sabe a qué hosts llega la instalación de un paquete y por cuáles sale un archivo.";
"Browse Templates…" = "Ver las plantillas…";
"Write One…" = "Escribir una…";
"Nothing yet" = "Todavía nada";
@@ -1341,7 +1340,7 @@
"First contact with a new domain" = "Primer contacto con un dominio nuevo";
"Connections to non-standard ports" = "Conexiones a puertos no estándar";
"Ignore Apple's own apps" = "Ignorar las apps de Apple";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS habla con Apple constantemente —actualizaciones, iCloud, notificaciones push, hora— e informar de todo ello sepulta la única línea que importa. Su tráfico se sigue registrando, se sigue mostrando en En vivo e Informes y sigue sujeto a todas las reglas y salvaguardas.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS habla con Apple constantemente —actualizaciones, iCloud, notificaciones push, hora— e informar de todo ello sepulta la única línea que importa. Su tráfico se sigue registrando, se sigue mostrando en En vivo e Historial y sigue sujeto a todas las reglas y salvaguardas.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "El agente usa correo, transferencia de archivos, SSH, túneles o bases de datos";
"Agent connects to a raw IP on an unusual port" = "El agente conecta a una IP directa en un puerto inusual";
"Uploads to non-AI hosts above" = "Subidas a hosts no IA por encima de";
@@ -1618,7 +1617,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1820,7 +1819,7 @@
"Showing %lld of %lld relationships" = "Mostrando %lld de %lld relaciones";
"Show %lld more relationships" = "Mostrar %lld relaciones más";
"Loads the next page without changing the Map" = "Carga la página siguiente sin cambiar el mapa";
-"Select a relationship for an exact Reports scope." = "Selecciona una relación para obtener un ámbito exacto en Informes.";
+"Select a relationship for an exact History scope." = "Selecciona una relación para obtener un ámbito exacto en Historial.";
"Period" = "Periodo";
"No traffic to visualize" = "No hay tráfico que visualizar";
"Flowlight has not observed any connections in this period." = "Flowlight no ha observado conexiones en este periodo.";
@@ -1866,7 +1865,7 @@
"Select to inspect this connection" = "Selecciona para examinar esta conexión";
"%lld exact destinations" = "%lld destinos exactos";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ a %@, recibió %@, envió %@, %lld conexiones";
-"Show domain family in Reports" = "Mostrar la familia de dominios en Informes";
+"Show domain family in History" = "Mostrar la familia de dominios en Historial";
/* 0.17.0 History and Connections */
"1 mo" = "1 mes";
diff --git a/Flowlight/Localization/fr.lproj/Localizable.strings b/Flowlight/Localization/fr.lproj/Localizable.strings
index 66bd8a32..dd4f08c2 100644
--- a/Flowlight/Localization/fr.lproj/Localizable.strings
+++ b/Flowlight/Localization/fr.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "En direct";
"AI Agents" = "Agents IA";
-"Reports" = "Rapports";
"Alerts" = "Alertes";
"Rules" = "Règles";
"Ask" = "Demander";
@@ -321,7 +320,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "Inclure le nom d'hôte de ce Mac";
"What Flowlight sends" = "Ce que Flowlight envoie";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agrégat, c'est une app, un nom d'hôte et une adresse IP additionnés sur la période, à la même granularité à la minute que celle de Rapports — jamais par connexion et jamais par paquet. Les agrégats partent avec environ deux minutes de retard, une fois terminée la minute à laquelle ils appartiennent ; les alertes partent dès qu'elles sont levées. Un collecteur injoignable est réessayé avec un délai croissant, et 10 000 enregistrements au maximum sont conservés pendant son indisponibilité.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agrégat, c'est une app, un nom d'hôte et une adresse IP additionnés sur la période, à la même granularité à la minute que celle de l’historique — jamais par connexion et jamais par paquet. Les agrégats partent avec environ deux minutes de retard, une fois terminée la minute à laquelle ils appartiennent ; les alertes partent dès qu'elles sont levées. Un collecteur injoignable est réessayé avec un délai croissant, et 10 000 enregistrements au maximum sont conservés pendant son indisponibilité.";
"Every field that can leave this Mac (%lld)" = "Tous les champs qui peuvent quitter ce Mac (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Cette liste est exhaustive : elle est générée à partir de la même déclaration que celle qui sert à construire la charge utile, elle ne peut donc pas prendre du retard sur le code. Jamais envoyé, quel que soit le format et quoi qu'il soit activé par ailleurs : tout ce qu'enregistre l'inspection HTTPS. Les en-têtes de requête et de réponse, les corps, les appels d'outils et le contenu de tout échange déchiffré n'ont aucun chemin vers une exportation.";
"Show What Would Be Sent…" = "Afficher ce qui serait envoyé…";
@@ -338,7 +337,7 @@
"Dropped" = "Abandonnés";
"Retrying" = "Nouvelle tentative";
"Status" = "État";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Les exportations partent comme le trafic propre de Flowlight : vous les verrez dans En direct et Rapports comme celui de n'importe quelle autre app, et la première fois qu'elles iront vers une nouvelle destination, vous recevrez une alerte de premier contact au sujet de Flowlight.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Les exportations partent comme le trafic propre de Flowlight : vous les verrez dans En direct et Historique comme celui de n'importe quelle autre app, et la première fois qu'elles iront vers une nouvelle destination, vous recevrez une alerte de premier contact au sujet de Flowlight.";
"What would be sent" = "Ce qui serait envoyé";
"Copy" = "Copier";
"Done" = "Terminé";
@@ -442,7 +441,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "%@ des envois de cet agent sont allés vers des hôtes non IA";
"Allowlist" = "Liste d'autorisation";
"Risk" = "Risque";
-"Show Traffic in Reports" = "Voir le trafic dans Rapports";
+"Show Traffic in History" = "Voir le trafic dans l’historique";
"None seen" = "Aucun observé";
"Large upload" = "Envoi volumineux";
"%@ sent to hosts that aren't AI providers" = "%@ envoyés vers des hôtes qui ne sont pas des fournisseurs IA";
@@ -481,7 +480,7 @@
"MCP servers (%lld)" = "Serveurs MCP (%lld)";
"MCP servers" = "Serveurs MCP";
"Guardrails" = "Garde-fous";
-"Open in Reports" = "Ouvrir dans Rapports";
+"Open in History" = "Ouvrir dans l’historique";
"Only AI providers. Nothing else was contacted." = "Uniquement des fournisseurs IA. Rien d'autre n'a été contacté.";
"the tool calls its model asks for" = "les appels d'outils demandés par son modèle";
"tool calls" = "appels d'outils";
@@ -616,7 +615,7 @@
"Documentation" = "Documentation";
"1 query · %@" = "1 requête · %@";
"%lld queries · %@" = "%lld requêtes · %@";
-"Open these rows in Reports" = "Ouvrir ces lignes dans Rapports";
+"Open these rows in History" = "Ouvrir ces lignes dans l’historique";
"Answered on this Mac · %@" = "Réponse produite sur ce Mac · %@";
"1 request left this Mac · %@" = "1 requête a quitté ce Mac · %@";
"%lld requests left this Mac · %@" = "%lld requêtes ont quitté ce Mac · %@";
@@ -1022,13 +1021,13 @@
"Zero" = "Zéro";
"Last 2 minutes" = "2 dernières minutes";
"Application" = "Application";
-"%@\nDouble-click to open in Reports" = "%@\nDouble-cliquer pour ouvrir dans Rapports";
+"%@\nDouble-click to open in History" = "%@\nDouble-cliquer pour ouvrir dans l’historique";
"↓ In" = "↓ Reçu";
"↑ Out" = "↑ Envoyé";
"Session ↓" = "Session ↓";
"Session ↑" = "Session ↑";
"Busiest destination" = "Destination la plus active";
-"Show in Reports" = "Voir dans Rapports";
+"Show in History" = "Voir dans l’historique";
"Copy Bundle ID" = "Copier l'identifiant de bundle";
"Top talkers · average of the last 5 seconds" = "Les plus actifs · moyenne des 5 dernières secondes";
"The network is quiet" = "Le réseau est calme";
@@ -1265,7 +1264,7 @@
"Nothing is being refused until %@." = "Rien n'est refusé jusqu'à %@.";
"Resume now" = "Reprendre maintenant";
"No rules yet" = "Aucune règle pour l'instant";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Une règle nomme quelque chose — une app, un agent, une destination ou une URL — et dit de bloquer ou d'autoriser. Un clic droit sur n'importe quelle ligne dans En direct, Rapports, Agents IA ou Inspecter permet d'en écrire une à propos de ce qui est affiché ; l'autre point de départ est la bibliothèque de modèles : elle sait déjà quels hôtes une installation de paquet contacte, et par lesquels un fichier s'en va.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Une règle nomme quelque chose — une app, un agent, une destination ou une URL — et dit de bloquer ou d'autoriser. Un clic droit sur n'importe quelle ligne dans En direct, Historique, Agents IA ou Inspecter permet d'en écrire une à propos de ce qui est affiché ; l'autre point de départ est la bibliothèque de modèles : elle sait déjà quels hôtes une installation de paquet contacte, et par lesquels un fichier s'en va.";
"Browse Templates…" = "Parcourir les modèles…";
"Write One…" = "En écrire une…";
"Nothing yet" = "Rien pour l'instant";
@@ -1341,7 +1340,7 @@
"First contact with a new domain" = "Premier contact avec un nouveau domaine";
"Connections to non-standard ports" = "Connexions à des ports non standard";
"Ignore Apple's own apps" = "Ignorer les apps d'Apple";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS communique en permanence avec Apple — mises à jour, iCloud, notifications push, heure — et tout signaler enfouirait la seule ligne qui compte. Leur trafic est toujours enregistré, toujours affiché dans En direct et Rapports, et toujours soumis à chaque règle et à chaque garde-fou.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS communique en permanence avec Apple — mises à jour, iCloud, notifications push, heure — et tout signaler enfouirait la seule ligne qui compte. Leur trafic est toujours enregistré, toujours affiché dans En direct et Historique, et toujours soumis à chaque règle et à chaque garde-fou.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "L'agent utilise e-mail, transfert de fichiers, SSH, tunnels ou bases de données";
"Agent connects to a raw IP on an unusual port" = "L'agent se connecte à une IP brute sur un port inhabituel";
"Uploads to non-AI hosts above" = "Envois vers des hôtes non IA au-delà de";
@@ -1618,7 +1617,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1820,7 +1819,7 @@
"Showing %lld of %lld relationships" = "Affichage de %lld relations sur %lld";
"Show %lld more relationships" = "Afficher %lld relations de plus";
"Loads the next page without changing the Map" = "Charge la page suivante sans modifier la carte";
-"Select a relationship for an exact Reports scope." = "Sélectionnez une relation pour obtenir une portée exacte dans Rapports.";
+"Select a relationship for an exact History scope." = "Sélectionnez une relation pour obtenir une portée exacte dans l’historique.";
"Period" = "Période";
"No traffic to visualize" = "Aucun trafic à visualiser";
"Flowlight has not observed any connections in this period." = "Flowlight n’a observé aucune connexion pendant cette période.";
@@ -1866,7 +1865,7 @@
"Select to inspect this connection" = "Sélectionnez pour examiner cette connexion";
"%lld exact destinations" = "%lld destinations exactes";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ vers %@, %@ reçus, %@ envoyés, %lld connexions";
-"Show domain family in Reports" = "Afficher la famille de domaines dans Rapports";
+"Show domain family in History" = "Afficher la famille de domaines dans l’historique";
/* 0.17.0 History and Connections */
"1 mo" = "1 mois";
diff --git a/Flowlight/Localization/it.lproj/Localizable.strings b/Flowlight/Localization/it.lproj/Localizable.strings
index 8e1c5ad1..c8d05cdf 100644
--- a/Flowlight/Localization/it.lproj/Localizable.strings
+++ b/Flowlight/Localization/it.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "In diretta";
"AI Agents" = "Agenti IA";
-"Reports" = "Rapporti";
"Alerts" = "Avvisi";
"Rules" = "Regole";
"Ask" = "Chiedi";
@@ -321,7 +320,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "Includi il nome host di questo Mac";
"What Flowlight sends" = "Cosa invia Flowlight";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un'aggregazione è una sola app, un solo nome host e un solo indirizzo IP sommati sull'intervallo, con la stessa granularità al minuto usata da Rapporti: mai per connessione e mai per pacchetto. Le aggregazioni partono con circa due minuti di ritardo, una volta completato il minuto a cui appartengono; gli avvisi partono appena vengono generati. Se un collector non è raggiungibile, i tentativi si ripetono con un ritardo crescente e durante l'interruzione vengono conservati al massimo 10.000 record.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un'aggregazione è una sola app, un solo nome host e un solo indirizzo IP sommati sull'intervallo, con la stessa granularità al minuto usata da Cronologia: mai per connessione e mai per pacchetto. Le aggregazioni partono con circa due minuti di ritardo, una volta completato il minuto a cui appartengono; gli avvisi partono appena vengono generati. Se un collector non è raggiungibile, i tentativi si ripetono con un ritardo crescente e durante l'interruzione vengono conservati al massimo 10.000 record.";
"Every field that can leave this Mac (%lld)" = "Tutti i campi che possono lasciare questo Mac (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Quell'elenco è completo: è generato dalla stessa dichiarazione da cui si costruisce il payload, quindi non può restare indietro rispetto al codice. Mai inviato, in nessun formato e qualunque altra opzione sia attiva: tutto ciò che registra l'ispezione HTTPS. Intestazioni di richiesta e risposta, corpi, chiamate agli strumenti e contenuti di qualsiasi scambio decifrato non hanno alcuna via d'accesso a un'esportazione.";
"Show What Would Be Sent…" = "Mostra cosa verrebbe inviato…";
@@ -338,7 +337,7 @@
"Dropped" = "Scartati";
"Retrying" = "Nuovo tentativo";
"Status" = "Stato";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Le esportazioni escono come traffico di Flowlight, quindi le vedrai in In diretta e in Rapporti come quelle di qualsiasi altra app, e la prima volta che raggiungono una nuova destinazione riceverai un avviso di primo contatto su Flowlight.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Le esportazioni escono come traffico di Flowlight, quindi le vedrai in In diretta e in Cronologia come quelle di qualsiasi altra app, e la prima volta che raggiungono una nuova destinazione riceverai un avviso di primo contatto su Flowlight.";
"What would be sent" = "Cosa verrebbe inviato";
"Copy" = "Copia";
"Done" = "Fine";
@@ -442,7 +441,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "%@ dei caricamenti di questo agente è andato verso host non IA";
"Allowlist" = "Elenco consentiti";
"Risk" = "Rischio";
-"Show Traffic in Reports" = "Mostra il traffico in Rapporti";
+"Show Traffic in History" = "Mostra il traffico in Cronologia";
"None seen" = "Nessuno rilevato";
"Large upload" = "Caricamento ingente";
"%@ sent to hosts that aren't AI providers" = "%@ inviati a host che non sono provider IA";
@@ -481,7 +480,7 @@
"MCP servers (%lld)" = "Server MCP (%lld)";
"MCP servers" = "Server MCP";
"Guardrails" = "Protezioni";
-"Open in Reports" = "Apri in Rapporti";
+"Open in History" = "Apri in Cronologia";
"Only AI providers. Nothing else was contacted." = "Solo provider IA. Nient'altro è stato contattato.";
"the tool calls its model asks for" = "le chiamate agli strumenti richieste dal suo modello";
"tool calls" = "chiamate agli strumenti";
@@ -616,7 +615,7 @@
"Documentation" = "Documentazione";
"1 query · %@" = "1 interrogazione · %@";
"%lld queries · %@" = "%lld interrogazioni · %@";
-"Open these rows in Reports" = "Apri queste righe in Rapporti";
+"Open these rows in History" = "Apri queste righe in Cronologia";
"Answered on this Mac · %@" = "Risposta generata su questo Mac · %@";
"1 request left this Mac · %@" = "1 richiesta ha lasciato questo Mac · %@";
"%lld requests left this Mac · %@" = "%lld richieste hanno lasciato questo Mac · %@";
@@ -1022,13 +1021,13 @@
"Zero" = "Zero";
"Last 2 minutes" = "Ultimi 2 minuti";
"Application" = "Applicazione";
-"%@\nDouble-click to open in Reports" = "%@\nFai doppio clic per aprire in Rapporti";
+"%@\nDouble-click to open in History" = "%@\nFai doppio clic per aprire in Cronologia";
"↓ In" = "↓ Entrata";
"↑ Out" = "↑ Uscita";
"Session ↓" = "Sessione ↓";
"Session ↑" = "Sessione ↑";
"Busiest destination" = "Destinazione più attiva";
-"Show in Reports" = "Mostra in Rapporti";
+"Show in History" = "Mostra in Cronologia";
"Copy Bundle ID" = "Copia l'ID bundle";
"Top talkers · average of the last 5 seconds" = "App più attive · media degli ultimi 5 secondi";
"The network is quiet" = "La rete è tranquilla";
@@ -1265,7 +1264,7 @@
"Nothing is being refused until %@." = "Nulla viene rifiutato fino a %@.";
"Resume now" = "Riprendi adesso";
"No rules yet" = "Ancora nessuna regola";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regola indica qualcosa — un'app, un agente, una destinazione o un URL — e dice se bloccare o consentire. Fai clic con il tasto destro su una riga in In diretta, Rapporti, Agenti IA o Ispeziona per scriverne una su ciò che stai guardando, oppure parti dalla libreria: sa già quali host raggiunge l'installazione di un pacchetto e da quali esce un file.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regola indica qualcosa — un'app, un agente, una destinazione o un URL — e dice se bloccare o consentire. Fai clic con il tasto destro su una riga in In diretta, Cronologia, Agenti IA o Ispeziona per scriverne una su ciò che stai guardando, oppure parti dalla libreria: sa già quali host raggiunge l'installazione di un pacchetto e da quali esce un file.";
"Browse Templates…" = "Sfoglia i modelli…";
"Write One…" = "Scrivine una…";
"Nothing yet" = "Ancora nulla";
@@ -1341,7 +1340,7 @@
"First contact with a new domain" = "Primo contatto con un nuovo dominio";
"Connections to non-standard ports" = "Connessioni a porte non standard";
"Ignore Apple's own apps" = "Ignora le app di Apple";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS comunica costantemente con Apple — aggiornamenti, iCloud, notifiche push, ora — e segnalare tutto questo seppellisce l'unica riga che conta. Il loro traffico viene comunque registrato, compare nella schermata In diretta e in Rapporti e resta soggetto a tutte le regole e le protezioni.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS comunica costantemente con Apple — aggiornamenti, iCloud, notifiche push, ora — e segnalare tutto questo seppellisce l'unica riga che conta. Il loro traffico viene comunque registrato, compare nella schermata In diretta e in Cronologia e resta soggetto a tutte le regole e le protezioni.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "L'agente usa e-mail, trasferimento file, SSH, tunnel o database";
"Agent connects to a raw IP on an unusual port" = "L'agente si connette a un IP grezzo su una porta insolita";
"Uploads to non-AI hosts above" = "Caricamenti verso host non IA oltre";
@@ -1618,7 +1617,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1820,7 +1819,7 @@
"Showing %lld of %lld relationships" = "Visualizzazione di %lld relazioni su %lld";
"Show %lld more relationships" = "Mostra altre %lld relazioni";
"Loads the next page without changing the Map" = "Carica la pagina successiva senza modificare la mappa";
-"Select a relationship for an exact Reports scope." = "Seleziona una relazione per un ambito esatto nei Resoconti.";
+"Select a relationship for an exact History scope." = "Seleziona una relazione per un ambito esatto nei Resoconti.";
"Period" = "Periodo";
"No traffic to visualize" = "Nessun traffico da visualizzare";
"Flowlight has not observed any connections in this period." = "Flowlight non ha osservato connessioni in questo periodo.";
@@ -1866,7 +1865,7 @@
"Select to inspect this connection" = "Seleziona per esaminare questa connessione";
"%lld exact destinations" = "%lld destinazioni esatte";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ verso %@, %@ ricevuti, %@ inviati, %lld connessioni";
-"Show domain family in Reports" = "Mostra la famiglia di domini in Rapporti";
+"Show domain family in History" = "Mostra la famiglia di domini in Cronologia";
/* 0.17.0 History and Connections */
"1 mo" = "1 mese";
diff --git a/Flowlight/Localization/ja.lproj/Localizable.strings b/Flowlight/Localization/ja.lproj/Localizable.strings
index f8f12b9d..56f7fb77 100644
--- a/Flowlight/Localization/ja.lproj/Localizable.strings
+++ b/Flowlight/Localization/ja.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "ライブ";
"AI Agents" = "AI エージェント";
-"Reports" = "レポート";
"Alerts" = "アラート";
"Rules" = "ルール";
"Ask" = "質問";
@@ -321,7 +320,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "この Mac のホスト名を含める";
"What Flowlight sends" = "Flowlight が送信する内容";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "集計は、1 つのアプリ・1 つのホスト名・1 つの IP アドレスを、レポートと同じ分単位の粒度で期間ごとに合計したものです。接続ごとでもパケットごとでもありません。集計は、対象の分が終わってから 2 分ほど遅れて送られます。アラートは発生した時点で送られます。接続できないコレクターへは間隔を広げながら再試行し、停止している間は最大 10,000 件を保持します。";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "集計は、1 つのアプリ・1 つのホスト名・1 つの IP アドレスを、履歴と同じ分単位の粒度で期間ごとに合計したものです。接続ごとでもパケットごとでもありません。集計は、対象の分が終わってから 2 分ほど遅れて送られます。アラートは発生した時点で送られます。接続できないコレクターへは間隔を広げながら再試行し、停止している間は最大 10,000 件を保持します。";
"Every field that can leave this Mac (%lld)" = "この Mac から出る可能性のあるフィールドのすべて(%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "このリストがすべてです。ペイロードを組み立てるのと同じ宣言から生成しているため、コードから遅れることはありません。どの形式でも、ほかに何をオンにしていても送信されないもの: HTTPS インスペクションが記録した内容です。リクエストとレスポンスのヘッダ、本文、ツール呼び出し、復号したやり取りの中身が書き出しに入る経路はありません。";
"Show What Would Be Sent…" = "送信される内容を表示…";
@@ -338,7 +337,7 @@
"Dropped" = "破棄";
"Retrying" = "再試行中";
"Status" = "状況";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "書き出しは Flowlight 自身のトラフィックとして出ていきます。そのためライブとレポートには、ほかのアプリと同じように表示され、初めて新しい宛先へ送るときには Flowlight についての初回接続アラートが出ます。";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "書き出しは Flowlight 自身のトラフィックとして出ていきます。そのためライブと履歴には、ほかのアプリと同じように表示され、初めて新しい宛先へ送るときには Flowlight についての初回接続アラートが出ます。";
"What would be sent" = "送信される内容";
"Copy" = "コピー";
"Done" = "完了";
@@ -442,7 +441,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "このエージェントの送信のうち %@ が AI 以外のホストへ送られました";
"Allowlist" = "許可リスト";
"Risk" = "リスク";
-"Show Traffic in Reports" = "トラフィックをレポートで表示";
+"Show Traffic in History" = "トラフィックを履歴で表示";
"None seen" = "検出なし";
"Large upload" = "大量の送信";
"%@ sent to hosts that aren't AI providers" = "AI プロバイダ以外のホストへ %@ を送信しました";
@@ -481,7 +480,7 @@
"MCP servers (%lld)" = "MCP サーバ(%lld)";
"MCP servers" = "MCP サーバ";
"Guardrails" = "ガードレール";
-"Open in Reports" = "レポートで開く";
+"Open in History" = "履歴で開く";
"Only AI providers. Nothing else was contacted." = "AI プロバイダのみです。ほかへの接続はありません。";
"the tool calls its model asks for" = "モデルが要求するツール呼び出し";
"tool calls" = "ツール呼び出し";
@@ -616,7 +615,7 @@
"Documentation" = "ドキュメント";
"1 query · %@" = "問い合わせ 1 件 · %@";
"%lld queries · %@" = "問い合わせ %lld 件 · %@";
-"Open these rows in Reports" = "これらの行をレポートで開きます";
+"Open these rows in History" = "これらの行を履歴で開きます";
"Answered on this Mac · %@" = "この Mac で回答 · %@";
"1 request left this Mac · %@" = "リクエスト 1 件がこの Mac から出ました · %@";
"%lld requests left this Mac · %@" = "リクエスト %lld 件がこの Mac から出ました · %@";
@@ -1022,13 +1021,13 @@
"Zero" = "ゼロ";
"Last 2 minutes" = "過去 2 分";
"Application" = "アプリケーション";
-"%@\nDouble-click to open in Reports" = "%@\nダブルクリックするとレポートで開きます";
+"%@\nDouble-click to open in History" = "%@\nダブルクリックすると履歴で開きます";
"↓ In" = "↓ 受信";
"↑ Out" = "↑ 送信";
"Session ↓" = "セッション ↓";
"Session ↑" = "セッション ↑";
"Busiest destination" = "通信量の多い接続先";
-"Show in Reports" = "レポートで表示";
+"Show in History" = "履歴で表示";
"Copy Bundle ID" = "バンドル ID をコピー";
"Top talkers · average of the last 5 seconds" = "通信量の多いアプリ · 過去 5 秒の平均";
"The network is quiet" = "ネットワークは静かです";
@@ -1265,7 +1264,7 @@
"Nothing is being refused until %@." = "%@ まで、何も拒否しません。";
"Resume now" = "今すぐ再開";
"No rules yet" = "ルールがありません";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "ルールは対象(アプリ、エージェント、接続先、URL)を指定し、ブロックか許可を決めます。ライブ、レポート、AI エージェント、インスペクトの行を右クリックすれば、いま見ているものについてルールを作れます。テンプレートから始めることもできます。パッケージのインストールがどのホストに接続するか、ファイルがどのホストから出ていくかは、すでに書かれています。";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "ルールは対象(アプリ、エージェント、接続先、URL)を指定し、ブロックか許可を決めます。ライブ、履歴、AI エージェント、インスペクトの行を右クリックすれば、いま見ているものについてルールを作れます。テンプレートから始めることもできます。パッケージのインストールがどのホストに接続するか、ファイルがどのホストから出ていくかは、すでに書かれています。";
"Browse Templates…" = "テンプレートを見る…";
"Write One…" = "作成する…";
"Nothing yet" = "まだ何もありません";
@@ -1341,7 +1340,7 @@
"First contact with a new domain" = "新しいドメインへの初回接続";
"Connections to non-standard ports" = "非標準ポートへの接続";
"Ignore Apple's own apps" = "Apple 純正アプリを除外";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS は Apple と絶えず通信しています(アップデート、iCloud、プッシュ、時刻)。そのすべてを報告すると、本当に重要な 1 行が埋もれてしまいます。Apple のアプリのトラフィックも記録は続き、ライブとレポートには表示され、すべてのルールとガードレールの対象になります。";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS は Apple と絶えず通信しています(アップデート、iCloud、プッシュ、時刻)。そのすべてを報告すると、本当に重要な 1 行が埋もれてしまいます。Apple のアプリのトラフィックも記録は続き、ライブと履歴には表示され、すべてのルールとガードレールの対象になります。";
"Agent uses email, file transfer, SSH, tunnels or databases" = "エージェントがメール・ファイル転送・SSH・トンネル・データベースを使用";
"Agent connects to a raw IP on an unusual port" = "エージェントが異常なポートで生 IP に接続";
"Uploads to non-AI hosts above" = "AI 以外のホストへの送信が";
@@ -1618,7 +1617,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1820,7 +1819,7 @@
"Showing %lld of %lld relationships" = "%2$lld件中%1$lld件の関係を表示";
"Show %lld more relationships" = "さらに%lld件の関係を表示";
"Loads the next page without changing the Map" = "マップを変更せずに次のページを読み込みます";
-"Select a relationship for an exact Reports scope." = "正確なレポート範囲を表示するには関係を選択してください。";
+"Select a relationship for an exact History scope." = "正確な履歴範囲を表示するには関係を選択してください。";
"Period" = "期間";
"No traffic to visualize" = "可視化するトラフィックがありません";
"Flowlight has not observed any connections in this period." = "この期間にFlowlightが観測した接続はありません。";
@@ -1866,7 +1865,7 @@
"Select to inspect this connection" = "選択してこの接続を調べる";
"%lld exact destinations" = "%lld件の正確な宛先";
"%@ to %@, received %@, sent %@, %lld connections" = "%@から%@、受信%@、送信%@、%lld件の接続";
-"Show domain family in Reports" = "ドメインファミリーをレポートに表示";
+"Show domain family in History" = "ドメインファミリーを履歴に表示";
/* 0.17.0 History and Connections */
"1 mo" = "1か月";
diff --git a/Flowlight/Localization/ko.lproj/Localizable.strings b/Flowlight/Localization/ko.lproj/Localizable.strings
index f7f347c4..58059090 100644
--- a/Flowlight/Localization/ko.lproj/Localizable.strings
+++ b/Flowlight/Localization/ko.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "실시간";
"AI Agents" = "AI 에이전트";
-"Reports" = "보고서";
"Alerts" = "알림";
"Rules" = "규칙";
"Ask" = "질문";
@@ -344,7 +343,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "이 Mac의 호스트 이름 포함";
"What Flowlight sends" = "Flowlight가 보내는 내용";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "집계는 앱 하나, 호스트 이름 하나, IP 주소 하나를 해당 기간 동안 합한 것이며, 보고서와 같은 분 단위를 씁니다. 연결별이나 패킷별로는 절대 보내지 않습니다. 집계는 해당 분이 끝난 뒤 약 2분 늦게 전송되고, 알림은 발생하는 즉시 전송됩니다. 연결할 수 없는 컬렉터에는 간격을 늘려가며 재시도하며, 그동안 최대 10,000개의 레코드를 보관합니다.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "집계는 앱 하나, 호스트 이름 하나, IP 주소 하나를 해당 기간 동안 합한 것이며, 기록와 같은 분 단위를 씁니다. 연결별이나 패킷별로는 절대 보내지 않습니다. 집계는 해당 분이 끝난 뒤 약 2분 늦게 전송되고, 알림은 발생하는 즉시 전송됩니다. 연결할 수 없는 컬렉터에는 간격을 늘려가며 재시도하며, 그동안 최대 10,000개의 레코드를 보관합니다.";
"Every field that can leave this Mac (%lld)" = "이 Mac을 떠날 수 있는 모든 필드 (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "이 목록이 전부입니다. 페이로드를 만드는 것과 같은 선언에서 생성되므로 코드와 어긋날 수 없습니다. 어떤 형식에서든, 다른 무엇을 켜 두었든 절대 전송되지 않는 것은 HTTPS 검사가 기록한 내용입니다. 요청과 응답의 헤더, 본문, 도구 호출, 복호화된 교환의 내용은 내보내기로 나갈 경로가 없습니다.";
"Show What Would Be Sent…" = "보낼 내용 보기…";
@@ -361,7 +360,7 @@
"Dropped" = "버려짐";
"Retrying" = "재시도 중";
"Status" = "상태";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "내보내기는 Flowlight 자신의 트래픽으로 나가므로 다른 앱과 마찬가지로 실시간과 보고서에 표시되며, 처음 새로운 곳으로 전송될 때는 Flowlight에 대한 첫 연결 알림이 발생합니다.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "내보내기는 Flowlight 자신의 트래픽으로 나가므로 다른 앱과 마찬가지로 실시간과 기록에 표시되며, 처음 새로운 곳으로 전송될 때는 Flowlight에 대한 첫 연결 알림이 발생합니다.";
"What would be sent" = "보낼 내용";
"Copy" = "복사";
"Done" = "완료";
@@ -465,7 +464,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "이 에이전트의 업로드 중 AI 외 호스트로 간 양: %@";
"Allowlist" = "허용 목록";
"Risk" = "위험도";
-"Show Traffic in Reports" = "보고서에서 트래픽 보기";
+"Show Traffic in History" = "기록에서 트래픽 보기";
"None seen" = "확인된 항목 없음";
"Large upload" = "대용량 업로드";
"%@ sent to hosts that aren't AI providers" = "AI 제공업체가 아닌 호스트로 %@ 전송";
@@ -504,7 +503,7 @@
"MCP servers (%lld)" = "MCP 서버 (%lld)";
"MCP servers" = "MCP 서버";
"Guardrails" = "가드레일";
-"Open in Reports" = "보고서에서 열기";
+"Open in History" = "기록에서 열기";
"Only AI providers. Nothing else was contacted." = "AI 제공업체뿐입니다. 그 외에는 연결하지 않았습니다.";
"the tool calls its model asks for" = "모델이 요청하는 도구 호출";
"tool calls" = "도구 호출";
@@ -639,7 +638,7 @@
"Documentation" = "문서";
"1 query · %@" = "질의 1개 · %@";
"%lld queries · %@" = "질의 %lld개 · %@";
-"Open these rows in Reports" = "이 행을 보고서에서 열기";
+"Open these rows in History" = "이 행을 기록에서 열기";
"Answered on this Mac · %@" = "이 Mac에서 답변함 · %@";
"1 request left this Mac · %@" = "요청 1건이 이 Mac을 떠났습니다 · %@";
"%lld requests left this Mac · %@" = "요청 %lld건이 이 Mac을 떠났습니다 · %@";
@@ -1045,13 +1044,13 @@
"Zero" = "0";
"Last 2 minutes" = "최근 2분";
"Application" = "응용 프로그램";
-"%@\nDouble-click to open in Reports" = "%@\n두 번 클릭하면 보고서에서 열립니다";
+"%@\nDouble-click to open in History" = "%@\n두 번 클릭하면 기록에서 열립니다";
"↓ In" = "↓ 수신";
"↑ Out" = "↑ 송신";
"Session ↓" = "세션 ↓";
"Session ↑" = "세션 ↑";
"Busiest destination" = "가장 바쁜 목적지";
-"Show in Reports" = "보고서에서 보기";
+"Show in History" = "기록에서 보기";
"Copy Bundle ID" = "번들 ID 복사";
"Top talkers · average of the last 5 seconds" = "통신량 상위 · 최근 5초 평균";
"The network is quiet" = "네트워크가 조용합니다";
@@ -1288,7 +1287,7 @@
"Nothing is being refused until %@." = "%@까지는 아무것도 거부하지 않습니다.";
"Resume now" = "지금 다시 시작";
"No rules yet" = "아직 규칙이 없습니다";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "규칙은 앱, 에이전트, 목적지 또는 URL을 지정하고 차단할지 허용할지 정합니다. 실시간, 보고서, AI 에이전트, 검사 화면에서 아무 행이나 오른쪽 클릭하면 지금 보고 있는 대상에 대한 규칙을 바로 작성할 수 있고, 라이브러리에서 시작할 수도 있습니다. 라이브러리는 패키지 설치가 어떤 호스트에 연결하는지, 파일이 어떤 호스트로 빠져나가는지 이미 알고 있습니다.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "규칙은 앱, 에이전트, 목적지 또는 URL을 지정하고 차단할지 허용할지 정합니다. 실시간, 기록, AI 에이전트, 검사 화면에서 아무 행이나 오른쪽 클릭하면 지금 보고 있는 대상에 대한 규칙을 바로 작성할 수 있고, 라이브러리에서 시작할 수도 있습니다. 라이브러리는 패키지 설치가 어떤 호스트에 연결하는지, 파일이 어떤 호스트로 빠져나가는지 이미 알고 있습니다.";
"Browse Templates…" = "템플릿 둘러보기…";
"Write One…" = "직접 작성…";
"Nothing yet" = "아직 없음";
@@ -1364,7 +1363,7 @@
"First contact with a new domain" = "새 도메인에 대한 첫 연결";
"Connections to non-standard ports" = "비표준 포트 연결";
"Ignore Apple's own apps" = "Apple 기본 앱 무시";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS는 업데이트, iCloud, 푸시, 시간 동기화 때문에 Apple과 끊임없이 통신하며, 그것을 모두 보고하면 정작 중요한 한 줄이 묻힙니다. Apple의 트래픽도 그대로 기록되고, 실시간과 보고서에 표시되며, 모든 규칙과 가드레일이 적용됩니다.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS는 업데이트, iCloud, 푸시, 시간 동기화 때문에 Apple과 끊임없이 통신하며, 그것을 모두 보고하면 정작 중요한 한 줄이 묻힙니다. Apple의 트래픽도 그대로 기록되고, 실시간과 기록에 표시되며, 모든 규칙과 가드레일이 적용됩니다.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "에이전트가 이메일, 파일 전송, SSH, 터널 또는 데이터베이스 사용";
"Agent connects to a raw IP on an unusual port" = "에이전트가 비정상 포트로 원시 IP에 연결";
"Uploads to non-AI hosts above" = "AI 외 호스트로 업로드가";
@@ -1617,7 +1616,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1819,7 +1818,7 @@
"Showing %lld of %lld relationships" = "관계 %2$lld개 중 %1$lld개 표시";
"Show %lld more relationships" = "관계 %lld개 더 표시";
"Loads the next page without changing the Map" = "지도를 변경하지 않고 다음 페이지를 불러옵니다";
-"Select a relationship for an exact Reports scope." = "정확한 보고서 범위를 보려면 관계를 선택하십시오.";
+"Select a relationship for an exact History scope." = "정확한 기록 범위를 보려면 관계를 선택하십시오.";
"Period" = "기간";
"No traffic to visualize" = "시각화할 트래픽 없음";
"Flowlight has not observed any connections in this period." = "이 기간에 Flowlight가 관찰한 연결이 없습니다.";
@@ -1865,7 +1864,7 @@
"Select to inspect this connection" = "선택하여 이 연결 조사";
"%lld exact destinations" = "정확한 대상 %lld개";
"%@ to %@, received %@, sent %@, %lld connections" = "%@에서 %@, 수신 %@, 송신 %@, 연결 %lld개";
-"Show domain family in Reports" = "보고서에서 도메인 계열 보기";
+"Show domain family in History" = "기록에서 도메인 계열 보기";
/* 0.17.0 History and Connections */
"1 mo" = "1개월";
diff --git a/Flowlight/Localization/pt-PT.lproj/Localizable.strings b/Flowlight/Localization/pt-PT.lproj/Localizable.strings
index 0f96f82d..b632420c 100644
--- a/Flowlight/Localization/pt-PT.lproj/Localizable.strings
+++ b/Flowlight/Localization/pt-PT.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "Em direto";
"AI Agents" = "Agentes de IA";
-"Reports" = "Relatórios";
"Alerts" = "Alertas";
"Rules" = "Regras";
"Ask" = "Perguntar";
@@ -344,7 +343,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "Incluir o nome de anfitrião deste Mac";
"What Flowlight sends" = "O que o Flowlight envia";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Uma agregação é uma app, um nome de anfitrião e um endereço IP somados ao longo do período, com a mesma granularidade de minuto que os Relatórios usam — nunca por ligação nem por pacote. As agregações seguem com cerca de dois minutos de atraso, quando o minuto a que pertencem está completo; os alertas seguem à medida que são levantados. Um coletor inacessível é tentado de novo com um atraso crescente, e são guardados no máximo 10 000 registos enquanto estiver em baixo.";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Uma agregação é uma app, um nome de anfitrião e um endereço IP somados ao longo do período, com a mesma granularidade de minuto que o Histórico usa — nunca por ligação nem por pacote. As agregações seguem com cerca de dois minutos de atraso, quando o minuto a que pertencem está completo; os alertas seguem à medida que são levantados. Um coletor inacessível é tentado de novo com um atraso crescente, e são guardados no máximo 10 000 registos enquanto estiver em baixo.";
"Every field that can leave this Mac (%lld)" = "Todos os campos que podem sair deste Mac (%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Essa lista é tudo — é gerada a partir da mesma declaração com que o payload é construído, por isso não pode ficar atrás do código. Nunca é enviado, em qualquer formato e com o que mais esteja ativado: tudo o que a inspeção HTTPS registe. Os cabeçalhos de pedido e de resposta, os corpos, as chamadas de ferramentas e o conteúdo de qualquer troca desencriptada não têm caminho para uma exportação.";
"Show What Would Be Sent…" = "Mostrar o que seria enviado…";
@@ -361,7 +360,7 @@
"Dropped" = "Descartados";
"Retrying" = "A tentar de novo";
"Status" = "Estado";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "As exportações saem como tráfego do próprio Flowlight, por isso vê-las-á em Em direto e Relatórios como as de qualquer outra app, e a primeira vez que forem para um sítio novo receberá um alerta de primeiro contacto sobre o Flowlight.";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "As exportações saem como tráfego do próprio Flowlight, por isso vê-las-á em Em direto e Histórico como as de qualquer outra app, e a primeira vez que forem para um sítio novo receberá um alerta de primeiro contacto sobre o Flowlight.";
"What would be sent" = "O que seria enviado";
"Copy" = "Copiar";
"Done" = "Concluído";
@@ -465,7 +464,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "%@ dos envios deste agente foram para anfitriões não-IA";
"Allowlist" = "Lista de permissões";
"Risk" = "Risco";
-"Show Traffic in Reports" = "Ver o tráfego em Relatórios";
+"Show Traffic in History" = "Ver o tráfego no Histórico";
"None seen" = "Nada visto";
"Large upload" = "Envio grande";
"%@ sent to hosts that aren't AI providers" = "%@ enviados para anfitriões que não são fornecedores de IA";
@@ -504,7 +503,7 @@
"MCP servers (%lld)" = "Servidores MCP (%lld)";
"MCP servers" = "Servidores MCP";
"Guardrails" = "Proteções";
-"Open in Reports" = "Abrir em Relatórios";
+"Open in History" = "Abrir no Histórico";
"Only AI providers. Nothing else was contacted." = "Apenas fornecedores de IA. Não foi contactado mais nada.";
"the tool calls its model asks for" = "as chamadas de ferramentas que o seu modelo pede";
"tool calls" = "chamadas de ferramentas";
@@ -639,7 +638,7 @@
"Documentation" = "Documentação";
"1 query · %@" = "1 consulta · %@";
"%lld queries · %@" = "%lld consultas · %@";
-"Open these rows in Reports" = "Abrir estas linhas em Relatórios";
+"Open these rows in History" = "Abrir estas linhas no Histórico";
"Answered on this Mac · %@" = "Respondido neste Mac · %@";
"1 request left this Mac · %@" = "1 pedido saiu deste Mac · %@";
"%lld requests left this Mac · %@" = "%lld pedidos saíram deste Mac · %@";
@@ -1045,13 +1044,13 @@
"Zero" = "Zero";
"Last 2 minutes" = "Últimos 2 minutos";
"Application" = "Aplicação";
-"%@\nDouble-click to open in Reports" = "%@\nClique duas vezes para abrir em Relatórios";
+"%@\nDouble-click to open in History" = "%@\nClique duas vezes para abrir no Histórico";
"↓ In" = "↓ Entrada";
"↑ Out" = "↑ Saída";
"Session ↓" = "Sessão ↓";
"Session ↑" = "Sessão ↑";
"Busiest destination" = "Destino mais ativo";
-"Show in Reports" = "Ver em Relatórios";
+"Show in History" = "Ver no Histórico";
"Copy Bundle ID" = "Copiar identificador de pacote";
"Top talkers · average of the last 5 seconds" = "Apps mais ativas · média dos últimos 5 segundos";
"The network is quiet" = "A rede está calma";
@@ -1288,7 +1287,7 @@
"Nothing is being refused until %@." = "Nada está a ser recusado até %@.";
"Resume now" = "Retomar agora";
"No rules yet" = "Ainda sem regras";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Uma regra nomeia algo — uma app, um agente, um destino ou um URL — e diz bloquear ou permitir. Clique com o botão direito em qualquer linha de Em direto, Relatórios, Agentes de IA ou Inspecionar para escrever uma sobre o que está a ver, ou comece pela biblioteca — já sabe que anfitriões uma instalação de pacote contacta e por quais sai um ficheiro.";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Uma regra nomeia algo — uma app, um agente, um destino ou um URL — e diz bloquear ou permitir. Clique com o botão direito em qualquer linha de Em direto, Histórico, Agentes de IA ou Inspecionar para escrever uma sobre o que está a ver, ou comece pela biblioteca — já sabe que anfitriões uma instalação de pacote contacta e por quais sai um ficheiro.";
"Browse Templates…" = "Ver os modelos…";
"Write One…" = "Escrever uma…";
"Nothing yet" = "Ainda nada";
@@ -1364,7 +1363,7 @@
"First contact with a new domain" = "Primeiro contacto com um novo domínio";
"Connections to non-standard ports" = "Ligações a portas não padrão";
"Ignore Apple's own apps" = "Ignorar as apps da Apple";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "O macOS fala com a Apple constantemente — atualizações, iCloud, notificações, hora — e comunicar tudo isso enterra a única linha que importa. O tráfego dessas apps continua a ser registado, continua visível em Em direto e Relatórios, e continua sujeito a todas as regras e proteções.";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "O macOS fala com a Apple constantemente — atualizações, iCloud, notificações, hora — e comunicar tudo isso enterra a única linha que importa. O tráfego dessas apps continua a ser registado, continua visível em Em direto e Histórico, e continua sujeito a todas as regras e proteções.";
"Agent uses email, file transfer, SSH, tunnels or databases" = "O agente usa e-mail, transferência de ficheiros, SSH, túneis ou bases de dados";
"Agent connects to a raw IP on an unusual port" = "O agente liga-se a um IP direto numa porta invulgar";
"Uploads to non-AI hosts above" = "Envios para anfitriões não-IA acima de";
@@ -1617,7 +1616,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1819,7 +1818,7 @@
"Showing %lld of %lld relationships" = "A mostrar %lld de %lld relações";
"Show %lld more relationships" = "Mostrar mais %lld relações";
"Loads the next page without changing the Map" = "Carrega a página seguinte sem alterar o mapa";
-"Select a relationship for an exact Reports scope." = "Selecione uma relação para obter um âmbito exato nos Relatórios.";
+"Select a relationship for an exact History scope." = "Selecione uma relação para obter um âmbito exato no Histórico.";
"Period" = "Período";
"No traffic to visualize" = "Sem tráfego para visualizar";
"Flowlight has not observed any connections in this period." = "O Flowlight não observou ligações neste período.";
@@ -1865,7 +1864,7 @@
"Select to inspect this connection" = "Selecione para inspecionar esta ligação";
"%lld exact destinations" = "%lld destinos exatos";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ para %@, recebeu %@, enviou %@, %lld ligações";
-"Show domain family in Reports" = "Mostrar família de domínios em Relatórios";
+"Show domain family in History" = "Mostrar família de domínios no Histórico";
/* 0.17.0 History and Connections */
"1 mo" = "1 mês";
diff --git a/Flowlight/Localization/zh-Hans.lproj/Localizable.strings b/Flowlight/Localization/zh-Hans.lproj/Localizable.strings
index 9c9a9a5e..74ba9658 100644
--- a/Flowlight/Localization/zh-Hans.lproj/Localizable.strings
+++ b/Flowlight/Localization/zh-Hans.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "实时";
"AI Agents" = "AI 代理";
-"Reports" = "报告";
"Alerts" = "警报";
"Rules" = "规则";
"Ask" = "提问";
@@ -344,7 +343,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "包含这台 Mac 的主机名";
"What Flowlight sends" = "Flowlight 发送的内容";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一条汇总是一个应用、一个主机名和一个 IP 地址在该时间窗口内的累加,粒度与“报告”所用的分钟相同 —— 从不按连接,也从不按数据包。汇总大约延迟两分钟发出,即在其所属的那一分钟结束之后;警报则在触发时立即发出。无法连接的收集器会以递增的延迟重试,在它不可用期间最多保留 10,000 条记录。";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一条汇总是一个应用、一个主机名和一个 IP 地址在该时间窗口内的累加,粒度与“历史记录”所用的分钟相同 —— 从不按连接,也从不按数据包。汇总大约延迟两分钟发出,即在其所属的那一分钟结束之后;警报则在触发时立即发出。无法连接的收集器会以递增的延迟重试,在它不可用期间最多保留 10,000 条记录。";
"Every field that can leave this Mac (%lld)" = "可能离开这台 Mac 的全部字段(%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "那份列表就是全部 —— 它由构建请求内容所依据的同一份声明生成,因此不会落后于代码。无论采用哪种格式、无论还开启了什么,以下内容从不发送:HTTPS 检查记录的一切。请求与响应的标头、正文、工具调用,以及任何已解密交互的内容,都没有通往导出的路径。";
"Show What Would Be Sent…" = "查看将要发送的内容…";
@@ -361,7 +360,7 @@
"Dropped" = "已丢弃";
"Retrying" = "正在重试";
"Status" = "状态";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "导出会作为 Flowlight 自己的流量发出,因此你会像看到其他应用那样在“实时”和“报告”中看到它们;而当它们首次发往新的目标时,你会收到一条关于 Flowlight 的首次连接警报。";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "导出会作为 Flowlight 自己的流量发出,因此你会像看到其他应用那样在“实时”和“历史记录”中看到它们;而当它们首次发往新的目标时,你会收到一条关于 Flowlight 的首次连接警报。";
"What would be sent" = "将要发送的内容";
"Copy" = "拷贝";
"Done" = "完成";
@@ -465,7 +464,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "该代理上传量的 %@ 发往了非 AI 主机";
"Allowlist" = "允许列表";
"Risk" = "风险";
-"Show Traffic in Reports" = "在报告中查看流量";
+"Show Traffic in History" = "在历史记录中查看流量";
"None seen" = "未发现";
"Large upload" = "大量上传";
"%@ sent to hosts that aren't AI providers" = "已向非 AI 提供方的主机发送 %@";
@@ -504,7 +503,7 @@
"MCP servers (%lld)" = "MCP 服务器(%lld)";
"MCP servers" = "MCP 服务器";
"Guardrails" = "护栏";
-"Open in Reports" = "在报告中打开";
+"Open in History" = "在历史记录中打开";
"Only AI providers. Nothing else was contacted." = "只有 AI 提供方,没有连接其他目标。";
"the tool calls its model asks for" = "它的模型所请求的工具调用";
"tool calls" = "工具调用";
@@ -639,7 +638,7 @@
"Documentation" = "文档";
"1 query · %@" = "1 条查询 · %@";
"%lld queries · %@" = "%lld 条查询 · %@";
-"Open these rows in Reports" = "在“报告”中打开这些行";
+"Open these rows in History" = "在“历史记录”中打开这些行";
"Answered on this Mac · %@" = "在这台 Mac 上作答 · %@";
"1 request left this Mac · %@" = "1 个请求离开了这台 Mac · %@";
"%lld requests left this Mac · %@" = "%lld 个请求离开了这台 Mac · %@";
@@ -1045,13 +1044,13 @@
"Zero" = "零";
"Last 2 minutes" = "最近 2 分钟";
"Application" = "应用程序";
-"%@\nDouble-click to open in Reports" = "%@\n双击可在“报告”中打开";
+"%@\nDouble-click to open in History" = "%@\n双击可在“历史记录”中打开";
"↓ In" = "↓ 接收";
"↑ Out" = "↑ 发送";
"Session ↓" = "本次会话 ↓";
"Session ↑" = "本次会话 ↑";
"Busiest destination" = "流量最高的目标";
-"Show in Reports" = "在报告中查看";
+"Show in History" = "在历史记录中查看";
"Copy Bundle ID" = "拷贝 Bundle ID";
"Top talkers · average of the last 5 seconds" = "流量最高的应用 · 最近 5 秒的平均值";
"The network is quiet" = "网络很安静";
@@ -1288,7 +1287,7 @@
"Nothing is being refused until %@." = "在 %@ 之前不会拒绝任何连接。";
"Resume now" = "立即恢复";
"No rules yet" = "还没有规则";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一条规则指明一个对象 —— 应用、代理、目标或 URL —— 并决定阻止还是允许。在“实时”、“报告”、“AI 代理”或“检查”中右键点按任意一行,就能针对你正在看的内容写一条;也可以从模板库开始 —— 它已经知道安装软件包会连接哪些主机,以及文件会经由哪些主机外传。";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一条规则指明一个对象 —— 应用、代理、目标或 URL —— 并决定阻止还是允许。在“实时”、“历史记录”、“AI 代理”或“检查”中右键点按任意一行,就能针对你正在看的内容写一条;也可以从模板库开始 —— 它已经知道安装软件包会连接哪些主机,以及文件会经由哪些主机外传。";
"Browse Templates…" = "浏览模板…";
"Write One…" = "写一条…";
"Nothing yet" = "暂无内容";
@@ -1364,7 +1363,7 @@
"First contact with a new domain" = "首次连接新域名";
"Connections to non-standard ports" = "连接到非标准端口";
"Ignore Apple's own apps" = "忽略 Apple 自带应用";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS 会不断与 Apple 通信 —— 更新、iCloud、推送、时间 —— 把这些全部上报,只会淹没真正重要的那一条。这些流量仍会被记录,仍会显示在“实时”和“报告”中,也仍然受每一条规则和护栏的约束。";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS 会不断与 Apple 通信 —— 更新、iCloud、推送、时间 —— 把这些全部上报,只会淹没真正重要的那一条。这些流量仍会被记录,仍会显示在“实时”和“历史记录”中,也仍然受每一条规则和护栏的约束。";
"Agent uses email, file transfer, SSH, tunnels or databases" = "代理使用邮件、文件传输、SSH、隧道或数据库";
"Agent connects to a raw IP on an unusual port" = "代理通过异常端口连接裸 IP";
"Uploads to non-AI hosts above" = "上传至非 AI 主机超过";
@@ -1617,7 +1616,7 @@
"Reinstall Filter" = "待翻译:Reinstall Filter";
"Potential harm" = "待翻译:Potential harm";
"Show only medium and high local risk assessments" = "待翻译:Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "待翻译:Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "待翻译:Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "待翻译:Showing only requests with medium or high potential harm";
"Response modified" = "待翻译:Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "待翻译:%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1819,7 +1818,7 @@
"Showing %lld of %lld relationships" = "正在显示 %2$lld 个关系中的 %1$lld 个";
"Show %lld more relationships" = "再显示 %lld 个关系";
"Loads the next page without changing the Map" = "加载下一页而不更改地图";
-"Select a relationship for an exact Reports scope." = "请选择一个关系以获得精确的报告范围。";
+"Select a relationship for an exact History scope." = "请选择一个关系以获得精确的历史记录范围。";
"Period" = "时间段";
"No traffic to visualize" = "没有可视化的流量";
"Flowlight has not observed any connections in this period." = "Flowlight 在此时间段内未观察到任何连接。";
@@ -1865,7 +1864,7 @@
"Select to inspect this connection" = "选择以检查此连接";
"%lld exact destinations" = "%lld 个精确目标";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ 到 %@,接收 %@,发送 %@,%lld 个连接";
-"Show domain family in Reports" = "在报告中显示域名族";
+"Show domain family in History" = "在历史记录中显示域名族";
/* 0.17.0 History and Connections */
"1 mo" = "1个月";
diff --git a/Flowlight/Localization/zh-Hant.lproj/Localizable.strings b/Flowlight/Localization/zh-Hant.lproj/Localizable.strings
index a5b6c3a8..b6ab15ab 100644
--- a/Flowlight/Localization/zh-Hant.lproj/Localizable.strings
+++ b/Flowlight/Localization/zh-Hant.lproj/Localizable.strings
@@ -65,7 +65,6 @@
/* App/AppNavigation.swift */
"Live" = "即時";
"AI Agents" = "AI 代理";
-"Reports" = "報告";
"Alerts" = "警示";
"Rules" = "規則";
"Ask" = "提問";
@@ -344,7 +343,7 @@
"flowlight" = "flowlight";
"Include this Mac's host name" = "包含這台 Mac 的主機名稱";
"What Flowlight sends" = "Flowlight 傳送的內容";
-"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一筆彙總資料是一個 App、一個主機名稱和一個 IP 位址在該時間範圍內的累加,精細度與「報告」相同,以分鐘為單位 — 絕不是逐條連線,也絕不是逐個封包。彙總資料大約延後兩分鐘送出,等它所屬的那一分鐘結束之後;警示則在發出時立即送出。連不上的收集器會以逐漸拉長的間隔重試,在它無法連線期間,最多保留 10,000 筆記錄。";
+"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一筆彙總資料是一個 App、一個主機名稱和一個 IP 位址在該時間範圍內的累加,精細度與「歷史記錄」相同,以分鐘為單位 — 絕不是逐條連線,也絕不是逐個封包。彙總資料大約延後兩分鐘送出,等它所屬的那一分鐘結束之後;警示則在發出時立即送出。連不上的收集器會以逐漸拉長的間隔重試,在它無法連線期間,最多保留 10,000 筆記錄。";
"Every field that can leave this Mac (%lld)" = "所有可能離開這台 Mac 的欄位(%lld)";
"That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "這份清單就是全部 — 它是由建立傳送內容所用的同一份宣告產生的,所以不會落後於程式碼。無論格式為何、無論還開啟了什麼,以下內容一律不會送出:HTTPS 檢查記錄的任何東西。請求與回應的標頭、內文、工具呼叫,以及任何解密後交換的內容,都沒有任何管道進入匯出資料。";
"Show What Would Be Sent…" = "顯示將傳送的內容…";
@@ -361,7 +360,7 @@
"Dropped" = "已丟棄";
"Retrying" = "重試中";
"Status" = "狀態";
-"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "匯出是以 Flowlight 自己的流量送出的,所以你會像看其他 App 一樣,在「即時」和「報告」中看到它們;而第一次送到新的地方時,你會收到一則關於 Flowlight 的首次連線警示。";
+"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "匯出是以 Flowlight 自己的流量送出的,所以你會像看其他 App 一樣,在「即時」和「歷史記錄」中看到它們;而第一次送到新的地方時,你會收到一則關於 Flowlight 的首次連線警示。";
"What would be sent" = "將傳送的內容";
"Copy" = "拷貝";
"Done" = "完成";
@@ -465,7 +464,7 @@
"%@ of this agent's uploads went to non-AI hosts" = "這個代理有 %@ 的上傳量送到了非 AI 主機";
"Allowlist" = "允許清單";
"Risk" = "風險";
-"Show Traffic in Reports" = "在「報告」中顯示流量";
+"Show Traffic in History" = "在「歷史記錄」中顯示流量";
"None seen" = "未看到任何項目";
"Large upload" = "大量上傳";
"%@ sent to hosts that aren't AI providers" = "已傳送 %@ 到非 AI 供應商的主機";
@@ -504,7 +503,7 @@
"MCP servers (%lld)" = "MCP 伺服器(%lld)";
"MCP servers" = "MCP 伺服器";
"Guardrails" = "防護機制";
-"Open in Reports" = "在「報告」中開啟";
+"Open in History" = "在「歷史記錄」中開啟";
"Only AI providers. Nothing else was contacted." = "只有 AI 供應商,沒有連線其他目標。";
"the tool calls its model asks for" = "它的模型要求的工具呼叫";
"tool calls" = "工具呼叫";
@@ -639,7 +638,7 @@
"Documentation" = "說明文件";
"1 query · %@" = "1 個查詢 · %@";
"%lld queries · %@" = "%lld 個查詢 · %@";
-"Open these rows in Reports" = "在「報告」中開啟這些列";
+"Open these rows in History" = "在「歷史記錄」中開啟這些列";
"Answered on this Mac · %@" = "在這台 Mac 上作答 · %@";
"1 request left this Mac · %@" = "1 個請求離開了這台 Mac · %@";
"%lld requests left this Mac · %@" = "%lld 個請求離開了這台 Mac · %@";
@@ -1045,13 +1044,13 @@
"Zero" = "零";
"Last 2 minutes" = "最近 2 分鐘";
"Application" = "應用程式";
-"%@\nDouble-click to open in Reports" = "%@\n按兩下可在「報告」中開啟";
+"%@\nDouble-click to open in History" = "%@\n按兩下可在「歷史記錄」中開啟";
"↓ In" = "↓ 接收";
"↑ Out" = "↑ 傳送";
"Session ↓" = "工作階段 ↓";
"Session ↑" = "工作階段 ↑";
"Busiest destination" = "最忙碌的目標";
-"Show in Reports" = "在「報告」中顯示";
+"Show in History" = "在「歷史記錄」中顯示";
"Copy Bundle ID" = "拷貝 Bundle ID";
"Top talkers · average of the last 5 seconds" = "流量最高的項目 · 最近 5 秒的平均值";
"The network is quiet" = "網路很安靜";
@@ -1288,7 +1287,7 @@
"Nothing is being refused until %@." = "在 %@ 之前不會拒絕任何連線。";
"Resume now" = "立即恢復";
"No rules yet" = "還沒有任何規則";
-"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一條規則會指名某個對象 — App、代理、目標或 URL — 並決定封鎖或允許。在「即時」、「報告」、「AI 代理」或「檢查」中對任一列按右鍵,就能針對你正在看的東西寫一條規則;也可以從範本庫開始 — 它已經知道安裝套件會連到哪些主機,以及檔案通常是從哪些主機離開的。";
+"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一條規則會指名某個對象 — App、代理、目標或 URL — 並決定封鎖或允許。在「即時」、「歷史記錄」、「AI 代理」或「檢查」中對任一列按右鍵,就能針對你正在看的東西寫一條規則;也可以從範本庫開始 — 它已經知道安裝套件會連到哪些主機,以及檔案通常是從哪些主機離開的。";
"Browse Templates…" = "瀏覽範本…";
"Write One…" = "自己寫一條…";
"Nothing yet" = "還沒有任何項目";
@@ -1364,7 +1363,7 @@
"First contact with a new domain" = "首次連線新網域";
"Connections to non-standard ports" = "連線到非標準連接埠";
"Ignore Apple's own apps" = "忽略 Apple 內建 App";
-"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS 會不斷與 Apple 通訊 — 更新、iCloud、推播、時間 — 把這些全部報告出來,只會埋掉真正重要的那一行。這些流量仍然會被記錄,仍然會顯示在「即時」和「報告」中,也仍然受所有規則和防護機制約束。";
+"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS 會不斷與 Apple 通訊 — 更新、iCloud、推播、時間 — 把這些全部歷史記錄出來,只會埋掉真正重要的那一行。這些流量仍然會被記錄,仍然會顯示在「即時」和「歷史記錄」中,也仍然受所有規則和防護機制約束。";
"Agent uses email, file transfer, SSH, tunnels or databases" = "代理使用郵件、檔案傳輸、SSH、通道或資料庫";
"Agent connects to a raw IP on an unusual port" = "代理透過異常連接埠連線裸 IP";
"Uploads to non-AI hosts above" = "上傳至非 AI 主機超過";
@@ -1617,7 +1616,7 @@
"Reinstall Filter" = "Reinstall Filter";
"Potential harm" = "Potential harm";
"Show only medium and high local risk assessments" = "Show only medium and high local risk assessments";
-"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter";
+"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter";
"Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm";
"Response modified" = "Response modified";
"%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it";
@@ -1819,7 +1818,7 @@
"Showing %lld of %lld relationships" = "正在顯示 %2$lld 個關係中的 %1$lld 個";
"Show %lld more relationships" = "再顯示 %lld 個關係";
"Loads the next page without changing the Map" = "載入下一頁而不變更地圖";
-"Select a relationship for an exact Reports scope." = "請選取一個關係以取得精確的報告範圍。";
+"Select a relationship for an exact History scope." = "請選取一個關係以取得精確的歷史記錄範圍。";
"Period" = "期間";
"No traffic to visualize" = "沒有可視覺化的流量";
"Flowlight has not observed any connections in this period." = "Flowlight 在此期間未觀察到任何連線。";
@@ -1865,7 +1864,7 @@
"Select to inspect this connection" = "選取以檢查此連線";
"%lld exact destinations" = "%lld 個精確目的地";
"%@ to %@, received %@, sent %@, %lld connections" = "%@ 到 %@,接收 %@,傳送 %@,%lld 個連線";
-"Show domain family in Reports" = "在報告中顯示網域族";
+"Show domain family in History" = "在歷史記錄中顯示網域族";
/* 0.17.0 History and Connections */
"1 mo" = "1 個月";
diff --git a/Flowlight/UI/AgentsView.swift b/Flowlight/UI/AgentsView.swift
index 66868225..c0fa3da4 100644
--- a/Flowlight/UI/AgentsView.swift
+++ b/Flowlight/UI/AgentsView.swift
@@ -169,7 +169,7 @@ struct AgentsView: View {
}
.contextMenu(forSelectionType: AgentSummary.ID.self) { ids in
if let id = ids.first {
- Button(L("Show Traffic in Reports")) { nav.showReport(filter: TrafficFilter(bundleID: id), granularity: window.granularity) }
+ Button(L("Show Traffic in History")) { nav.showReport(filter: TrafficFilter(bundleID: id), granularity: window.granularity) }
InspectMenuItems(app: (id, agents.first { $0.bundleID == id }?.name ?? id))
FocusMenuItems(app: (id, agents.first { $0.bundleID == id }?.name ?? id))
Divider()
@@ -622,7 +622,7 @@ struct AgentDetail: View {
.pickerStyle(.segmented).labelsHidden().fixedSize().controlSize(.small)
}
Spacer()
- Button(L("Open in Reports")) {
+ Button(L("Open in History")) {
nav.showReport(filter: TrafficFilter(bundleID: agent.bundleID), granularity: window.granularity)
}
.controlSize(.small)
diff --git a/Flowlight/UI/AlertsView.swift b/Flowlight/UI/AlertsView.swift
index 932d7191..075d609f 100644
--- a/Flowlight/UI/AlertsView.swift
+++ b/Flowlight/UI/AlertsView.swift
@@ -97,7 +97,7 @@ struct AlertsView: View {
}
Divider()
}
- Button(L("Show Traffic in Reports")) { if let a = alert(ids.first) { openReport(a) } }.disabled(ids.count != 1)
+ Button(L("Show Traffic in History")) { if let a = alert(ids.first) { openReport(a) } }.disabled(ids.count != 1)
Button(L("Acknowledge")) { monitor.acknowledgeAlerts(ids: Array(ids)) }
Button(L("Copy Detail")) {
NSPasteboard.general.clearContents()
diff --git a/Flowlight/UI/AskView.swift b/Flowlight/UI/AskView.swift
index 608aa497..3bd7f19f 100644
--- a/Flowlight/UI/AskView.swift
+++ b/Flowlight/UI/AskView.swift
@@ -295,7 +295,7 @@ private struct AskTurnView: View {
}
.buttonStyle(.plain)
.disabled(call.filter == nil && call.screen == nil)
- .help(call.filter != nil ? L("Open these rows in Reports")
+ .help(call.filter != nil ? L("Open these rows in History")
: call.screen != nil ? L("Open %@", call.screen!.title) : call.summary)
if index < turn.calls.count - 1 { Divider() }
}
diff --git a/Flowlight/UI/InspectView.swift b/Flowlight/UI/InspectView.swift
index 631f37f7..4bc3ee03 100644
--- a/Flowlight/UI/InspectView.swift
+++ b/Flowlight/UI/InspectView.swift
@@ -343,7 +343,7 @@ private struct InspectContent: View {
.toggleStyle(.button)
.disabled(!LocalRiskSettings.isActive)
.help(LocalRiskSettings.isActive ? L("Show only medium and high local risk assessments")
- : L("Turn on Local risk analysis in Reports or Settings to use this filter"))
+ : L("Turn on Local risk analysis in History or Settings to use this filter"))
Picker(L("Window"), selection: $window) {
ForEach(AgentWindow.allCases) { Text($0.title).tag($0) }
}
diff --git a/Flowlight/UI/LiveView.swift b/Flowlight/UI/LiveView.swift
index 34e20680..88fd21d1 100644
--- a/Flowlight/UI/LiveView.swift
+++ b/Flowlight/UI/LiveView.swift
@@ -49,7 +49,7 @@ struct LiveView: View {
GroupBox {
Table(monitor.talkers.sorted(using: sortOrder), selection: $selection, sortOrder: $sortOrder) {
TableColumn(L("Application"), value: \.name) { t in
- HStack { AppIconView(path: t.path); Text(t.name) }.help(L("%@\nDouble-click to open in Reports", t.bundleID))
+ HStack { AppIconView(path: t.path); Text(t.name) }.help(L("%@\nDouble-click to open in History", t.bundleID))
}
.width(min: 130)
TableColumn(L("↓ In"), value: \.rateIn) { Text("\(ByteFormat.compact($0.rateIn))/s").monospacedDigit().help(ByteFormat.rate($0.rateIn)) }
@@ -67,7 +67,7 @@ struct LiveView: View {
}
.contextMenu(forSelectionType: LiveTalker.ID.self) { ids in
if let id = ids.first {
- Button(L("Show in Reports")) { openReport(id) }
+ Button(L("Show in History")) { openReport(id) }
InspectMenuItems(app: (id, monitor.talkers.first { $0.bundleID == id }?.name ?? id),
host: monitor.talkers.first { $0.bundleID == id }?.topDestination)
FocusMenuItems(app: (id, monitor.talkers.first { $0.bundleID == id }?.name ?? id))
diff --git a/Flowlight/UI/RulesView.swift b/Flowlight/UI/RulesView.swift
index 880705a7..59a37747 100644
--- a/Flowlight/UI/RulesView.swift
+++ b/Flowlight/UI/RulesView.swift
@@ -247,7 +247,7 @@ struct RulesView: View {
ContentUnavailableView {
Label(L("No rules yet"), systemImage: "hand.raised")
} description: {
- Text(L("A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by."))
+ Text(L("A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by."))
} actions: {
Button(L("Browse Templates…")) { sheet = .library(nil, RuleTemplate.Subject()) }
Button(L("Write One…")) { sheet = .editor(Rule(), isNew: true) }
diff --git a/Flowlight/UI/SettingsView.swift b/Flowlight/UI/SettingsView.swift
index 816ce4c2..c7c0df31 100644
--- a/Flowlight/UI/SettingsView.swift
+++ b/Flowlight/UI/SettingsView.swift
@@ -68,7 +68,7 @@ struct SettingsView: View {
Toggle(L("First contact with a new domain"), isOn: $firstContact)
Toggle(L("Connections to non-standard ports"), isOn: $nonStandardPorts)
Toggle(L("Ignore Apple's own apps"), isOn: $ignoreAppleApps)
- Text(L("macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail."))
+ Text(L("macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail."))
.font(.caption).foregroundStyle(.secondary)
}
Section {
diff --git a/Flowlight/UI/VisualizeView.swift b/Flowlight/UI/VisualizeView.swift
index 19a19e6d..a8b74cde 100644
--- a/Flowlight/UI/VisualizeView.swift
+++ b/Flowlight/UI/VisualizeView.swift
@@ -1534,14 +1534,14 @@ private struct TrafficGraphInspector: View {
}
Divider()
if !node.isFilterExact {
- Text(L("Select a relationship for an exact Reports scope."))
+ Text(L("Select a relationship for an exact History scope."))
.font(.callout)
.foregroundStyle(FL.muted)
} else if node.kind == .launcher || node.kind == .proxy || node.counters.isEmpty {
EmptyView()
} else if !node.members.isEmpty && (node.filter.domainSuffix != nil || node.members.count > 1) {
if node.filter.domainSuffix != nil {
- Button(L("Show domain family in Reports")) {
+ Button(L("Show domain family in History")) {
nav.showReport(filter: node.filter, granularity: granularity)
}
}
@@ -1552,7 +1552,7 @@ private struct TrafficGraphInspector: View {
}
}
} else {
- Button(L("Show in Reports")) { nav.showReport(filter: node.filter, granularity: granularity) }
+ Button(L("Show in History")) { nav.showReport(filter: node.filter, granularity: granularity) }
#if !APP_STORE
if node.kind == .destination || node.kind == .service {
if VisualizeActionScope.canInspect(node.filter) {
@@ -1724,7 +1724,7 @@ private struct TrafficGraphInspector: View {
private func exactActions(_ filter: TrafficFilter, source: TrafficGraphNode?) -> some View {
HStack(spacing: Spacing.s) {
- Button(L("Reports")) { nav.showReport(filter: filter, granularity: granularity) }
+ Button(L("History")) { nav.showReport(filter: filter, granularity: granularity) }
#if !APP_STORE
if VisualizeActionScope.canInspect(filter) {
Button(L("Inspect")) {
diff --git a/docs/404.html b/docs/404.html
index 2c26aa64..3a9ce39e 100644
--- a/docs/404.html
+++ b/docs/404.html
@@ -86,7 +86,7 @@
diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md
index 4a4abb20..dcabb7e4 100644
--- a/docs/DEVELOPMENT.md
+++ b/docs/DEVELOPMENT.md
@@ -268,6 +268,14 @@ endpoint to fall back to — the user names one or nothing is sent.
traffic and a live synthetic feed. Suspicious destinations use reserved documentation addresses
(`203.0.113.0/24`, `*.example`). The README and website screenshots come from this mode.
+`scripts/screenshots.sh` captures all website images from an exact current-version Release product and updates the
+per-image version, checksum and dimension manifest that `check_site.py` enforces. A selective capture advances only
+those images, so CI rejects a release that leaves older screenshots behind. For the Store listing, build the
+`Flowlight App Store` scheme and run `FL_APP=/absolute/path/to/Flowlight.app scripts/app-store-screenshots.sh`; it
+requires the embedded Store extension, rejects the Developer ID system-extension product, and produces the complete
+numbered 2880×1800 set under `packaging/app-store/screenshots/macos/`. Both capture paths refuse a candidate that
+opens anything other than `demo.sqlite*`, and CI validates the complete Store set against its own manifest.
+
## Known limitations
- Thread-level attribution isn't possible (see `product.md`). Attribution is per process or app.
@@ -301,6 +309,8 @@ that has gone wrong, most of them in production:
| Translated roadmaps list as much as English | Nine home pages promised "the rest, in this order" and then one item |
| Every screen's `helpAnchor` has a docs section | Coverage shipped with a Help button and nothing on the page to land on |
| Screenshots exist, and none is unused | `live.png` was served to nobody for two releases |
+| Every website and Store screenshot manifest entry matches the current version, bytes and dimensions | Two renamed menu items shipped beside eight screenshots that still showed the old sidebar |
+| The Store set contains all nine upload-ready 2880×1800 images | App Store Connect could otherwise retain screenshots from different builds |
| The views table matches the sidebar | It gave Inspect ⌘5 long after it became ⌘7, and never listed Rules, Ask, Devices or Coverage |
| One `
` per page | A translation duplicating a heading while editing |
diff --git a/docs/about/index.html b/docs/about/index.html
index 1f04e14f..86d88535 100644
--- a/docs/about/index.html
+++ b/docs/about/index.html
@@ -153,7 +153,7 @@
Sieh, was deine Apps im Netz tun. brew install --cask xinbetween/tap/flowlight
-
v0.17.0macOS 15+UniversalGPL-3.0Keine Telemetrie
+
v0.17.1macOS 15+UniversalGPL-3.0Keine Telemetrie
@@ -127,7 +127,7 @@
Sieh, was deine Apps im Netz tun.
-
Sieh die tatsächliche KI-Route: Agenten, zugeordnete Werkzeuge, konfigurierte Gateways, Flowlights beobachtete Proxy-Stufe und exakte Ziele. Die Bandbreite zeigt empfangene plus gesendete Daten im gewählten Zeitraum. Mit Demodaten.
@@ -135,7 +135,7 @@
Sieh, was deine Apps im Netz tun.
-
Die Ansicht KI-Agenten: der Modellanbieter jedes Agenten – und alles andere, mit dem er gesprochen hat. Mit Demodaten gezeigt.
@@ -405,16 +405,16 @@
Unterstützte Tool-Aufrufe mit Netzwerkanfragen verknüpfen
Mac. Starte einen Agenten aus einem inspizierten Terminal, und der unterstützte HTTP-Verkehr des Agenten und seiner Tools wird entschlüsselt – mit den
Tool-Aufrufen, die das Modell angefordert hat, und den Ergebnissen, die zurückgingen.
-
Wo sind meine Notizen gelandet? Der curl-Upload zu paste.example, zurückverfolgt bis zum Bash-Befehl, den das Modell angefordert hat, mit dem
gesendeten Body.
-
Jedes Tool, das ein Agent dem Modell anbietet. Agenten deklarieren ihre Tools bei jedem Zug, also listet Flowlight alle auf – mit denen,
die das Modell tatsächlich genutzt hat, und denen, die es nie angefasst hat.
-
Auch die, die du auf der Leitung nicht siehst. Bittet ein Agent den Anbieter, sich mit einem MCP-Server zu verbinden, erreicht dieser Datenverkehr
deinen Mac nie. Seine Anfrage schon – also tauchen der Server, seine URL, seine Freigabeeinstellung und seine Tools trotzdem auf.
@@ -460,7 +460,7 @@
Ein Wächter, den du nicht bewachen musst
-
Ein Agent, jeder Tool-Aufruf. Der Datenverkehr der git-, curl- und MCP-Server, die Claude Code gestartet hat, zählt als Datenverkehr von Claude Code.
Mit eingeschalteter HTTPS-Inspektion zeigt der Tab Tool-Aufrufe, was das Modell angefordert hat, was zurückkam und welche Anfragen jedes Tool gestellt hat:
@@ -470,10 +470,10 @@
Ein Wächter, den du nicht bewachen musst
-
Verlauf. Zoom von der Sekunde bis zum Jahr, drei Gruppierungen, Diagramme, die auch bei hunderten Apps lesbar bleiben.
-
Warnungen. Jede nennt die App, das Ziel und den Wert, der sie ausgelöst hat.
Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.17.0, macOS 15 o posterior.
+
Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.17.1, macOS 15 o posterior.
diff --git a/docs/es/index.html b/docs/es/index.html
index 0119022d..3699d75f 100644
--- a/docs/es/index.html
+++ b/docs/es/index.html
@@ -48,7 +48,7 @@
-
+
Ir al contenido
@@ -97,7 +97,7 @@
Observa la actividad de red de tus apps.
brew install --cask xinbetween/tap/flowlight
-
v0.17.0macOS 15+UniversalGPL-3.0Sin telemetría
+
v0.17.1macOS 15+UniversalGPL-3.0Sin telemetría
@@ -127,7 +127,7 @@
Observa la actividad de red de tus apps.
-
Ve la ruta real de IA: agentes, herramientas atribuidas, puertas de enlace configuradas, la etapa de proxy observada por Flowlight y destinos exactos. El ancho muestra el total recibido y enviado en el período seleccionado. Con datos de demostración.
@@ -135,7 +135,7 @@
Observa la actividad de red de tus apps.
-
La vista Agentes de IA: el proveedor de modelo de cada agente y todo lo demás con lo que habló. Con datos de demostración.
@@ -405,16 +405,16 @@
Correlaciona las llamadas de herramientas compatibles con las peticiones de
Mac. Arranca un agente desde un Terminal inspeccionado y el tráfico HTTP compatible del agente y de sus herramientas se descifra, con las llamadas de herramientas que
pidió el modelo y los resultados que volvieron.
-
¿Adónde han ido mis notas? La subida de curl a paste.example, rastreada hasta el comando Bash que pidió el modelo, con el
cuerpo que envió.
-
Todas las herramientas que un agente ofrece al modelo. Los agentes declaran sus herramientas en cada turno, así que Flowlight las lista todas, señalando
las que el modelo usó de verdad y las que no tocó nunca.
-
Incluidos los que no se ven en el cable. Cuando un agente pide al proveedor que conecte con un servidor MCP, ese tráfico
nunca llega a tu Mac. Su petición sí, así que el servidor, su URL, su ajuste de aprobación y sus herramientas siguen apareciendo.
@@ -460,7 +460,7 @@
Un monitor que no tienes que vigilar
-
Un agente, todas sus llamadas de herramientas. El tráfico del git, del curl y de los servidores MCP que arrancó Claude Code cuenta como de Claude Code.
Con la inspección HTTPS activada, la pestaña Llamadas de herramientas muestra qué pidió el modelo, qué volvió y las peticiones que hizo cada herramienta:
@@ -470,10 +470,10 @@
Un monitor que no tienes que vigilar
-
Historial. Zoom del segundo al año, tres agrupaciones y gráficos que siguen legibles con cientos de apps.
-
Alertas. Cada una nombra la app, el destino y la cifra que la activó.
Tout, du premier lancement au réglage des règles des agents. Flowlight 0.17.0, macOS 15 ou version ultérieure.
+
Tout, du premier lancement au réglage des règles des agents. Flowlight 0.17.1, macOS 15 ou version ultérieure.
diff --git a/docs/fr/index.html b/docs/fr/index.html
index 264c9396..2f52c8c9 100644
--- a/docs/fr/index.html
+++ b/docs/fr/index.html
@@ -48,7 +48,7 @@
-
+
Aller au contenu
@@ -97,7 +97,7 @@
Voyez l’activité réseau de vos apps.
brew install --cask xinbetween/tap/flowlight
-
v0.17.0macOS 15+UniverselGPL-3.0Sans télémétrie
+
v0.17.1macOS 15+UniverselGPL-3.0Sans télémétrie
@@ -127,7 +127,7 @@
Voyez l’activité réseau de vos apps.
-
Voyez la route IA réelle : agents, outils attribués, passerelles configurées, étape proxy observée par Flowlight et destinations exactes. La largeur indique le total reçu et envoyé pendant la période sélectionnée. Avec des données de démonstration.
@@ -135,7 +135,7 @@
Voyez l’activité réseau de vos apps.
-
La vue Agents IA : le fournisseur de modèle de chaque agent, et tout le reste de ce qu’il a contacté. Avec des données de démonstration.
@@ -405,16 +405,16 @@
Reliez les appels d’outils pris en charge aux requêtes réseau
Mac. Lancez un agent depuis un Terminal inspecté et le trafic HTTP pris en charge de l’agent et de ses outils est déchiffré, avec les appels d’outils que le
modèle a demandés et les résultats qui lui sont revenus.
-
Où sont parties mes notes ? L’envoi de curl vers paste.example, remonté jusqu’à la commande Bash demandée par le modèle, avec le
corps transmis.
-
Tous les outils qu’un agent propose au modèle. Les agents déclarent leurs outils à chaque tour, donc Flowlight les liste tous, en distinguant
ceux que le modèle a vraiment utilisés de ceux qu’il n’a jamais touchés.
-
Y compris ceux qu’on ne voit pas passer sur le réseau. Quand un agent demande au fournisseur de se connecter à un serveur MCP, ce trafic
ne passe jamais par votre Mac. Sa requête, si : le serveur, son URL, son réglage d’approbation et ses outils apparaissent quand même.
@@ -460,7 +460,7 @@
Un moniteur que vous n’avez pas à surveiller
-
Un agent, tous ses appels d’outils. Le trafic des git, curl et serveurs MCP lancés par Claude Code compte comme celui de Claude Code.
Avec l’inspection HTTPS activée, l’onglet Appels d’outils montre ce que le modèle a demandé, ce qui est revenu et les requêtes émises par chaque outil :
@@ -470,10 +470,10 @@
Un moniteur que vous n’avez pas à surveiller
-
Historique. Zoom de la seconde à l’année, trois regroupements, des graphiques qui restent lisibles avec des centaines d’apps.
-
Alertes. Chacune nomme l’app, la destination et le chiffre qui l’a déclenchée.
See your apps' network activity. brew install --cask xinbetween/tap/flowlight
-
v0.17.0macOS 15+UniversalGPL-3.0No telemetry
+
v0.17.1macOS 15+UniversalGPL-3.0No telemetry
@@ -127,7 +127,7 @@
See your apps' network activity.
-
See the real AI route: agents, attributed tools, configured gateways, Flowlight's observed proxy stage, and exact destinations. Ribbon width shows total received plus sent traffic for the selected period. Shown with demo data.
@@ -135,7 +135,7 @@
See your apps' network activity.
-
The AI Agents view: each agent's model provider, and everything else it talked to. Shown with demo data.
@@ -143,7 +143,7 @@
See your apps' network activity.
-
Always monitor an agent: Flowlight writes the proxy into the agent's own settings so it routes through on every launch, and says what it's keeping — stop any of it in a click. Shown with demo data.
@@ -427,16 +427,16 @@
Correlate supported tool calls with network requests
Mac. Start an agent from an inspected Terminal and supported HTTP traffic from the agent and its tools is decrypted, with tool calls the
model asked for and the results that went back.
-
Where did my notes go? curl's upload to paste.example, traced to the Bash command the model asked for, with the
body it sent.
-
Every tool an agent offers the model. Agents declare their tools on each turn, so Flowlight lists them all, with the
ones the model actually used and the ones it never touched.
-
Including the ones you can't see on the wire. When an agent asks the provider to connect to an MCP server, that traffic
never reaches your Mac. Its request does, so the server, its URL, its approval setting and its tools still show up.
@@ -482,7 +482,7 @@
A monitor you don't have to monitor
-
One agent, every tool call. Traffic from the git, curl and MCP servers Claude Code started counts as Claude Code's.
With HTTPS inspection on, the Tool calls tab shows what the model asked for, what came back, and the requests each tool made:
@@ -492,10 +492,10 @@
A monitor you don't have to monitor
-
History. Preset ranges, a draggable navigator, three groupings, and charts that stay readable with hundreds of apps.
-
Alerts. Each one names the app, the destination and the number that tripped it.
Vedi il percorso IA reale: agenti, strumenti attribuiti, gateway configurati, lo stadio proxy osservato da Flowlight e le destinazioni esatte. La larghezza mostra il totale ricevuto e inviato nel periodo selezionato. Con dati dimostrativi.
@@ -135,7 +135,7 @@
Vedi la rete delle tue app. Ca
-
La vista Agenti IA: il provider del modello di ogni agente e tutto il resto con cui ha parlato. Mostrata con dati dimostrativi.
@@ -405,16 +405,16 @@
Collega le chiamate agli strumenti supportate alle richieste di rete
sul tuo Mac. Avvia un agente da un Terminale ispezionato e il traffico HTTP supportato dell'agente e dei suoi strumenti viene decifrato, con le chiamate agli strumenti
richieste dal modello e i risultati tornati indietro.
-
Dove sono finite le mie note? Il caricamento di curl verso paste.example, risalendo al comando Bash richiesto dal modello, con il
corpo che ha inviato.
-
Ogni strumento che un agente offre al modello. Gli agenti dichiarano i loro strumenti a ogni turno, così Flowlight li elenca tutti, indicando
quelli che il modello ha davvero usato e quelli che non ha mai toccato.
-
Compresi quelli che non vedi passare in rete. Quando un agente chiede al provider di collegarsi a un server MCP, quel traffico
non arriva mai al tuo Mac. La sua richiesta sì, così il server, il suo URL, la sua impostazione di approvazione e i suoi strumenti compaiono comunque.
@@ -460,7 +460,7 @@
Un monitoraggio che non devi monitorare
-
Un agente, tutte le chiamate agli strumenti. Il traffico di git, curl e dei server MCP avviati da Claude Code conta come traffico di Claude Code.
Con l'ispezione HTTPS attiva, il pannello Chiamate agli strumenti mostra che cosa ha chiesto il modello, che cosa è tornato indietro e le richieste fatte da ogni strumento:
@@ -470,10 +470,10 @@
Un monitoraggio che non devi monitorare
-
Cronologia. Zoom dal secondo all'anno, tre raggruppamenti, grafici che restano leggibili con centinaia di app.
-
Avvisi. Ognuno indica l'app, la destinazione e il numero che lo ha fatto scattare.
실제 AI 경로를 확인하세요. 에이전트, 귀속된 도구, 구성된 게이트웨이, Flowlight가 관측한 프록시 단계와 정확한 목적지를 표시합니다. 리본 너비는 선택한 기간의 수신량과 송신량 합계입니다. 데모 데이터로 표시했습니다.
@@ -135,7 +135,7 @@
앱이 무엇을 하는지 봅니다.
-
AI 에이전트 뷰: 각 에이전트의 모델 제공업체, 그리고 그 밖에 통신한 모든 곳. 데모 데이터로 표시했습니다.
@@ -405,16 +405,16 @@
도구 호출과 네트워크 요청을 잇습니다
검사 대상인 터미널에서 에이전트를 실행하면 에이전트와 그 도구의 지원되는 HTTP 트래픽이 복호화되고, 모델이 요청한
도구 호출과 되돌아간 결과가 함께 보입니다.
-
내 메모는 어디로 갔나? curl이 paste.example로 올린 업로드를, 모델이 요청한 Bash 명령까지 거슬러
올라가 보낸 본문과 함께.
-
에이전트가 모델에게 내주는 모든 도구. 에이전트는 매 턴마다 도구를 선언하므로 Flowlight는 그것을 전부
나열하고, 모델이 실제로 쓴 것과 한 번도 건드리지 않은 것을 구분해 보여줍니다.
-
회선에서는 보이지 않는 것까지. 에이전트가 제공업체에게 MCP 서버로 연결해 달라고 하면 그 트래픽은
내 Mac을 거치지 않습니다. 하지만 요청은 거치므로 서버와 URL, 승인 설정, 제공하는 도구는 그대로 드러납니다.
@@ -460,7 +460,7 @@
감시하지 않아도 되는 감시 도구
-
에이전트 하나, 도구 호출 전부. Claude Code가 띄운 git과 curl, MCP 서버의 트래픽은 Claude Code의 것으로
집계됩니다. HTTPS 검사를 켜면 도구 호출 탭에서 모델이 무엇을 요청했고 무엇이 돌아왔으며 각 도구가 어떤 요청을
@@ -470,10 +470,10 @@
diff --git a/docs/llms-full.txt b/docs/llms-full.txt
index 2049c74b..6e553fe8 100644
--- a/docs/llms-full.txt
+++ b/docs/llms-full.txt
@@ -62,7 +62,7 @@ Documentation
Using Flowlight
- Everything from the first launch to tuning the agent rules. Flowlight 0.17.0, macOS 15 or later.
+ Everything from the first launch to tuning the agent rules. Flowlight 0.17.1, macOS 15 or later.
On this page
@@ -920,7 +920,7 @@ Understand your AI agents.
brew install --cask xinbetween/tap/flowlightCopy
- v0.17.0macOS 15+UniversalGPL-3.0No telemetry
+ v0.17.1macOS 15+UniversalGPL-3.0No telemetry
connectionslive
@@ -1663,9 +1663,18 @@ Releases
Downloads, checksums and full notes for each version are on GitHub Releases.
- 0.17.0
+ 0.17.1
November 4, 2026Latest
+ Keep every public screenshot current. All ten website images now come from the same 0.17.1 demo build, consistently show History and Connections in the sidebar, and use History throughout linked actions and guidance.
+
+ Review the Store with the same product users receive. A complete 2880×1800 Mac App Store screenshot set is captured from that exact build, title-checked screen by screen, and retained with the release for App Store Connect.
+
+ Keep synthetic evidence isolated. Screenshot capture now refuses any process that opens the real traffic database and can enforce one uniform window and pixel size for Store-ready output.
+
+ 0.17.0
+November 4, 2026
+
Find past traffic in History. Reports is now History, with concise presets from 15 minutes to all retained evidence, an explicit date range, adaptive resolution, and a native overview navigator whose selection can be dragged, resized, or panned.
Keep short windows controllable. The navigator magnifies a nearby context when the full retained timeline would collapse the brush, preserves a minimum handle width, and can switch back to All history without changing the selected dates.
diff --git a/docs/llms.txt b/docs/llms.txt
index 9f1e1d07..86251b79 100644
--- a/docs/llms.txt
+++ b/docs/llms.txt
@@ -1,6 +1,6 @@
# Flowlight
-> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.17.0.
+> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.17.1.
- [Download Flowlight.dmg](https://github.com/xinbetween/flowlight/releases/latest/download/Flowlight.dmg)
- [Source code](https://github.com/xinbetween/flowlight)
diff --git a/docs/plugins/index.html b/docs/plugins/index.html
index c00ebdbf..6f00fda9 100644
--- a/docs/plugins/index.html
+++ b/docs/plugins/index.html
@@ -212,7 +212,7 @@
Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.17.0, macOS 15 ou posterior.
+
Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.17.1, macOS 15 ou posterior.
diff --git a/docs/pt-PT/index.html b/docs/pt-PT/index.html
index 20041564..4a893d57 100644
--- a/docs/pt-PT/index.html
+++ b/docs/pt-PT/index.html
@@ -48,7 +48,7 @@
-
+
Ir para o conteúdo
@@ -97,7 +97,7 @@
Veja a atividade de rede das suas apps.
brew install --cask xinbetween/tap/flowlight
-
v0.17.0macOS 15+UniversalGPL-3.0Sem telemetria
+
v0.17.1macOS 15+UniversalGPL-3.0Sem telemetria
@@ -127,7 +127,7 @@
Veja a atividade de rede das suas apps.
-
Veja a rota de IA real: agentes, ferramentas atribuídas, gateways configurados, a etapa de proxy observada pelo Flowlight e destinos exatos. A largura mostra o total recebido e enviado no período selecionado. Com dados de demonstração.
@@ -135,7 +135,7 @@
Veja a atividade de rede das suas apps.
-
A vista Agentes de IA: o fornecedor do modelo de cada agente e tudo o mais com que falou. Mostrada com dados de demonstração.
@@ -405,16 +405,16 @@
Relacione as chamadas de ferramentas suportadas com os pedidos de rede
seu Mac. Inicie um agente a partir de um Terminal inspecionado e o tráfego HTTP suportado do agente e das suas ferramentas é desencriptado, com as chamadas de ferramentas que o
modelo pediu e os resultados que voltaram.
-
Para onde foram as minhas notas? O envio do curl para paste.example, seguido até ao comando Bash que o modelo pediu, com o
corpo que enviou.
-
Todas as ferramentas que um agente oferece ao modelo. Os agentes declaram as suas ferramentas em cada turno, por isso o Flowlight lista-as todas, com as
que o modelo usou de facto e as que nunca tocou.
-
Incluindo as que não se veem na rede. Quando um agente pede ao fornecedor que se ligue a um servidor MCP, esse tráfego
nunca passa pelo seu Mac. O pedido passa, por isso o servidor, o seu URL, a sua definição de aprovação e as suas ferramentas aparecem mesmo assim.
@@ -460,7 +460,7 @@
Um monitor que não tem de monitorizar
-
Um agente, todas as chamadas de ferramentas. O tráfego do git, do curl e dos servidores MCP que o Claude Code iniciou conta como tráfego do Claude Code.
Com a inspeção HTTPS ativada, o separador Chamadas de ferramentas mostra o que o modelo pediu, o que voltou e os pedidos que cada ferramenta fez:
@@ -470,10 +470,10 @@
Um monitor que não tem de monitorizar
-
Histórico. Zoom do segundo ao ano, três agrupamentos, gráficos que continuam legíveis com centenas de apps.
-
Alertas. Cada um nomeia a app, o destino e o número que o disparou.
Keep every public screenshot current. All ten website images now come from the same 0.17.1 demo build, consistently show History and Connections in the sidebar, and use History throughout linked actions and guidance.
+
Review the Store with the same product users receive. A complete 2880×1800 Mac App Store screenshot set is captured from that exact build, title-checked screen by screen, and retained with the release for App Store Connect.
+
Keep synthetic evidence isolated. Screenshot capture now refuses any process that opens the real traffic database and can enforce one uniform window and pixel size for Store-ready output.
+
+
+
+
+
0.17.0
Find past traffic in History. Reports is now History, with concise presets from 15 minutes to all retained evidence, an explicit date range, adaptive resolution, and a native overview navigator whose selection can be dragged, resized, or panned.
Keep short windows controllable. The navigator magnifies a nearby context when the full retained timeline would collapse the brush, preserves a minimum handle width, and can switch back to All history without changing the selected dates.
diff --git a/packaging/app-store/screenshots/README.md b/packaging/app-store/screenshots/README.md
new file mode 100644
index 00000000..35453cb8
--- /dev/null
+++ b/packaging/app-store/screenshots/README.md
@@ -0,0 +1,20 @@
+# Mac App Store screenshots
+
+These images are the reviewable source of truth for the Flowlight Mac App Store listing. They are captured from the exact App Store product—not the Developer ID product—using synthetic demo data only.
+
+Build the Store product, then run:
+
+```sh
+FL_APP=/absolute/path/to/Flowlight.app scripts/app-store-screenshots.sh
+```
+
+The capture gate requires:
+
+- the bundle to contain the embedded Store extension and no Developer ID system extension;
+- the app version and build number to match `project.yml`;
+- the requested screen title to match before capture;
+- `demo.sqlite*` to be the only traffic database opened by the candidate;
+- every retained image to be exactly 2880×1800 pixels;
+- English and light appearance for a consistent US storefront set.
+
+Upload the numbered files in `macos/` in filename order. The Store set uses Rules in place of Inspect because the Store product deliberately omits HTTPS inspection. Replace the complete existing App Store Connect screenshot set together; do not mix images from different builds or menu vocabularies.
diff --git a/packaging/app-store/screenshots/macos/01-connections.png b/packaging/app-store/screenshots/macos/01-connections.png
new file mode 100644
index 00000000..e63fbf7b
Binary files /dev/null and b/packaging/app-store/screenshots/macos/01-connections.png differ
diff --git a/packaging/app-store/screenshots/macos/02-ai-agents.png b/packaging/app-store/screenshots/macos/02-ai-agents.png
new file mode 100644
index 00000000..d66b43f6
Binary files /dev/null and b/packaging/app-store/screenshots/macos/02-ai-agents.png differ
diff --git a/packaging/app-store/screenshots/macos/03-history.png b/packaging/app-store/screenshots/macos/03-history.png
new file mode 100644
index 00000000..5f327a70
Binary files /dev/null and b/packaging/app-store/screenshots/macos/03-history.png differ
diff --git a/packaging/app-store/screenshots/macos/04-rules.png b/packaging/app-store/screenshots/macos/04-rules.png
new file mode 100644
index 00000000..76a88ea3
Binary files /dev/null and b/packaging/app-store/screenshots/macos/04-rules.png differ
diff --git a/packaging/app-store/screenshots/macos/05-live.png b/packaging/app-store/screenshots/macos/05-live.png
new file mode 100644
index 00000000..150c58e1
Binary files /dev/null and b/packaging/app-store/screenshots/macos/05-live.png differ
diff --git a/packaging/app-store/screenshots/macos/06-alerts.png b/packaging/app-store/screenshots/macos/06-alerts.png
new file mode 100644
index 00000000..fb729e4c
Binary files /dev/null and b/packaging/app-store/screenshots/macos/06-alerts.png differ
diff --git a/packaging/app-store/screenshots/macos/07-agent-detail.png b/packaging/app-store/screenshots/macos/07-agent-detail.png
new file mode 100644
index 00000000..1abc4226
Binary files /dev/null and b/packaging/app-store/screenshots/macos/07-agent-detail.png differ
diff --git a/packaging/app-store/screenshots/macos/08-agent-tools.png b/packaging/app-store/screenshots/macos/08-agent-tools.png
new file mode 100644
index 00000000..c034c414
Binary files /dev/null and b/packaging/app-store/screenshots/macos/08-agent-tools.png differ
diff --git a/packaging/app-store/screenshots/macos/09-mcp-servers.png b/packaging/app-store/screenshots/macos/09-mcp-servers.png
new file mode 100644
index 00000000..6f10360f
Binary files /dev/null and b/packaging/app-store/screenshots/macos/09-mcp-servers.png differ
diff --git a/packaging/app-store/screenshots/macos/manifest.json b/packaging/app-store/screenshots/macos/manifest.json
new file mode 100644
index 00000000..34ee9c67
--- /dev/null
+++ b/packaging/app-store/screenshots/macos/manifest.json
@@ -0,0 +1,59 @@
+{
+ "schema": 1,
+ "screenshots": {
+ "01-connections.png": {
+ "height": 1800,
+ "sha256": "b8c2265f4935d8b7cbf4d1cded01920b46cddd1b49bca7cab3b63a3900cf8b00",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "02-ai-agents.png": {
+ "height": 1800,
+ "sha256": "c4bef89303043f2711071a3d23f6de6a4777ed0ee67dbfbcdf473bcbdea5db8f",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "03-history.png": {
+ "height": 1800,
+ "sha256": "91358f6f4dbb919e939ef47feaf24bdd6eb055dddf044873a15fab780099c98c",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "04-rules.png": {
+ "height": 1800,
+ "sha256": "1b7968afe707fd16ce6109a089e7630a1a744c43e4976bc2d15622964c26d669",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "05-live.png": {
+ "height": 1800,
+ "sha256": "a22fb51ab087f96d15e71c07af1cbe931e26b17b168e16071144b138d63438ea",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "06-alerts.png": {
+ "height": 1800,
+ "sha256": "0e606b9df9be6bc761b3690954400c17165b3e71d3c0e7d725e1602ba8c2eca6",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "07-agent-detail.png": {
+ "height": 1800,
+ "sha256": "51a083b23cfed1770f8c5d0f217d115a3fe2a226002f8562ce78d099c1998824",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "08-agent-tools.png": {
+ "height": 1800,
+ "sha256": "7c1829d409a867eb36f272ef8bf09402bc09bc537b2ddf865970dfd81304354f",
+ "version": "0.17.1",
+ "width": 2880
+ },
+ "09-mcp-servers.png": {
+ "height": 1800,
+ "sha256": "e2bbb4fdf6a2d4f782c4b2d3c70c55ed810f56f94539d89ff9e6c31559e6917d",
+ "version": "0.17.1",
+ "width": 2880
+ }
+ }
+}
diff --git a/project.yml b/project.yml
index 53a35adf..aaa1644c 100644
--- a/project.yml
+++ b/project.yml
@@ -15,8 +15,8 @@ settings:
DEVELOPMENT_TEAM: ""
CODE_SIGN_STYLE: Automatic
ENABLE_HARDENED_RUNTIME: YES
- MARKETING_VERSION: "0.17.0"
- CURRENT_PROJECT_VERSION: "74"
+ MARKETING_VERSION: "0.17.1"
+ CURRENT_PROJECT_VERSION: "75"
configs:
AppStore:
DEVELOPMENT_TEAM: 38RJUJHKZS
diff --git a/scripts/app-store-screenshots.sh b/scripts/app-store-screenshots.sh
new file mode 100755
index 00000000..b41bca68
--- /dev/null
+++ b/scripts/app-store-screenshots.sh
@@ -0,0 +1,51 @@
+#!/bin/zsh
+# Captures the complete Mac App Store screenshot set from an exact Flowlight Store build.
+# FL_APP must point to the reviewed Store product. The shared capture script verifies version,
+# screen title, demo-only database use, and exact 2880x1800 output before anything is retained.
+set -euo pipefail
+cd "$(dirname "$0")/.."
+
+: "${FL_APP:?Set FL_APP to the exact Flowlight App Store build.}"
+STORE_EXTENSION="$FL_APP/Contents/PlugIns/com.flowlight.app.filter.appex"
+[ -d "$STORE_EXTENSION" ] || {
+ echo "$FL_APP is not the App Store product: embedded Store extension is missing."
+ exit 1
+}
+[ ! -e "$FL_APP/Contents/Library/SystemExtensions/com.flowlight.app.filter.systemextension" ] || {
+ echo "$FL_APP is the Developer ID product, not the App Store product."
+ exit 1
+}
+
+OUT="packaging/app-store/screenshots/macos"
+TEMP=$(mktemp -d /private/tmp/flowlight-app-store-screenshots.XXXXXX)
+cleanup() {
+ for image in "$TEMP"/*.png(N); do rm "$image"; done
+ rmdir "$TEMP" 2>/dev/null || true
+}
+trap cleanup EXIT
+
+FL_OUT="$TEMP" \
+FL_ONLY="visualize,agents,reports,rules,live,alerts,agent-detail,agent-tools,mcp-servers" \
+FL_FORCE_SIZE="1440x900" \
+FL_EXPECT_PIXELS="2880x1800" \
+FL_WAIT="${FL_STORE_WAIT:-20}" \
+FL_SKIP_MANIFEST="YES" \
+scripts/screenshots.sh
+
+mkdir -p "$OUT"
+cp "$TEMP/visualize.png" "$OUT/01-connections.png"
+cp "$TEMP/agents.png" "$OUT/02-ai-agents.png"
+cp "$TEMP/reports.png" "$OUT/03-history.png"
+cp "$TEMP/rules.png" "$OUT/04-rules.png"
+cp "$TEMP/live.png" "$OUT/05-live.png"
+cp "$TEMP/alerts.png" "$OUT/06-alerts.png"
+cp "$TEMP/agent-detail.png" "$OUT/07-agent-detail.png"
+cp "$TEMP/agent-tools.png" "$OUT/08-agent-tools.png"
+cp "$TEMP/mcp-servers.png" "$OUT/09-mcp-servers.png"
+
+VERSION=$(defaults read "$FL_APP/Contents/Info.plist" CFBundleShortVersionString)
+python3 scripts/screenshot_manifest.py --directory "$OUT" --version "$VERSION" --replace \
+ 01-connections.png 02-ai-agents.png 03-history.png 04-rules.png 05-live.png \
+ 06-alerts.png 07-agent-detail.png 08-agent-tools.png 09-mcp-servers.png
+
+echo "Wrote 9 Mac App Store screenshots to $OUT"
diff --git a/scripts/check_site.py b/scripts/check_site.py
index db83aa56..b4012f85 100644
--- a/scripts/check_site.py
+++ b/scripts/check_site.py
@@ -8,7 +8,7 @@
python3 scripts/check_site.py # after scripts/build_site.py
"""
-import re, sys, pathlib, collections, json, subprocess, time
+import re, sys, pathlib, collections, hashlib, json, subprocess, time
ROOT = pathlib.Path(__file__).resolve().parent.parent
OUT = ROOT / "docs"
@@ -312,11 +312,82 @@ def entries(text):
referenced.add(name)
if not (shots / name).exists():
found.append(f"{page.relative_to(ROOT)}: screenshot {name} does not exist")
- for shot in sorted(shots.glob("*.png")):
+ screenshot_files = sorted(shots.glob("*.png"))
+ for shot in screenshot_files:
if shot.name not in referenced:
found.append(f"{shot.relative_to(ROOT)}: no page shows this screenshot")
- # 11. A declared size that isn't the image's size. The width and height are there to reserve the space
+ # 11. Every screenshot records the app version, exact bytes and dimensions from its own capture. A selective
+ # refresh must not bless untouched images: each entry advances only when that image is actually recaptured.
+ manifest_path = shots / "manifest.json"
+ try:
+ manifest = json.loads(manifest_path.read_text())
+ entries = manifest["screenshots"] if manifest.get("schema") == 1 else None
+ if not isinstance(entries, dict):
+ raise ValueError("unsupported shape")
+ except (OSError, ValueError, KeyError, json.JSONDecodeError) as error:
+ found.append(f"{manifest_path.relative_to(ROOT)}: unreadable screenshot manifest ({error})")
+ entries = {}
+ names = {shot.name for shot in screenshot_files}
+ if set(entries) != names:
+ missing = sorted(names - set(entries))
+ extra = sorted(set(entries) - names)
+ found.append(f"{manifest_path.relative_to(ROOT)}: screenshot entries differ; missing={missing}, extra={extra}")
+ for shot in screenshot_files:
+ entry = entries.get(shot.name)
+ if not isinstance(entry, dict):
+ continue
+ raw = shot.read_bytes()
+ real = (int.from_bytes(raw[16:20], "big"), int.from_bytes(raw[20:24], "big"))
+ if entry.get("version") != APP_VERSION:
+ found.append(f"{shot.relative_to(ROOT)}: captured for {entry.get('version')}, app is {APP_VERSION}")
+ if entry.get("sha256") != hashlib.sha256(raw).hexdigest():
+ found.append(f"{shot.relative_to(ROOT)}: bytes differ from the screenshot manifest")
+ if (entry.get("width"), entry.get("height")) != real:
+ found.append(f"{shot.relative_to(ROOT)}: dimensions differ from the screenshot manifest")
+
+ # The Store set is a release artifact too. Keep its complete upload order, source build, bytes, and required
+ # 2880x1800 dimensions reviewable so App Store Connect cannot silently retain a mixed-version screenshot.
+ store_shots = ROOT / "packaging/app-store/screenshots/macos"
+ expected_store_names = {
+ "01-connections.png", "02-ai-agents.png", "03-history.png", "04-rules.png", "05-live.png",
+ "06-alerts.png", "07-agent-detail.png", "08-agent-tools.png", "09-mcp-servers.png",
+ }
+ store_files = sorted(store_shots.glob("*.png"))
+ store_names = {shot.name for shot in store_files}
+ if store_names != expected_store_names:
+ found.append(f"{store_shots.relative_to(ROOT)}: Store screenshots differ; "
+ f"missing={sorted(expected_store_names - store_names)}, "
+ f"extra={sorted(store_names - expected_store_names)}")
+ store_manifest_path = store_shots / "manifest.json"
+ try:
+ store_manifest = json.loads(store_manifest_path.read_text())
+ store_entries = store_manifest["screenshots"] if store_manifest.get("schema") == 1 else None
+ if not isinstance(store_entries, dict):
+ raise ValueError("unsupported shape")
+ except (OSError, ValueError, KeyError, json.JSONDecodeError) as error:
+ found.append(f"{store_manifest_path.relative_to(ROOT)}: unreadable screenshot manifest ({error})")
+ store_entries = {}
+ if set(store_entries) != expected_store_names:
+ found.append(f"{store_manifest_path.relative_to(ROOT)}: Store manifest entries differ; "
+ f"missing={sorted(expected_store_names - set(store_entries))}, "
+ f"extra={sorted(set(store_entries) - expected_store_names)}")
+ for shot in store_files:
+ entry = store_entries.get(shot.name)
+ if not isinstance(entry, dict):
+ continue
+ raw = shot.read_bytes()
+ real = (int.from_bytes(raw[16:20], "big"), int.from_bytes(raw[20:24], "big"))
+ if entry.get("version") != APP_VERSION:
+ found.append(f"{shot.relative_to(ROOT)}: captured for {entry.get('version')}, app is {APP_VERSION}")
+ if entry.get("sha256") != hashlib.sha256(raw).hexdigest():
+ found.append(f"{shot.relative_to(ROOT)}: bytes differ from the screenshot manifest")
+ if (entry.get("width"), entry.get("height")) != real:
+ found.append(f"{shot.relative_to(ROOT)}: dimensions differ from the screenshot manifest")
+ if real != (2880, 1800):
+ found.append(f"{shot.relative_to(ROOT)}: Store screenshot is {real[0]}x{real[1]}, expected 2880x1800")
+
+ # 12. A declared size that isn't the image's size. The width and height are there to reserve the space
# before the image loads; a re-capture at a different aspect ratio makes them a lie and the page jumps.
for page in PAGES:
for src, attrs in IMG.findall(page.read_text()):
diff --git a/scripts/screenshot_manifest.py b/scripts/screenshot_manifest.py
new file mode 100644
index 00000000..8ea0e92d
--- /dev/null
+++ b/scripts/screenshot_manifest.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+"""Record deterministic screenshot provenance for website and App Store assets."""
+
+import argparse
+import hashlib
+import json
+import pathlib
+import struct
+
+
+def png_size(path: pathlib.Path) -> tuple[int, int]:
+ header = path.read_bytes()[:24]
+ if len(header) != 24 or header[:8] != b"\x89PNG\r\n\x1a\n" or header[12:16] != b"IHDR":
+ raise ValueError(f"{path} is not a PNG with an IHDR header")
+ return struct.unpack(">II", header[16:24])
+
+
+def load_entries(path: pathlib.Path) -> dict[str, dict]:
+ if not path.exists():
+ return {}
+ document = json.loads(path.read_text())
+ if document.get("schema") != 1 or not isinstance(document.get("screenshots"), dict):
+ raise ValueError(f"{path} has an unsupported screenshot manifest shape")
+ return document["screenshots"]
+
+
+def main() -> int:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--directory", type=pathlib.Path, required=True)
+ parser.add_argument("--version", required=True)
+ parser.add_argument("--replace", action="store_true")
+ parser.add_argument("files", nargs="+")
+ args = parser.parse_args()
+
+ manifest = args.directory / "manifest.json"
+ entries = {} if args.replace else load_entries(manifest)
+ for name in args.files:
+ if pathlib.Path(name).name != name or not name.endswith(".png"):
+ raise ValueError(f"unsafe screenshot name: {name}")
+ image = args.directory / name
+ data = image.read_bytes()
+ width, height = png_size(image)
+ entries[name] = {
+ "version": args.version,
+ "sha256": hashlib.sha256(data).hexdigest(),
+ "width": width,
+ "height": height,
+ }
+
+ document = {"schema": 1, "screenshots": dict(sorted(entries.items()))}
+ temporary = manifest.with_suffix(".json.tmp")
+ temporary.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n")
+ temporary.replace(manifest)
+ print(f"Recorded {len(args.files)} screenshot(s) for Flowlight {args.version} in {manifest}")
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/scripts/screenshots.sh b/scripts/screenshots.sh
index 89fe5568..49a70c7b 100755
--- a/scripts/screenshots.sh
+++ b/scripts/screenshots.sh
@@ -1,15 +1,17 @@
#!/bin/zsh
-# Regenerates the marketing screenshots in docs/assets/screenshots/.
+# Regenerates the marketing screenshots in docs/assets/screenshots/, or another FL_OUT directory.
#
# Every shot is taken from demo data (-FLDemo YES), which lives in its own database, so nothing real is ever
# published. The screen and the window size come from launch arguments rather than synthetic keystrokes: a
# keystroke goes to whichever window is frontmost, which is somebody else's window often enough to matter.
+# Set FL_FORCE_SIZE and FL_EXPECT_PIXELS together for a uniform App Store-ready set.
set -euo pipefail
cd "$(dirname "$0")/.."
-OUT="docs/assets/screenshots"
+OUT="${FL_OUT:-docs/assets/screenshots}"
SIZE="${FL_SIZE:-1600x1075}"
WANT=$(sed -n 's/.*MARKETING_VERSION: "\(.*\)"/\1/p' project.yml)
+WANT_BUILD=$(sed -n 's/.*CURRENT_PROJECT_VERSION: "\(.*\)"/\1/p' project.yml)
# Ask xcodebuild where it actually put the app. A hard-coded build/ path is how these screenshots were once
# taken from a months-old bundle: it existed, it launched, and nothing said it was the wrong version.
@@ -22,8 +24,13 @@ fi
[ -d "$APP" ] || { echo "No app at $APP — build Release first."; exit 1; }
GOT=$(defaults read "$APP/Contents/Info.plist" CFBundleShortVersionString)
+GOT_BUILD=$(defaults read "$APP/Contents/Info.plist" CFBundleVersion)
[ "$GOT" = "$WANT" ] || { echo "$APP is $GOT, project.yml says $WANT — build Release first."; exit 1; }
-echo "Shooting Flowlight $GOT from $APP"
+[ "$GOT_BUILD" = "$WANT_BUILD" ] || {
+ echo "$APP is build $GOT_BUILD, project.yml says $WANT_BUILD — build Release first."
+ exit 1
+}
+echo "Shooting Flowlight $GOT ($GOT_BUILD) from $APP"
mkdir -p "$OUT"
# name:screen:agent-tab:height — a couple of shots are taller or shorter than the default.
@@ -39,6 +46,11 @@ SHOTS=(
"inspect:inspect::"
"visualize:visualize::1600x994"
)
+# Rules is Store-capable but not one of the website's ten published assets. Add it only when an explicit capture set
+# asks for it, keeping the default website inventory and its all-images manifest stable.
+if [ -n "${FL_ONLY:-}" ] && [[ ",${FL_ONLY}," == *",rules,"* ]]; then
+ SHOTS+=("rules:rules::")
+fi
exact_app_pids() {
local expected="$1" pid command
@@ -65,12 +77,24 @@ expected_window_title() {
agents) print -r -- "AI Agents" ;;
reports) print -r -- "History" ;;
alerts) print -r -- "Alerts" ;;
+ rules) print -r -- "Rules" ;;
inspect) print -r -- "Inspect" ;;
visualize) print -r -- "Connections" ;;
*) echo " no expected window title for screen $1" >&2; return 1 ;;
esac
}
+title_matches_screen() {
+ local screen="$1" actual="$2" expected
+ expected=$(expected_window_title "$screen") || return 1
+ case "$screen" in
+ alerts) [[ "$actual" == "$expected" || "$actual" == "$expected – "* ]] ;;
+ rules) [[ "$actual" == "$expected" || "$actual" == "$expected – "*" in force" ]] ;;
+ inspect) [[ "$actual" == "$expected" || "$actual" == "$expected – Off" ]] ;;
+ *) [[ "$actual" == "$expected" ]] ;;
+ esac
+}
+
window_title() {
osascript - "$1" <<'OSA'
on run argv
@@ -85,7 +109,8 @@ OSA
}
capture() {
- local name="$1" screen="$2" tab="$3" size="${4:-$SIZE}"
+ local name="$1" screen="$2" tab="$3" requested_size="$4"
+ local size="${FL_FORCE_SIZE:-${requested_size:-$SIZE}}"
echo " $name ($screen${tab:+ · $tab})"
local w="${size%x*}" h="${size#*x}"
local executable
@@ -100,7 +125,8 @@ capture() {
# arrive after demo seeding and replace the requested screen. Pin English too, so the title check below is stable.
open -n "$APP" --args -ApplePersistenceIgnoreState YES -AppleLanguages "(en)" -AppleLocale en_US \
-FLDemo YES -FLScreen "$screen" -FLAgentTab "${tab:-destinations}" \
- -FLWindow "${w}x${h}" -FLInspectSelect paste.example -AppleInterfaceStyle Light \
+ -FLWindow "${w}x${h}" -FLInspectSelect paste.example -inspection.enabled NO \
+ -AppleInterfaceStyle Light \
"${banner[@]}" "${visualization[@]}"
local pid=""
for _ in {1..40}; do
@@ -121,11 +147,18 @@ OSA
local expected actual
expected=$(expected_window_title "$screen")
actual=$(window_title "$pid" 2>/dev/null || true)
- if [ "$actual" != "$expected" ]; then
+ if ! title_matches_screen "$screen" "$actual"; then
echo " refusing to capture $name: expected $expected, found ${actual:-no window}"
stop_exact_app "$pid" "$executable"
return 1
fi
+ local open_files
+ open_files=$(lsof -p "$pid" -Fn 2>/dev/null || true)
+ if [[ "$open_files" == *traffic.sqlite* || "$open_files" != *demo.sqlite* ]]; then
+ echo " refusing to capture $name: demo.sqlite is not the only traffic database"
+ stop_exact_app "$pid" "$executable"
+ return 1
+ fi
local id
id=$(scripts/window-id.swift "$pid" 2>/dev/null || true)
if [ -z "$id" ]; then
@@ -137,6 +170,20 @@ OSA
stop_exact_app "$pid" "$executable"
return 1
fi
+ if [ -n "${FL_EXPECT_PIXELS:-}" ]; then
+ local expected_width="${FL_EXPECT_PIXELS%x*}" expected_height="${FL_EXPECT_PIXELS#*x}"
+ local actual_width actual_height
+ actual_width=$(sips -g pixelWidth "$OUT/$name.png" | sed -n 's/.*pixelWidth: //p')
+ actual_height=$(sips -g pixelHeight "$OUT/$name.png" | sed -n 's/.*pixelHeight: //p')
+ if [ "$actual_width" != "$expected_width" ] || [ "$actual_height" != "$expected_height" ]; then
+ echo " refusing $name: expected ${expected_width}x${expected_height}, captured ${actual_width}x${actual_height}"
+ stop_exact_app "$pid" "$executable"
+ return 1
+ fi
+ fi
+ if [ "${FL_SKIP_MANIFEST:-NO}" != "YES" ]; then
+ python3 scripts/screenshot_manifest.py --directory "$OUT" --version "$GOT" "$name.png"
+ fi
stop_exact_app "$pid" "$executable"
sleep 2
}
diff --git a/site/pages/releases.html b/site/pages/releases.html
index bc36f978..8708db7f 100644
--- a/site/pages/releases.html
+++ b/site/pages/releases.html
@@ -13,7 +13,16 @@
What's new
-
0.17.0
Latest
+
0.17.1
Latest
+
+
Keep every public screenshot current. All ten website images now come from the same 0.17.1 demo build, consistently show History and Connections in the sidebar, and use History throughout linked actions and guidance.
+
Review the Store with the same product users receive. A complete 2880×1800 Mac App Store screenshot set is captured from that exact build, title-checked screen by screen, and retained with the release for App Store Connect.
+
Keep synthetic evidence isolated. Screenshot capture now refuses any process that opens the real traffic database and can enforce one uniform window and pixel size for Store-ready output.
+
+
+
+
+
0.17.0
Find past traffic in History. Reports is now History, with concise presets from 15 minutes to all retained evidence, an explicit date range, adaptive resolution, and a native overview navigator whose selection can be dragged, resized, or panned.
Keep short windows controllable. The navigator magnifies a nearby context when the full retained timeline would collapse the brush, preserves a minimum handle width, and can switch back to All history without changing the selected dates.