The trust boundary
Flowlight plugins are scoped to HTTPS inspection. They run after a request and response have already been captured, redacted, clipped, attributed to an app or agent, and written to the local database. A plugin can add findings and suggest ordinary Flowlight guardrails, but it does not block, rewrite, mock, or transform traffic by itself.
-The first shipped plugins are official built-ins. The template package below is for designing third-party or official add-on packs against the manifest and finding format while the installed plugin loader is still being hardened.
+Flowlight can import and export local plugin manifest packages from Settings. Installed packages are visible and configurable today; execution remains limited to official built-in rules until sandboxed advisory plugins ship.
Manifest
A manifest tells Flowlight what the plugin is, who publishes it, what kind of inspected data it uses, and whether it can suggest guardrails.
@@ -133,12 +133,12 @@Supported guardrail providers
Template package
-The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins.
+The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins. Import the manifest JSON from Settings › Plugins, then export it again to share the stored package shape.
cp -R templates/inspection-plugin my-flowlight-plugin cd my-flowlight-plugin -python3 -m json.tool manifest.json -python3 validate.py-
The validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
+node -e "JSON.parse(require('fs').readFileSync('manifest.json'))" +node validate.js +The JavaScript validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
Review checklist
-
@@ -183,7 +183,7 @@
- Install local plugin packages. Settings › Plugins can now import and export Flowlight plugin + manifest packages, keep installed plugins split by official or third-party publisher, and reject packages that + try to reuse a reserved built-in plugin ID. +
- Configure and maintain plugin records. Plugin packages can store local string key/value + configuration, installed packages can be removed with their retained findings, and built-in plugins preserve + enable/configuration state while the app updates their manifest metadata. +
- Backfill advisory findings. The Plugins tab can rerun official built-in rules over retained + inspected exchanges so newly enabled or updated plugins can annotate recent history without recapturing traffic. +
- Official inspection plugins. Flowlight now derives advisory plugin findings from inspected
exchanges after capture, redaction and attribution. The first official built-ins cover large uploads,
@@ -1141,7 +1155,7 @@
What's new
© 2026 The Flowlight contributors. Flowlight is free software, released under the GNU General Public License v3.0. - Version 0.14.0 · Not affiliated with Apple or any AI provider named on this site. + Version 0.14.1 · Not affiliated with Apple or any AI provider named on this site. - Install local plugin packages. Settings › Plugins can now import and export Flowlight plugin + manifest packages, keep installed plugins split by official or third-party publisher, and reject packages that + try to reuse a reserved built-in plugin ID. +
- Configure and maintain plugin records. Plugin packages can store local string key/value + configuration, installed packages can be removed with their retained findings, and built-in plugins preserve + enable/configuration state while the app updates their manifest metadata. +
- Backfill advisory findings. The Plugins tab can rerun official built-in rules over retained + inspected exchanges so newly enabled or updated plugins can annotate recent history without recapturing traffic. +
- Official inspection plugins. Flowlight now derives advisory plugin findings from inspected exchanges after capture, redaction and attribution. The first official built-ins cover large uploads, diff --git a/templates/inspection-plugin/README.md b/templates/inspection-plugin/README.md index ea7d109..2693683 100644 --- a/templates/inspection-plugin/README.md +++ b/templates/inspection-plugin/README.md @@ -1,6 +1,6 @@ # Flowlight Inspection Plugin Template -This template describes an advisory Flowlight inspection plugin package. The first app release with plugins ships official built-in Swift plugins only; this package is the authoring shape for official add-on packs and future installed third-party plugins. +This template describes an advisory Flowlight inspection plugin package. Flowlight can import and export this manifest shape today; installed packages are visible and configurable, while executable plugin logic remains limited to official built-in Swift rules until the sandbox phase. ## Trust boundary @@ -10,9 +10,9 @@ Evidence must be bounded and redacted. Do not include raw request or response bo ## Files -- `manifest.json`: plugin identity, publisher category, guardrail provider, privacy summary and capabilities. +- `manifest.json`: plugin identity, publisher category, guardrail provider, privacy summary, optional `configuration` string map and capabilities. - `findings.example.json`: sample findings the plugin may produce. -- `validate.py`: local schema and privacy sanity checks for the template package. +- `validate.js`: local schema and privacy sanity checks for the template package. ## Supported guardrail providers @@ -28,5 +28,5 @@ Evidence must be bounded and redacted. Do not include raw request or response bo ## Validate ```sh -python3 validate.py +node validate.js ``` diff --git a/templates/inspection-plugin/validate.js b/templates/inspection-plugin/validate.js new file mode 100644 index 0000000..779b349 --- /dev/null +++ b/templates/inspection-plugin/validate.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const root = __dirname; +const kinds = new Set(['traffic', 'llmMCP']); +const sources = new Set(['builtIn', 'installed']); +const publishers = new Set(['official', 'thirdParty']); +const providers = new Set(['flowlight', 'presidio', 'bedrock', 'lakera', 'aporia', 'noma', 'prismaAIRS', 'custom']); +const capabilities = new Set(['annotate', 'suggestGuardrail']); +const severities = new Set(['info', 'low', 'medium', 'high']); +const secretPattern = /(sk-[A-Za-z0-9_-]{8,}|bearer\s+\S+|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=])/i; + +function load(name) { + return JSON.parse(fs.readFileSync(path.join(root, name), 'utf8')); +} + +function fail(message) { + console.error(`error: ${message}`); + process.exit(1); +} + +function requireCondition(condition, message) { + if (!condition) fail(message); +} + +function isPlainObject(value) { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} + +function checkManifest(manifest) { + for (const key of ['id', 'name', 'version', 'kind', 'source', 'publisher', 'guardrailProvider', 'description', 'privacySummary', 'capabilities']) { + requireCondition(Object.prototype.hasOwnProperty.call(manifest, key), `manifest missing ${key}`); + } + requireCondition(/^[A-Za-z0-9_.-]+$/.test(manifest.id), 'manifest id must use letters, numbers, dots, underscores, and hyphens'); + requireCondition(kinds.has(manifest.kind), 'manifest kind must be traffic or llmMCP'); + requireCondition(sources.has(manifest.source), 'manifest source must be builtIn or installed'); + requireCondition(publishers.has(manifest.publisher), 'manifest publisher must be official or thirdParty'); + requireCondition(providers.has(manifest.guardrailProvider), 'unsupported guardrailProvider'); + requireCondition(Array.isArray(manifest.capabilities), 'manifest capabilities must be an array'); + requireCondition(manifest.capabilities.every(capability => capabilities.has(capability)), 'unsupported capability'); + requireCondition(manifest.privacySummary.length <= 500, 'privacySummary should stay concise'); + if (manifest.configuration !== undefined) { + requireCondition(isPlainObject(manifest.configuration), 'configuration must be an object'); + for (const [key, value] of Object.entries(manifest.configuration)) { + requireCondition(typeof value === 'string', `configuration ${key} must be a string`); + } + } +} + +function checkFindings(findings) { + requireCondition(Array.isArray(findings), 'findings.example.json must be an array'); + findings.forEach((finding, index) => { + requireCondition(severities.has(finding.severity), `finding ${index} has unsupported severity`); + for (const key of ['title', 'summary', 'evidence']) { + requireCondition(Object.prototype.hasOwnProperty.call(finding, key), `finding ${index} missing ${key}`); + } + requireCondition(finding.title.length <= 120, `finding ${index} title is too long`); + requireCondition(finding.summary.length <= 500, `finding ${index} summary is too long`); + requireCondition(Array.isArray(finding.evidence) && finding.evidence.length <= 8, `finding ${index} evidence must be a short array`); + requireCondition(!secretPattern.test(JSON.stringify(finding)), `finding ${index} appears to contain a secret-like value`); + finding.evidence.forEach(evidence => { + requireCondition((evidence.label || '').length <= 80, `finding ${index} evidence label is too long`); + requireCondition((evidence.value || '').length <= 240, `finding ${index} evidence value is too long`); + }); + }); +} + +checkManifest(load('manifest.json')); +checkFindings(load('findings.example.json')); +console.log('ok'); diff --git a/templates/inspection-plugin/validate.py b/templates/inspection-plugin/validate.py deleted file mode 100644 index 8000fa6..0000000 --- a/templates/inspection-plugin/validate.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 -import json -import re -import sys -from pathlib import Path - -ROOT = Path(__file__).resolve().parent -KINDS = {"traffic", "llmMCP"} -SOURCES = {"builtIn", "installed"} -PUBLISHERS = {"official", "thirdParty"} -PROVIDERS = {"flowlight", "presidio", "bedrock", "lakera", "aporia", "noma", "prismaAIRS", "custom"} -CAPABILITIES = {"annotate", "suggestGuardrail"} -SEVERITIES = {"info", "low", "medium", "high"} -SECRET_RE = re.compile(r"(sk-[A-Za-z0-9_-]{8,}|bearer\s+\S+|api[_-]?key\s*[:=]|secret\s*[:=]|token\s*[:=])", re.I) - - -def load(name): - return json.loads((ROOT / name).read_text()) - - -def fail(message): - print(f"error: {message}", file=sys.stderr) - sys.exit(1) - - -def require(condition, message): - if not condition: - fail(message) - - -def check_manifest(manifest): - for key in ["id", "name", "version", "kind", "source", "publisher", "guardrailProvider", "description", "privacySummary", "capabilities"]: - require(key in manifest, f"manifest missing {key}") - require(manifest["kind"] in KINDS, "manifest kind must be traffic or llmMCP") - require(manifest["source"] in SOURCES, "manifest source must be builtIn or installed") - require(manifest["publisher"] in PUBLISHERS, "manifest publisher must be official or thirdParty") - require(manifest["guardrailProvider"] in PROVIDERS, "unsupported guardrailProvider") - require(set(manifest["capabilities"]).issubset(CAPABILITIES), "unsupported capability") - require(len(manifest["privacySummary"]) <= 500, "privacySummary should stay concise") - - -def check_findings(findings): - require(isinstance(findings, list), "findings.example.json must be an array") - for i, finding in enumerate(findings): - require(finding.get("severity") in SEVERITIES, f"finding {i} has unsupported severity") - for key in ["title", "summary", "evidence"]: - require(key in finding, f"finding {i} missing {key}") - require(len(finding["title"]) <= 120, f"finding {i} title is too long") - require(len(finding["summary"]) <= 500, f"finding {i} summary is too long") - require(isinstance(finding["evidence"], list) and len(finding["evidence"]) <= 8, f"finding {i} evidence must be a short array") - text = json.dumps(finding, ensure_ascii=False) - require(not SECRET_RE.search(text), f"finding {i} appears to contain a secret-like value") - for evidence in finding["evidence"]: - require(len(evidence.get("label", "")) <= 80, f"finding {i} evidence label is too long") - require(len(evidence.get("value", "")) <= 240, f"finding {i} evidence value is too long") - - -def main(): - check_manifest(load("manifest.json")) - check_findings(load("findings.example.json")) - print("ok") - - -if __name__ == "__main__": - main()
Review checklist
Contact
Agradecimentos
Documentação
Usar o Flowlight
-Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.14.0, macOS 15 ou posterior.
+Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.14.1, macOS 15 ou posterior.
Veja a atividade de rede das suas apps.
brew install --cask xinbetween/tap/flowlight
-
+
@@ -571,7 +571,7 @@ Saiba o que sai do seu Mac.
© 2026 Quem contribui para o Flowlight. O Flowlight é software livre, publicado sob a GNU General Public License v3.0.
- Versão 0.14.0 · Sem qualquer ligação à Apple ou a algum fornecedor de IA mencionado neste site.
+ Versão 0.14.1 · Sem qualquer ligação à Apple ou a algum fornecedor de IA mencionado neste site.
diff --git a/docs/pt-PT/privacy/index.html b/docs/pt-PT/privacy/index.html
index 67068e7..5dd7bd1 100644
--- a/docs/pt-PT/privacy/index.html
+++ b/docs/pt-PT/privacy/index.html
@@ -188,7 +188,7 @@ Contacto
© 2026 Quem contribui para o Flowlight. O Flowlight é software livre, publicado sob a GNU General Public License v3.0.
- Versão 0.14.0 · Sem qualquer ligação à Apple ou a algum fornecedor de IA mencionado neste site.
+ Versão 0.14.1 · Sem qualquer ligação à Apple ou a algum fornecedor de IA mencionado neste site.
diff --git a/docs/pt-PT/threat-model/index.html b/docs/pt-PT/threat-model/index.html
index 81f8247..7043e7b 100644
--- a/docs/pt-PT/threat-model/index.html
+++ b/docs/pt-PT/threat-model/index.html
@@ -225,7 +225,7 @@ Comunicar uma vulnerabilidade
© 2026 Quem contribui para o Flowlight. O Flowlight é software livre, publicado sob a GNU General Public License v3.0.
- Versão 0.14.0 · Sem qualquer ligação à Apple ou a algum fornecedor de IA mencionado neste site.
+ Versão 0.14.1 · Sem qualquer ligação à Apple ou a algum fornecedor de IA mencionado neste site.
diff --git a/docs/releases/index.html b/docs/releases/index.html
index 413fca4..041a871 100644
--- a/docs/releases/index.html
+++ b/docs/releases/index.html
@@ -61,7 +61,21 @@ What's new
- 0.14.0
Latest
+ 0.14.1
Latest
+
+
+
+
+
+ 0.14.0
diff --git a/docs/threat-model/index.html b/docs/threat-model/index.html
index acc82e0..c6c7028 100644
--- a/docs/threat-model/index.html
+++ b/docs/threat-model/index.html
@@ -224,7 +224,7 @@ Reporting a vulnerability
© 2026 The Flowlight contributors. Flowlight is free software, released under the
GNU General Public License v3.0.
- Version 0.14.0 · Not affiliated with Apple or any AI provider named on this site.
+ Version 0.14.1 · Not affiliated with Apple or any AI provider named on this site.
diff --git a/docs/zh-Hans/about/index.html b/docs/zh-Hans/about/index.html
index b4b1fb0..4d14bff 100644
--- a/docs/zh-Hans/about/index.html
+++ b/docs/zh-Hans/about/index.html
@@ -152,7 +152,7 @@ 致谢
© 2026 Flowlight 贡献者。Flowlight 是自由软件,依 GNU General Public License v3.0 发布。
- 版本 0.14.0 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
+ 版本 0.14.1 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
diff --git a/docs/zh-Hans/docs/index.html b/docs/zh-Hans/docs/index.html
index 0662941..7f249dd 100644
--- a/docs/zh-Hans/docs/index.html
+++ b/docs/zh-Hans/docs/index.html
@@ -76,7 +76,7 @@
文档
使用 Flowlight
- 从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.14.0,macOS 15 或更高版本。
+ 从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.14.1,macOS 15 或更高版本。
© 2026 Flowlight 贡献者。Flowlight 是自由软件,依 GNU General Public License v3.0 发布。
- 版本 0.14.0 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
+ 版本 0.14.1 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
diff --git a/docs/zh-Hans/index.html b/docs/zh-Hans/index.html
index e2b771d..acb32d0 100644
--- a/docs/zh-Hans/index.html
+++ b/docs/zh-Hans/index.html
@@ -48,7 +48,7 @@
-
+
跳到正文
@@ -90,7 +90,7 @@ 看清应用的网络活动。
brew install --cask xinbetween/tap/flowlight
-
+
@@ -568,7 +568,7 @@ 知道什么离开了你的 Mac。
© 2026 Flowlight 贡献者。Flowlight 是自由软件,依 GNU General Public License v3.0 发布。
- 版本 0.14.0 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
+ 版本 0.14.1 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
diff --git a/docs/zh-Hans/privacy/index.html b/docs/zh-Hans/privacy/index.html
index c3e380f..6ee7508 100644
--- a/docs/zh-Hans/privacy/index.html
+++ b/docs/zh-Hans/privacy/index.html
@@ -186,7 +186,7 @@ 联系方式
© 2026 Flowlight 贡献者。Flowlight 是自由软件,依 GNU General Public License v3.0 发布。
- 版本 0.14.0 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
+ 版本 0.14.1 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
diff --git a/docs/zh-Hans/threat-model/index.html b/docs/zh-Hans/threat-model/index.html
index 57a6440..37c06da 100644
--- a/docs/zh-Hans/threat-model/index.html
+++ b/docs/zh-Hans/threat-model/index.html
@@ -212,7 +212,7 @@ 报告漏洞
© 2026 Flowlight 贡献者。Flowlight 是自由软件,依 GNU General Public License v3.0 发布。
- 版本 0.14.0 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
+ 版本 0.14.1 · 与 Apple 及本站提及的任何 AI 提供方均无关联。
diff --git a/docs/zh-Hant/about/index.html b/docs/zh-Hant/about/index.html
index d02fd5a..1eb5663 100644
--- a/docs/zh-Hant/about/index.html
+++ b/docs/zh-Hant/about/index.html
@@ -152,7 +152,7 @@ 致謝
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/docs/zh-Hant/docs/index.html b/docs/zh-Hant/docs/index.html
index a9300eb..93bd875 100644
--- a/docs/zh-Hant/docs/index.html
+++ b/docs/zh-Hant/docs/index.html
@@ -76,7 +76,7 @@
說明文件
使用 Flowlight
- 從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.14.0,macOS 15 或以上版本。
+ 從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.14.1,macOS 15 或以上版本。
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/docs/zh-Hant/index.html b/docs/zh-Hant/index.html
index 3636e88..7ae94d6 100644
--- a/docs/zh-Hant/index.html
+++ b/docs/zh-Hant/index.html
@@ -48,7 +48,7 @@
-
+
跳至內容
@@ -90,7 +90,7 @@ 看見每個 App 的網路活動。
brew install --cask xinbetween/tap/flowlight
-
+
@@ -569,7 +569,7 @@ 知道有什麼離開了你的 Mac。
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/docs/zh-Hant/privacy/index.html b/docs/zh-Hant/privacy/index.html
index 71bb783..fd60d2f 100644
--- a/docs/zh-Hant/privacy/index.html
+++ b/docs/zh-Hant/privacy/index.html
@@ -186,7 +186,7 @@ 聯絡
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/docs/zh-Hant/threat-model/index.html b/docs/zh-Hant/threat-model/index.html
index bafba42..b6a6cb9 100644
--- a/docs/zh-Hant/threat-model/index.html
+++ b/docs/zh-Hant/threat-model/index.html
@@ -213,7 +213,7 @@ 回報漏洞
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/project.yml b/project.yml
index ad0d9e0..721bdbe 100644
--- a/project.yml
+++ b/project.yml
@@ -11,8 +11,8 @@ settings:
DEVELOPMENT_TEAM: ""
CODE_SIGN_STYLE: Automatic
ENABLE_HARDENED_RUNTIME: YES
- MARKETING_VERSION: "0.14.0"
- CURRENT_PROJECT_VERSION: "30"
+ MARKETING_VERSION: "0.14.1"
+ CURRENT_PROJECT_VERSION: "31"
targets:
Flowlight:
type: application
diff --git a/site/pages/plugins.html b/site/pages/plugins.html
index d67e6a6..2761ab2 100644
--- a/site/pages/plugins.html
+++ b/site/pages/plugins.html
@@ -27,7 +27,7 @@ Write inspection plugins
The trust boundary
Flowlight plugins are scoped to HTTPS inspection. They run after a request and response have already been captured, redacted, clipped, attributed to an app or agent, and written to the local database. A plugin can add findings and suggest ordinary Flowlight guardrails, but it does not block, rewrite, mock, or transform traffic by itself.
- The first shipped plugins are official built-ins. The template package below is for designing third-party or official add-on packs against the manifest and finding format while the installed plugin loader is still being hardened.
+ Flowlight can import and export local plugin manifest packages from Settings. Installed packages are visible and configurable today; execution remains limited to official built-in rules until sandboxed advisory plugins ship.
Manifest
A manifest tells Flowlight what the plugin is, who publishes it, what kind of inspected data it uses, and whether it can suggest guardrails.
@@ -85,12 +85,12 @@ Supported guardrail providers
Template package
- The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins.
+ The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins. Import the manifest JSON from Settings › Plugins, then export it again to share the stored package shape.
cp -R templates/inspection-plugin my-flowlight-plugin
cd my-flowlight-plugin
-python3 -m json.tool manifest.json
-python3 validate.py
- The validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
+node -e "JSON.parse(require('fs').readFileSync('manifest.json'))"
+node validate.js
+ The JavaScript validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
Review checklist
diff --git a/site/pages/releases.html b/site/pages/releases.html
index a1b4e29..7f33e7f 100644
--- a/site/pages/releases.html
+++ b/site/pages/releases.html
@@ -13,7 +13,21 @@ What's new
- 0.14.0
Latest
+ 0.14.1
Latest
+
+
+
+
+
+ 0.14.0
brew install --cask xinbetween/tap/flowlight0.14.0
Latest0.14.1
Latest-
+
0.14.0
文档
使用 Flowlight
-从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.14.0,macOS 15 或更高版本。
+从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.14.1,macOS 15 或更高版本。
brew install --cask xinbetween/tap/flowlight
知道什么离开了你的 Mac。
联系方式
报告漏洞
致謝
說明文件
使用 Flowlight
-從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.14.0,macOS 15 或以上版本。
+從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.14.1,macOS 15 或以上版本。
看見每個 App 的網路活動。
brew install --cask xinbetween/tap/flowlight
-
+
@@ -569,7 +569,7 @@ 知道有什麼離開了你的 Mac。
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/docs/zh-Hant/privacy/index.html b/docs/zh-Hant/privacy/index.html
index 71bb783..fd60d2f 100644
--- a/docs/zh-Hant/privacy/index.html
+++ b/docs/zh-Hant/privacy/index.html
@@ -186,7 +186,7 @@ 聯絡
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/docs/zh-Hant/threat-model/index.html b/docs/zh-Hant/threat-model/index.html
index bafba42..b6a6cb9 100644
--- a/docs/zh-Hant/threat-model/index.html
+++ b/docs/zh-Hant/threat-model/index.html
@@ -213,7 +213,7 @@ 回報漏洞
© 2026 Flowlight 貢獻者。Flowlight 是自由軟體,依 GNU General Public License v3.0 發布。
- 版本 0.14.0 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
+ 版本 0.14.1 · 與 Apple 及本站提及的任何 AI 供應商均無關聯。
diff --git a/project.yml b/project.yml
index ad0d9e0..721bdbe 100644
--- a/project.yml
+++ b/project.yml
@@ -11,8 +11,8 @@ settings:
DEVELOPMENT_TEAM: ""
CODE_SIGN_STYLE: Automatic
ENABLE_HARDENED_RUNTIME: YES
- MARKETING_VERSION: "0.14.0"
- CURRENT_PROJECT_VERSION: "30"
+ MARKETING_VERSION: "0.14.1"
+ CURRENT_PROJECT_VERSION: "31"
targets:
Flowlight:
type: application
diff --git a/site/pages/plugins.html b/site/pages/plugins.html
index d67e6a6..2761ab2 100644
--- a/site/pages/plugins.html
+++ b/site/pages/plugins.html
@@ -27,7 +27,7 @@ Write inspection plugins
The trust boundary
Flowlight plugins are scoped to HTTPS inspection. They run after a request and response have already been captured, redacted, clipped, attributed to an app or agent, and written to the local database. A plugin can add findings and suggest ordinary Flowlight guardrails, but it does not block, rewrite, mock, or transform traffic by itself.
- The first shipped plugins are official built-ins. The template package below is for designing third-party or official add-on packs against the manifest and finding format while the installed plugin loader is still being hardened.
+ Flowlight can import and export local plugin manifest packages from Settings. Installed packages are visible and configurable today; execution remains limited to official built-in rules until sandboxed advisory plugins ship.
Manifest
A manifest tells Flowlight what the plugin is, who publishes it, what kind of inspected data it uses, and whether it can suggest guardrails.
@@ -85,12 +85,12 @@ Supported guardrail providers
Template package
- The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins.
+ The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins. Import the manifest JSON from Settings › Plugins, then export it again to share the stored package shape.
cp -R templates/inspection-plugin my-flowlight-plugin
cd my-flowlight-plugin
-python3 -m json.tool manifest.json
-python3 validate.py
- The validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
+node -e "JSON.parse(require('fs').readFileSync('manifest.json'))"
+node validate.js
+ The JavaScript validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
Review checklist
diff --git a/site/pages/releases.html b/site/pages/releases.html
index a1b4e29..7f33e7f 100644
--- a/site/pages/releases.html
+++ b/site/pages/releases.html
@@ -13,7 +13,21 @@ What's new
- 0.14.0
Latest
+ 0.14.1
Latest
+
+
+
+
+
+ 0.14.0
The trust boundary
Flowlight plugins are scoped to HTTPS inspection. They run after a request and response have already been captured, redacted, clipped, attributed to an app or agent, and written to the local database. A plugin can add findings and suggest ordinary Flowlight guardrails, but it does not block, rewrite, mock, or transform traffic by itself.
-The first shipped plugins are official built-ins. The template package below is for designing third-party or official add-on packs against the manifest and finding format while the installed plugin loader is still being hardened.
+Flowlight can import and export local plugin manifest packages from Settings. Installed packages are visible and configurable today; execution remains limited to official built-in rules until sandboxed advisory plugins ship.
Manifest
A manifest tells Flowlight what the plugin is, who publishes it, what kind of inspected data it uses, and whether it can suggest guardrails.
@@ -85,12 +85,12 @@Supported guardrail providers
Template package
-The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins.
+The starter package lives at templates/inspection-plugin. It includes a manifest, sample findings, a policy checklist and fixtures for ordinary traffic and LLM/MCP guardrail plugins. Import the manifest JSON from Settings › Plugins, then export it again to share the stored package shape.
cp -R templates/inspection-plugin my-flowlight-plugin cd my-flowlight-plugin -python3 -m json.tool manifest.json -python3 validate.py-
The validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
+node -e "JSON.parse(require('fs').readFileSync('manifest.json'))" +node validate.js +The JavaScript validator is deliberately local and boring: it checks manifest fields, provider names, capability names, evidence size limits and the absence of common secret-looking values in sample findings.
Review checklist
-
diff --git a/site/pages/releases.html b/site/pages/releases.html
index a1b4e29..7f33e7f 100644
--- a/site/pages/releases.html
+++ b/site/pages/releases.html
@@ -13,7 +13,21 @@
What's new
0.14.0
Latest0.14.1
Latest-
+