diff --git a/package.json b/package.json index 524c85a..d4053ff 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "preview": "npm run preview -w @bigtech-sucks/web", "test": "npm run test -w @bigtech-sucks/core", "db:build": "node packages/core/db/build.mjs", - "db:verify": "node packages/core/db/build.mjs verify" + "db:verify": "node packages/core/db/build.mjs verify", + "db:ingest": "node packages/core/db/ingest/run.mjs" }, "license": "UNLICENSED" } \ No newline at end of file diff --git a/packages/core/db/build.mjs b/packages/core/db/build.mjs index 83cb365..4bcc10d 100644 --- a/packages/core/db/build.mjs +++ b/packages/core/db/build.mjs @@ -14,6 +14,7 @@ */ import { DatabaseSync } from 'node:sqlite'; import { readFileSync, writeFileSync, readdirSync, mkdirSync, existsSync, unlinkSync } from 'node:fs'; +import { createHash } from 'node:crypto'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -56,6 +57,8 @@ const VENDORS = { netflix: ['Netflix, Inc.', 'public', 'US', 'subscription'], 'nextcloud-gmbh': ['Nextcloud GmbH', 'private', 'DE', 'subscription'], 'signal-foundation': ['Signal Technology Foundation', 'nonprofit', 'US', 'none'], + // discovered products land here until a human or agent resolves the owner + unknown: ['Unknown vendor', 'unknown', 'unknown', 'unknown'], }; const OUTLAW_VENDOR = { @@ -80,8 +83,10 @@ const ID_OVERRIDES = { '1password': 'onepassword', '23andme': 'twentythreeandme' const slug = (s) => ID_OVERRIDES[s] ?? s.replace(/[^a-z0-9]+/gi, '-').toLowerCase(); // ---------------------------------------------------------------- build -async function build() { - if (existsSync(DB_PATH)) unlinkSync(DB_PATH); +async function build({ fresh = false } = {}) { + // Never wipe by default: the database authors itself, and a rebuild that + // deletes discovered products would throw away the roster. --fresh is explicit. + if (fresh && existsSync(DB_PATH)) unlinkSync(DB_PATH); const db = new DatabaseSync(DB_PATH); db.exec('PRAGMA foreign_keys = ON'); db.exec(readFileSync(join(HERE, 'schema.sql'), 'utf8')); @@ -222,7 +227,27 @@ function exportSite() { dimensions, products, assessments, scores, evidence, findings, }; - writeFileSync(join(GEN_DIR, 'catalog.json'), JSON.stringify(payload, null, 2)); + // The bytes we hash are the bytes we serve. The oath is bound to this digest, + // so an oath page that does not match the data is detectable by a stranger. + const catalogBytes = JSON.stringify(payload, null, 2); + writeFileSync(join(GEN_DIR, 'catalog.json'), catalogBytes); + + const PUB = join(CORE, '..', 'web', 'public'); + mkdirSync(PUB, { recursive: true }); + writeFileSync(join(PUB, 'catalog.json'), catalogBytes); + + const digest = createHash('sha256').update(catalogBytes).digest('hex'); + const oath = { + digest, + algorithm: 'sha256', + file: 'catalog.json', + byte_length: Buffer.byteLength(catalogBytes), + rebuilt_at: new Date().toISOString(), + method_version: payload.method_version, + products: products.length, + assessed: products.filter((p) => p.weighted_total !== null).length, + }; + writeFileSync(join(PUB, 'oath.json'), JSON.stringify(oath, null, 2)); const ts = `// GENERATED FILE - do not edit by hand. // Source of truth: packages/core/db/bigtech.db @@ -295,7 +320,8 @@ if (mode === 'verify') { const r = verify(); report(r); } else { - const { migrated, seeds } = await build(); + const fresh = process.argv.includes('--fresh'); + const { migrated, seeds } = await build({ fresh }); console.log(`built ${DB_PATH}`); console.log(` legacy roster absorbed: ${migrated} products (unassessed)`); console.log(` seeds applied: ${seeds.join(', ')}`); diff --git a/packages/core/db/ingest/run.mjs b/packages/core/db/ingest/run.mjs new file mode 100644 index 0000000..38f3546 --- /dev/null +++ b/packages/core/db/ingest/run.mjs @@ -0,0 +1,152 @@ +#!/usr/bin/env node +/** + * Self-authoring ingest. + * + * The roster writes itself. The scores do not. + * + * DISCOVERY automatic. A source names a piece of software and a usage number. + * ASSESSMENT never automatic. A score requires a written rationale and tier-1 + * or tier-2 evidence, and the build gate enforces that. + * + * That split is the whole design. If the ingest wrote scores, the oath on the + * front page would be a lie the same afternoon. + * + * Run: npm run db:ingest + * Dry run: npm run db:ingest -- --dry + */ +import { DatabaseSync } from 'node:sqlite'; +import { readFileSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { ADAPTERS, looksLikeUserSoftware } from './sources.mjs'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const DB_PATH = join(HERE, '..', 'bigtech.db'); +const DRY = process.argv.includes('--dry'); + +/** What to go looking for, and what to rank it by. */ +const TARGETS = [ + { category: 'messaging', source: 'flathub', query: 'messaging' }, + { category: 'messaging', source: 'github', query: 'messaging' }, + { category: 'email', source: 'flathub', query: 'email' }, + { category: 'email', source: 'github', query: 'mail-client' }, + { category: 'passwords', source: 'flathub', query: 'password' }, + { category: 'browser', source: 'flathub', query: 'web browser' }, + { category: 'notes', source: 'flathub', query: 'notes' }, + { category: 'files', source: 'github', query: 'file-sync' }, + { category: 'photos', source: 'flathub', query: 'photo' }, + // Flathub is a curated store of end-user Linux apps, so relevance is free. + // GitHub topics are uncurated, so relevance has to be earned by a classifier. + // Prefer the store wherever it has the category. Verified 2026-10-29: the + // GitHub topic 'local-llm' returned Langroid and Pangu.js, neither of which + // is a product a person installs. + { category: 'ai', source: 'flathub', query: 'llm' }, +]; + +const slug = (s) => + s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 48); + +const now = new Date().toISOString(); + +async function main() { + const db = new DatabaseSync(DB_PATH); + db.exec('PRAGMA foreign_keys = ON'); + db.exec(readFileSync(join(HERE, '..', 'schema.sql'), 'utf8')); + + const existing = new Map( + db.prepare('SELECT id, LOWER(name) AS n FROM product').all().map((r) => [r.n, r.id]), + ); + const taken = new Set(db.prepare('SELECT id FROM product').all().map((r) => r.id)); + + const insProduct = db.prepare(` + INSERT OR IGNORE INTO product + (id, vendor_id, name, category_id, platform, source_url, license, sovereign, boss, art_slot, monthly_cost, notes) + VALUES (?, 'unknown', ?, ?, ?, ?, ?, 0, 0, NULL, NULL, ?)`); + + const insDiscovery = db.prepare(` + INSERT OR IGNORE INTO discovery + (product_id, source, source_url, usage_signal, usage_metric, observed_at, raw) + VALUES (?, ?, ?, ?, ?, ?, ?)`); + + const stats = { targets: 0, rowsSeen: 0, newProducts: 0, newReceipts: 0, failed: [] }; + + for (const target of TARGETS) { + const adapter = ADAPTERS[target.source]; + if (!adapter) { console.warn(` ! unknown source ${target.source}`); continue; } + stats.targets++; + + let rows; + try { + rows = await adapter(target.query); + } catch (err) { + stats.failed.push(`${target.source}/${target.query}: ${err.message}`); + console.warn(` FAIL ${target.source}/${target.query} ${err.message}`); + continue; + } + + let added = 0; + let dropped = 0; + for (const row of rows) { + // Relevance gate first. A highly starred message broker is not a product + // a person chooses, and a roster full of them is a roster nobody trusts. + if (row.platform === 'source' && !looksLikeUserSoftware(row)) { dropped++; continue; } + stats.rowsSeen++; + const key = row.name.toLowerCase(); + let id = existing.get(key); + + if (!id) { + let candidate = slug(row.name); + if (taken.has(candidate)) candidate = `${candidate}-${slug(target.category)}`; + if (taken.has(candidate)) continue; + + if (!DRY) { + insProduct.run( + candidate, row.name, target.category, row.platform, + row.sourceUrl, row.raw?.license ?? null, + `Discovered by ${target.source} ingest on ${now.slice(0, 10)}. Unassessed.`, + ); + } + taken.add(candidate); + existing.set(key, candidate); + id = candidate; + stats.newProducts++; + added++; + } + + if (!DRY) { + const r = insDiscovery.run( + id, target.source, row.sourceUrl, row.usage, row.usageMetric, + now, JSON.stringify(row.raw), + ); + if (r.changes) stats.newReceipts++; + } + } + console.log( + ` ${target.source.padEnd(8)} ${String(target.query).padEnd(16)} ${target.category.padEnd(11)} ${String(rows.length).padStart(3)} seen, ${added} new, ${dropped} not-an-app`, + ); + } + + const backlog = db.prepare('SELECT * FROM v_backlog LIMIT 12').all(); + const cov = db.prepare('SELECT * FROM v_coverage').all(); + const assessed = cov.filter((c) => c.status !== 'unassessed').length; + db.close(); + + console.log(''); + console.log(DRY ? 'DRY RUN, nothing written' : 'INGEST COMPLETE'); + console.log(` targets attempted : ${stats.targets}`); + console.log(` rows seen : ${stats.rowsSeen}`); + console.log(` new products : ${stats.newProducts}`); + console.log(` new receipts : ${stats.newReceipts}`); + console.log(` failed sources : ${stats.failed.length}`); + console.log(''); + console.log(`COVERAGE ${assessed} assessed / ${cov.length} products`); + if (backlog.length) { + console.log(''); + console.log('BACKLOG, ordered by usage'); + for (const b of backlog) { + console.log(` ${String(b.usage).padStart(8)} ${b.name.padEnd(28)} ${String(b.category_id).padEnd(11)} via ${b.found_via}`); + } + } +} + +main().catch((err) => { console.error(err); process.exit(1); }); diff --git a/packages/core/db/ingest/sources.mjs b/packages/core/db/ingest/sources.mjs new file mode 100644 index 0000000..1d896b6 --- /dev/null +++ b/packages/core/db/ingest/sources.mjs @@ -0,0 +1,97 @@ +/** + * Discovery adapters. + * + * Each adapter returns a normalised shape: + * { name, platform, sourceUrl, usage, usageMetric, raw } + * + * Rules for an adapter: + * - it discovers SOFTWARE, it never scores it + * - it records where it found the thing and how much it is used + * - it fails loudly, never silently returning an empty list on a blocked fetch + * + * Sources currently live: + * github open API, no key needed, 60 requests/hour unauthenticated + * flathub open API, POST /api/v2/search, no key + * + * Sources deliberately not automated: + * alternativeto Cloudflare-protected. Readable through a real browser engine + * (verified 2026-10-29) but their robots.txt asks ai-train=no. + * Treated as a demand signal for manual/periodic import, not a + * crawler target. Do not add a scraper here without a decision. + */ + +const UA = 'bigtech-sucks-ingest/0.1 (+https://bigtech.sucks; assessment roster)'; + +async function getJson(url, init = {}) { + const res = await fetch(url, { + ...init, + headers: { 'User-Agent': UA, Accept: 'application/json', ...(init.headers || {}) }, + }); + if (!res.ok) throw new Error(`${url} -> HTTP ${res.status}`); + return res.json(); +} + +// ------------------------------------------------------------------ relevance +// Usage rank alone is not a roster. `topic:messaging` sorts RabbitMQ to the top, +// because a message broker is highly starred and not a thing a human installs. +// A candidate must look like software a person uses, or it is dropped and the +// reason is recorded. +const NOT_AN_APP = + /\b(broker|queue|mqtt|amqp|kafka|nats|pulsar|rocketmq|emqx|nsq|rabbitmq|database|sdk|library|libraries|framework|protocol|server|infrastructure|plugin|extension|binding|middleware|gateway|proxy|driver|api client|spec|specification|awesome list)\b/i; +const APP_HINT = + /\b(app|application|client|desktop|chat|messenger|messaging|mobile|gui|editor|browser|vault|manager|suite)\b/i; + +export function looksLikeUserSoftware(row) { + const text = `${row.name} ${row.raw?.description ?? ''}`; + if (NOT_AN_APP.test(text)) return false; + if (row.raw?.homepage) return true; + return APP_HINT.test(text); +} + +// ------------------------------------------------------------------ GitHub +export async function githubByTopic(topic, { minStars = 500, limit = 10 } = {}) { + const q = encodeURIComponent(`topic:${topic} stars:>=${minStars} archived:false`); + const data = await getJson( + `https://api.github.com/search/repositories?q=${q}&sort=stars&order=desc&per_page=${limit}`, + ); + return (data.items || []).map((r) => ({ + name: r.name.replace(/[-_]/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()), + platform: 'source', + sourceUrl: r.html_url, + usage: r.stargazers_count ?? 0, + usageMetric: 'github_stars', + raw: { + full_name: r.full_name, + stars: r.stargazers_count, + forks: r.forks_count, + license: r.license?.spdx_id ?? null, + description: r.description, + homepage: r.homepage || null, + language: r.language, + }, + })); +} + +// ------------------------------------------------------------------ Flathub +export async function flathubSearch(query, { limit = 10 } = {}) { + const data = await getJson('https://flathub.org/api/v2/search', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query, filters: [] }), + }); + return (data.hits || []).slice(0, limit).map((h) => ({ + name: h.name, + platform: 'linux-flatpak', + sourceUrl: h.app_id ? `https://flathub.org/apps/${h.app_id}` : null, + // Flathub does not publish install counts in this endpoint. Presence in the + // distro store is a weak but real usage signal, scored low on purpose. + usage: 100, + usageMetric: 'flathub_presence', + raw: { app_id: h.app_id, summary: h.summary, developer: h.developer_name ?? null }, + })); +} + +export const ADAPTERS = { + github: (topic) => githubByTopic(topic), + flathub: (query) => flathubSearch(query), +}; diff --git a/packages/core/db/schema.sql b/packages/core/db/schema.sql index 66a5e40..6de60db 100644 --- a/packages/core/db/schema.sql +++ b/packages/core/db/schema.sql @@ -113,6 +113,24 @@ CREATE TABLE IF NOT EXISTS offramp ( PRIMARY KEY (product_id, replacement) ); +-- ---------------------------------------------------------------- discovery +-- The database authors itself. Every product the ingest finds leaves a receipt +-- here, so a reader can see WHERE it came from and HOW MUCH it is used. +-- Discovery may create a product. Discovery may NEVER create a score. +CREATE TABLE IF NOT EXISTS discovery ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + product_id TEXT NOT NULL REFERENCES product(id), + source TEXT NOT NULL CHECK (source IN ('github','flathub','alternativeto','manual','seed')), + source_url TEXT, + usage_signal INTEGER, + usage_metric TEXT, + observed_at TEXT NOT NULL, + raw TEXT, + UNIQUE(product_id, source, source_url) +); + +CREATE INDEX IF NOT EXISTS idx_discovery_product ON discovery(product_id); + -- ---------------------------------------------------------------- derived views -- The single number the game and the report both use. CREATE VIEW IF NOT EXISTS v_product_score AS @@ -161,3 +179,18 @@ SELECT FROM product p LEFT JOIN assessment a ON a.product_id = p.id AND a.assessed_on = (SELECT MAX(assessed_on) FROM assessment WHERE product_id = p.id); + +-- What to assess next, ordered by how much the thing is actually used. +CREATE VIEW IF NOT EXISTS v_backlog AS +SELECT + p.id AS product_id, + p.name, + p.platform, + p.category_id, + MAX(d.usage_signal) AS usage, + GROUP_CONCAT(DISTINCT d.source) AS found_via +FROM product p +JOIN discovery d ON d.product_id = p.id +WHERE NOT EXISTS (SELECT 1 FROM assessment a WHERE a.product_id = p.id) +GROUP BY p.id +ORDER BY usage DESC; diff --git a/packages/core/src/data/generated/catalog.json b/packages/core/src/data/generated/catalog.json index 438a59c..9a22e46 100644 --- a/packages/core/src/data/generated/catalog.json +++ b/packages/core/src/data/generated/catalog.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-10-29T18:15:54.844Z", + "generated_at": "2026-10-29T18:23:54.071Z", "method_version": "btr-0.1", "dimensions": [ { @@ -60,6 +60,28 @@ } ], "products": [ + { + "id": "alpaca", + "name": "Alpaca", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "chatgpt", "name": "ChatGPT", @@ -82,6 +104,72 @@ "headline": null, "assessed_on": null }, + { + "id": "chatqt", + "name": "ChatQT", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gpt4all", + "name": "GPT4ALL", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gai", + "name": "Gai", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "gemini", "name": "Google Gemini", @@ -104,6 +192,204 @@ "headline": null, "assessed_on": null }, + { + "id": "lm-studio", + "name": "LM Studio", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mindmate", + "name": "MindMate", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "moose", + "name": "Moose", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "reins-chat-for-ollama", + "name": "Reins: Chat for Ollama", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "tarotcaster", + "name": "TarotCaster", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "writing-tools", + "name": "Writing Tools", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chromium-web-browser", + "name": "Chromium Web Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "firedragon", + "name": "FireDragon", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "firefox", + "name": "Firefox", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "chrome", "name": "Google Chrome", @@ -126,6 +412,160 @@ "headline": null, "assessed_on": null }, + { + "id": "librewolf", + "name": "LibreWolf", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "microsoft-edge", + "name": "Microsoft Edge", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mullvad-browser", + "name": "Mullvad Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "waterfox", + "name": "Waterfox", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "web", + "name": "Web", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "web-apps", + "name": "Web Apps", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "yandex-browser", + "name": "Yandex Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "google-calendar", "name": "Google Calendar", @@ -214,6 +654,94 @@ "headline": null, "assessed_on": null }, + { + "id": "aerion", + "name": "Aerion", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "betterbird", + "name": "Betterbird", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "convey", + "name": "Convey", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "geary", + "name": "Geary", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "gmail", "name": "Gmail", @@ -236,6 +764,116 @@ "headline": null, "assessed_on": null }, + { + "id": "kanmail", + "name": "Kanmail", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mail", + "name": "Mail", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mailspring", + "name": "Mailspring", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "meli", + "name": "Meli", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "meron", + "name": "Meron", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "outlook", "name": "Outlook", @@ -280,6 +918,72 @@ "headline": null, "assessed_on": null }, + { + "id": "thunderbird", + "name": "Thunderbird", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "thunderbird-esr", + "name": "Thunderbird ESR", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "tuta-experimental", + "name": "Tuta (Experimental)", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "dropbox", "name": "Dropbox", @@ -324,6 +1028,28 @@ "headline": null, "assessed_on": null }, + { + "id": "lazyrsync", + "name": "Lazyrsync", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "nextcloud", "name": "Nextcloud (self-hosted)", @@ -346,6 +1072,28 @@ "headline": null, "assessed_on": null }, + { + "id": "ocis", + "name": "Ocis", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "onedrive", "name": "OneDrive", @@ -368,6 +1116,72 @@ "headline": null, "assessed_on": null }, + { + "id": "oxicloud", + "name": "OxiCloud", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "seafile", + "name": "Seafile", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "syncthing-macos", + "name": "Syncthing Macos", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "twentythreeandme", "name": "23andMe", @@ -412,6 +1226,50 @@ "headline": null, "assessed_on": null }, + { + "id": "bitchat", + "name": "Bitchat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chat", + "name": "Chat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "discord", "name": "Discord", @@ -434,6 +1292,204 @@ "headline": null, "assessed_on": null }, + { + "id": "flare", + "name": "Flare", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "fluxer", + "name": "Fluxer", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gnunet-messenger", + "name": "GNUnet Messenger", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gajim", + "name": "Gajim", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "kaidan", + "name": "Kaidan", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "karere", + "name": "Karere", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "lightning", + "name": "Lightning", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mumble", + "name": "Mumble", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "parla", + "name": "Parla", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "signal-desktop", "name": "Signal Desktop", @@ -456,6 +1512,28 @@ "headline": "The strongest transport on the internet, sitting behind the weakest desktop client we have scored.", "assessed_on": "2026-10-29" }, + { + "id": "simplex-chat", + "name": "Simplex Chat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "slack", "name": "Slack", @@ -478,6 +1556,28 @@ "headline": null, "assessed_on": null }, + { + "id": "whatsie", + "name": "Whatsie", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "mint", "name": "Mint (Intuit)", @@ -522,6 +1622,28 @@ "headline": null, "assessed_on": null }, + { + "id": "beaver-notes", + "name": "Beaver Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "evernote", "name": "Evernote", @@ -544,6 +1666,50 @@ "headline": null, "assessed_on": null }, + { + "id": "notes", + "name": "Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "notesnook", + "name": "Notesnook", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "notion", "name": "Notion", @@ -588,6 +1754,116 @@ "headline": null, "assessed_on": null }, + { + "id": "scrivano-for-handwritten-notes", + "name": "Scrivano for Handwritten Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "standard-notes", + "name": "Standard Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "sticky-notes", + "name": "Sticky Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "swifty-notes", + "name": "Swifty Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "trilium-notes", + "name": "Trilium Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "android", "name": "Google Android", @@ -654,6 +1930,28 @@ "headline": null, "assessed_on": null }, + { + "id": "key-rack", + "name": "Key Rack", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "lastpass", "name": "LastPass", @@ -676,6 +1974,292 @@ "headline": null, "assessed_on": null }, + { + "id": "nextcloud-password-client", + "name": "Nextcloud Password Client", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nitrokey-app2", + "name": "Nitrokey App2", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "onekeepass", + "name": "OneKeePass", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password", + "name": "Password", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-generator", + "name": "Password Generator", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-safe", + "name": "Password Safe", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-secure", + "name": "Password Secure", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "passwords-and-keys", + "name": "Passwords and Keys", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "proton-pass", + "name": "Proton Pass", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "a-photo-tool-libre", + "name": "A Photo Tool (Libre)", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "camera", + "name": "Camera", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "ente-photos", + "name": "Ente Photos", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gnu-image-manipulation-program", + "name": "GNU Image Manipulation Program", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "google-photos", "name": "Google Photos", @@ -698,6 +2282,138 @@ "headline": null, "assessed_on": null }, + { + "id": "photocollage", + "name": "PhotoCollage", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photoqt", + "name": "PhotoQt", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photobooth", + "name": "Photobooth", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photoflare", + "name": "Photoflare", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photometry", + "name": "Photometry", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photos", + "name": "Photos", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "icloud-photos", "name": "iCloud Photos", @@ -1113,7 +2829,7 @@ ], "evidence": [ { - "id": 1, + "id": 8, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "local_data_exposure", "claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.", @@ -1124,7 +2840,7 @@ "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 2, + "id": 9, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "telemetry_egress", "claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.", @@ -1135,7 +2851,7 @@ "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 3, + "id": 10, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "telemetry_egress", "claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.", @@ -1146,7 +2862,7 @@ "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 4, + "id": 11, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "telemetry_egress", "claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.", @@ -1157,7 +2873,7 @@ "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 5, + "id": 12, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "verifiability", "claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.", @@ -1168,7 +2884,7 @@ "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 6, + "id": 13, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "server_retention", "claim": "Grand jury subpoena response returned two timestamps and nothing else.", @@ -1179,7 +2895,7 @@ "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 7, + "id": 14, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "ownership_jurisdiction", "claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.", @@ -1192,7 +2908,7 @@ ], "findings": [ { - "id": 1, + "id": 5, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "high", "title": "Received attachments are stored unencrypted on disk", @@ -1201,7 +2917,7 @@ "cve": "CVE-2023-24069" }, { - "id": 2, + "id": 6, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "medium", "title": "No verified reproducible build for the Linux package", @@ -1210,7 +2926,7 @@ "cve": null }, { - "id": 3, + "id": 7, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "medium", "title": "Local database key is held in the OS keyring", @@ -1219,7 +2935,7 @@ "cve": null }, { - "id": 4, + "id": 8, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "low", "title": "Registration requires a phone number", diff --git a/packages/core/src/data/generated/catalog.ts b/packages/core/src/data/generated/catalog.ts index a74ff16..d70aa23 100644 --- a/packages/core/src/data/generated/catalog.ts +++ b/packages/core/src/data/generated/catalog.ts @@ -39,7 +39,7 @@ export interface CatalogDimension { } export const catalog = { - "generated_at": "2026-10-29T18:15:54.844Z", + "generated_at": "2026-10-29T18:23:54.071Z", "method_version": "btr-0.1", "dimensions": [ { @@ -100,6 +100,28 @@ export const catalog = { } ], "products": [ + { + "id": "alpaca", + "name": "Alpaca", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "chatgpt", "name": "ChatGPT", @@ -122,6 +144,72 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "chatqt", + "name": "ChatQT", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gpt4all", + "name": "GPT4ALL", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gai", + "name": "Gai", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "gemini", "name": "Google Gemini", @@ -144,6 +232,204 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "lm-studio", + "name": "LM Studio", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mindmate", + "name": "MindMate", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "moose", + "name": "Moose", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "reins-chat-for-ollama", + "name": "Reins: Chat for Ollama", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "tarotcaster", + "name": "TarotCaster", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "writing-tools", + "name": "Writing Tools", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chromium-web-browser", + "name": "Chromium Web Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "firedragon", + "name": "FireDragon", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "firefox", + "name": "Firefox", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "chrome", "name": "Google Chrome", @@ -166,6 +452,160 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "librewolf", + "name": "LibreWolf", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "microsoft-edge", + "name": "Microsoft Edge", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mullvad-browser", + "name": "Mullvad Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "waterfox", + "name": "Waterfox", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "web", + "name": "Web", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "web-apps", + "name": "Web Apps", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "yandex-browser", + "name": "Yandex Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "google-calendar", "name": "Google Calendar", @@ -254,6 +694,94 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "aerion", + "name": "Aerion", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "betterbird", + "name": "Betterbird", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "convey", + "name": "Convey", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "geary", + "name": "Geary", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "gmail", "name": "Gmail", @@ -276,6 +804,116 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "kanmail", + "name": "Kanmail", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mail", + "name": "Mail", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mailspring", + "name": "Mailspring", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "meli", + "name": "Meli", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "meron", + "name": "Meron", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "outlook", "name": "Outlook", @@ -320,6 +958,72 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "thunderbird", + "name": "Thunderbird", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "thunderbird-esr", + "name": "Thunderbird ESR", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "tuta-experimental", + "name": "Tuta (Experimental)", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "dropbox", "name": "Dropbox", @@ -364,6 +1068,28 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "lazyrsync", + "name": "Lazyrsync", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "nextcloud", "name": "Nextcloud (self-hosted)", @@ -386,6 +1112,28 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "ocis", + "name": "Ocis", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "onedrive", "name": "OneDrive", @@ -408,6 +1156,72 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "oxicloud", + "name": "OxiCloud", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "seafile", + "name": "Seafile", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "syncthing-macos", + "name": "Syncthing Macos", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "twentythreeandme", "name": "23andMe", @@ -452,6 +1266,50 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "bitchat", + "name": "Bitchat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chat", + "name": "Chat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "discord", "name": "Discord", @@ -474,6 +1332,204 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "flare", + "name": "Flare", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "fluxer", + "name": "Fluxer", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gnunet-messenger", + "name": "GNUnet Messenger", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gajim", + "name": "Gajim", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "kaidan", + "name": "Kaidan", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "karere", + "name": "Karere", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "lightning", + "name": "Lightning", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mumble", + "name": "Mumble", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "parla", + "name": "Parla", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "signal-desktop", "name": "Signal Desktop", @@ -496,6 +1552,28 @@ export const catalog = { "headline": "The strongest transport on the internet, sitting behind the weakest desktop client we have scored.", "assessed_on": "2026-10-29" }, + { + "id": "simplex-chat", + "name": "Simplex Chat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "slack", "name": "Slack", @@ -518,6 +1596,28 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "whatsie", + "name": "Whatsie", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "mint", "name": "Mint (Intuit)", @@ -562,6 +1662,28 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "beaver-notes", + "name": "Beaver Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "evernote", "name": "Evernote", @@ -584,6 +1706,50 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "notes", + "name": "Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "notesnook", + "name": "Notesnook", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "notion", "name": "Notion", @@ -628,6 +1794,116 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "scrivano-for-handwritten-notes", + "name": "Scrivano for Handwritten Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "standard-notes", + "name": "Standard Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "sticky-notes", + "name": "Sticky Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "swifty-notes", + "name": "Swifty Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "trilium-notes", + "name": "Trilium Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "android", "name": "Google Android", @@ -694,6 +1970,28 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "key-rack", + "name": "Key Rack", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "lastpass", "name": "LastPass", @@ -716,6 +2014,292 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "nextcloud-password-client", + "name": "Nextcloud Password Client", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nitrokey-app2", + "name": "Nitrokey App2", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "onekeepass", + "name": "OneKeePass", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password", + "name": "Password", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-generator", + "name": "Password Generator", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-safe", + "name": "Password Safe", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-secure", + "name": "Password Secure", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "passwords-and-keys", + "name": "Passwords and Keys", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "proton-pass", + "name": "Proton Pass", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "a-photo-tool-libre", + "name": "A Photo Tool (Libre)", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "camera", + "name": "Camera", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "ente-photos", + "name": "Ente Photos", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gnu-image-manipulation-program", + "name": "GNU Image Manipulation Program", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "google-photos", "name": "Google Photos", @@ -738,6 +2322,138 @@ export const catalog = { "headline": null, "assessed_on": null }, + { + "id": "photocollage", + "name": "PhotoCollage", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photoqt", + "name": "PhotoQt", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photobooth", + "name": "Photobooth", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photoflare", + "name": "Photoflare", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photometry", + "name": "Photometry", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photos", + "name": "Photos", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, { "id": "icloud-photos", "name": "iCloud Photos", @@ -1153,7 +2869,7 @@ export const catalog = { ], "evidence": [ { - "id": 1, + "id": 8, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "local_data_exposure", "claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.", @@ -1164,7 +2880,7 @@ export const catalog = { "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 2, + "id": 9, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "telemetry_egress", "claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.", @@ -1175,7 +2891,7 @@ export const catalog = { "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 3, + "id": 10, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "telemetry_egress", "claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.", @@ -1186,7 +2902,7 @@ export const catalog = { "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 4, + "id": 11, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "telemetry_egress", "claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.", @@ -1197,7 +2913,7 @@ export const catalog = { "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 5, + "id": 12, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "verifiability", "claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.", @@ -1208,7 +2924,7 @@ export const catalog = { "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 6, + "id": 13, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "server_retention", "claim": "Grand jury subpoena response returned two timestamps and nothing else.", @@ -1219,7 +2935,7 @@ export const catalog = { "observed_at": "2026-10-29T13:13:56-05:00" }, { - "id": 7, + "id": 14, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "dimension_id": "ownership_jurisdiction", "claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.", @@ -1232,7 +2948,7 @@ export const catalog = { ], "findings": [ { - "id": 1, + "id": 5, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "high", "title": "Received attachments are stored unencrypted on disk", @@ -1241,7 +2957,7 @@ export const catalog = { "cve": "CVE-2023-24069" }, { - "id": 2, + "id": 6, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "medium", "title": "No verified reproducible build for the Linux package", @@ -1250,7 +2966,7 @@ export const catalog = { "cve": null }, { - "id": 3, + "id": 7, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "medium", "title": "Local database key is held in the OS keyring", @@ -1259,7 +2975,7 @@ export const catalog = { "cve": null }, { - "id": 4, + "id": 8, "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", "severity": "low", "title": "Registration requires a phone number", diff --git a/packages/web/public/catalog.json b/packages/web/public/catalog.json new file mode 100644 index 0000000..9a22e46 --- /dev/null +++ b/packages/web/public/catalog.json @@ -0,0 +1,2947 @@ +{ + "generated_at": "2026-10-29T18:23:54.071Z", + "method_version": "btr-0.1", + "dimensions": [ + { + "id": "telemetry_egress", + "label": "Telemetry and egress", + "weight": 25, + "anchor_10": "Published destination allowlist; cold idle produces zero unlisted packets, independently confirmed.", + "anchor_0": "Covert collection, or egress that cannot be enumerated." + }, + { + "id": "verifiability", + "label": "Verifiability", + "weight": 20, + "anchor_10": "Reproducible build verified on the scored platform.", + "anchor_0": "Closed source, or no way to prove the binary matches the source." + }, + { + "id": "server_retention", + "label": "Server-side retention", + "weight": 15, + "anchor_10": "Subpoena answer is two timestamps or an empty set.", + "anchor_0": "Content readable by the vendor." + }, + { + "id": "ownership_jurisdiction", + "label": "Ownership, jurisdiction, business model", + "weight": 12, + "anchor_10": "Nonprofit or cooperative, no ad model, strong process protections.", + "anchor_0": "State-controlled." + }, + { + "id": "local_data_exposure", + "label": "Local data exposure", + "weight": 10, + "anchor_10": "All artifacts encrypted at rest under a user-presence key.", + "anchor_0": "Everything plaintext on disk." + }, + { + "id": "dependency_surface", + "label": "Dependency surface", + "weight": 8, + "anchor_10": "Small audited dependency tree, signed and pinned update channel.", + "anchor_0": "Huge unaudited tree, unsigned updates." + }, + { + "id": "user_control_exit", + "label": "User control and exit", + "weight": 5, + "anchor_10": "Usable export, real deletion, no identity hostage-taking.", + "anchor_0": "No export, deletion that does not delete." + }, + { + "id": "incident_record", + "label": "Incident record", + "weight": 5, + "anchor_10": "Flaws found, disclosed honestly, fixed fast.", + "anchor_0": "Unblemished only because nobody is allowed to test it." + } + ], + "products": [ + { + "id": "alpaca", + "name": "Alpaca", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chatgpt", + "name": "ChatGPT", + "platform": "web", + "category_id": "ai", + "vendor_id": "openai", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_chatgpt", + "monthly_cost": 20, + "vendor": "OpenAI", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chatqt", + "name": "ChatQT", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gpt4all", + "name": "GPT4ALL", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gai", + "name": "Gai", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gemini", + "name": "Google Gemini", + "platform": "web", + "category_id": "ai", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_gemini", + "monthly_cost": 0, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "lm-studio", + "name": "LM Studio", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mindmate", + "name": "MindMate", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "moose", + "name": "Moose", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "reins-chat-for-ollama", + "name": "Reins: Chat for Ollama", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "tarotcaster", + "name": "TarotCaster", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "writing-tools", + "name": "Writing Tools", + "platform": "linux-flatpak", + "category_id": "ai", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chromium-web-browser", + "name": "Chromium Web Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "firedragon", + "name": "FireDragon", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "firefox", + "name": "Firefox", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chrome", + "name": "Google Chrome", + "platform": "web", + "category_id": "browser", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_chrome", + "monthly_cost": 0, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "librewolf", + "name": "LibreWolf", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "microsoft-edge", + "name": "Microsoft Edge", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mullvad-browser", + "name": "Mullvad Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "waterfox", + "name": "Waterfox", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "web", + "name": "Web", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "web-apps", + "name": "Web Apps", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "yandex-browser", + "name": "Yandex Browser", + "platform": "linux-flatpak", + "category_id": "browser", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "google-calendar", + "name": "Google Calendar", + "platform": "web", + "category_id": "calendar", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_google_calendar", + "monthly_cost": 0, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "salesforce", + "name": "Salesforce", + "platform": "web", + "category_id": "crm", + "vendor_id": "salesforce", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_salesforce", + "monthly_cost": 25, + "vendor": "Salesforce, Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "github", + "name": "GitHub", + "platform": "web", + "category_id": "dev", + "vendor_id": "microsoft", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_github", + "monthly_cost": 0, + "vendor": "Microsoft Corporation", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "vercel", + "name": "Vercel", + "platform": "web", + "category_id": "dev", + "vendor_id": "vercel", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_vercel", + "monthly_cost": 20, + "vendor": "Vercel Inc.", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "aerion", + "name": "Aerion", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "betterbird", + "name": "Betterbird", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "convey", + "name": "Convey", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "geary", + "name": "Geary", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gmail", + "name": "Gmail", + "platform": "web", + "category_id": "email", + "vendor_id": "google", + "sovereign": 0, + "boss": 1, + "art_slot": "outlaw_gmail", + "monthly_cost": 0, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "kanmail", + "name": "Kanmail", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mail", + "name": "Mail", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mailspring", + "name": "Mailspring", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "meli", + "name": "Meli", + "platform": "source", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "meron", + "name": "Meron", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "outlook", + "name": "Outlook", + "platform": "web", + "category_id": "email", + "vendor_id": "microsoft", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_outlook", + "monthly_cost": 0, + "vendor": "Microsoft Corporation", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "protonmail", + "name": "Proton Mail", + "platform": "web", + "category_id": "email", + "vendor_id": "proton", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_protonmail", + "monthly_cost": 5, + "vendor": "Proton AG", + "entity_type": "private", + "jurisdiction": "CH", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "thunderbird", + "name": "Thunderbird", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "thunderbird-esr", + "name": "Thunderbird ESR", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "tuta-experimental", + "name": "Tuta (Experimental)", + "platform": "linux-flatpak", + "category_id": "email", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "dropbox", + "name": "Dropbox", + "platform": "web", + "category_id": "files", + "vendor_id": "dropbox", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_dropbox", + "monthly_cost": 12, + "vendor": "Dropbox, Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "google-drive", + "name": "Google Drive", + "platform": "web", + "category_id": "files", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_google_drive", + "monthly_cost": 3, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "lazyrsync", + "name": "Lazyrsync", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nextcloud", + "name": "Nextcloud (self-hosted)", + "platform": "web", + "category_id": "files", + "vendor_id": "nextcloud-gmbh", + "sovereign": 1, + "boss": 0, + "art_slot": "ally_nextcloud", + "monthly_cost": 0, + "vendor": "Nextcloud GmbH", + "entity_type": "private", + "jurisdiction": "DE", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "ocis", + "name": "Ocis", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "onedrive", + "name": "OneDrive", + "platform": "web", + "category_id": "files", + "vendor_id": "microsoft", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_onedrive", + "monthly_cost": 7, + "vendor": "Microsoft Corporation", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "oxicloud", + "name": "OxiCloud", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "seafile", + "name": "Seafile", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "syncthing-macos", + "name": "Syncthing Macos", + "platform": "source", + "category_id": "files", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "twentythreeandme", + "name": "23andMe", + "platform": "web", + "category_id": "health", + "vendor_id": "23andme", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_23andme", + "monthly_cost": 0, + "vendor": "23andMe Holding Co.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "fitbit", + "name": "Fitbit", + "platform": "web", + "category_id": "health", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_fitbit", + "monthly_cost": 10, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "bitchat", + "name": "Bitchat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "chat", + "name": "Chat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "discord", + "name": "Discord", + "platform": "web", + "category_id": "messaging", + "vendor_id": "discord", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_discord", + "monthly_cost": 0, + "vendor": "Discord Inc.", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "flare", + "name": "Flare", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "fluxer", + "name": "Fluxer", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gnunet-messenger", + "name": "GNUnet Messenger", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gajim", + "name": "Gajim", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "kaidan", + "name": "Kaidan", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "karere", + "name": "Karere", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "lightning", + "name": "Lightning", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mumble", + "name": "Mumble", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "parla", + "name": "Parla", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "signal-desktop", + "name": "Signal Desktop", + "platform": "linux-x86_64", + "category_id": "messaging", + "vendor_id": "signal-foundation", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_signal", + "monthly_cost": 0, + "vendor": "Signal", + "entity_type": "nonprofit", + "jurisdiction": "US", + "business_model": "none", + "weighted_total": 75.9, + "grade": "B", + "policy": 85, + "infra": 58, + "weakest_dimension": "local_data_exposure", + "headline": "The strongest transport on the internet, sitting behind the weakest desktop client we have scored.", + "assessed_on": "2026-10-29" + }, + { + "id": "simplex-chat", + "name": "Simplex Chat", + "platform": "source", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "slack", + "name": "Slack", + "platform": "web", + "category_id": "messaging", + "vendor_id": "salesforce", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_slack", + "monthly_cost": 8, + "vendor": "Salesforce, Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "whatsie", + "name": "Whatsie", + "platform": "linux-flatpak", + "category_id": "messaging", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "mint", + "name": "Mint (Intuit)", + "platform": "web", + "category_id": "money", + "vendor_id": "intuit", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_mint", + "monthly_cost": 0, + "vendor": "Intuit Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "plaid", + "name": "Plaid", + "platform": "web", + "category_id": "money", + "vendor_id": "plaid", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_plaid", + "monthly_cost": 0, + "vendor": "Plaid Inc.", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "beaver-notes", + "name": "Beaver Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "evernote", + "name": "Evernote", + "platform": "web", + "category_id": "notes", + "vendor_id": "evernote", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_evernote", + "monthly_cost": 8, + "vendor": "Evernote", + "entity_type": "private", + "jurisdiction": "IT", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "notes", + "name": "Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "notesnook", + "name": "Notesnook", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "notion", + "name": "Notion", + "platform": "web", + "category_id": "notes", + "vendor_id": "notion", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_notion", + "monthly_cost": 10, + "vendor": "Notion Labs", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "obsidian-sync", + "name": "Obsidian Sync", + "platform": "web", + "category_id": "notes", + "vendor_id": "obsidian", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_obsidian_sync", + "monthly_cost": 5, + "vendor": "Dynalist Inc.", + "entity_type": "private", + "jurisdiction": "CA", + "business_model": "license", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "scrivano-for-handwritten-notes", + "name": "Scrivano for Handwritten Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "standard-notes", + "name": "Standard Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "sticky-notes", + "name": "Sticky Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "swifty-notes", + "name": "Swifty Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "trilium-notes", + "name": "Trilium Notes", + "platform": "linux-flatpak", + "category_id": "notes", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "android", + "name": "Google Android", + "platform": "web", + "category_id": "os", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_android", + "monthly_cost": 0, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "windows", + "name": "Windows 11", + "platform": "web", + "category_id": "os", + "vendor_id": "microsoft", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_windows", + "monthly_cost": 0, + "vendor": "Microsoft Corporation", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "onepassword", + "name": "1Password", + "platform": "web", + "category_id": "passwords", + "vendor_id": "1password", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_1password", + "monthly_cost": 3, + "vendor": "AgileBits Inc.", + "entity_type": "private", + "jurisdiction": "CA", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "key-rack", + "name": "Key Rack", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "lastpass", + "name": "LastPass", + "platform": "web", + "category_id": "passwords", + "vendor_id": "lastpass", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_lastpass", + "monthly_cost": 3, + "vendor": "LastPass", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nextcloud-password-client", + "name": "Nextcloud Password Client", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nitrokey-app2", + "name": "Nitrokey App2", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "onekeepass", + "name": "OneKeePass", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password", + "name": "Password", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-generator", + "name": "Password Generator", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-safe", + "name": "Password Safe", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "password-secure", + "name": "Password Secure", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "passwords-and-keys", + "name": "Passwords and Keys", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "proton-pass", + "name": "Proton Pass", + "platform": "linux-flatpak", + "category_id": "passwords", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "a-photo-tool-libre", + "name": "A Photo Tool (Libre)", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "camera", + "name": "Camera", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "ente-photos", + "name": "Ente Photos", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "gnu-image-manipulation-program", + "name": "GNU Image Manipulation Program", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "google-photos", + "name": "Google Photos", + "platform": "web", + "category_id": "photos", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_google_photos", + "monthly_cost": 3, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photocollage", + "name": "PhotoCollage", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photoqt", + "name": "PhotoQt", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photobooth", + "name": "Photobooth", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photoflare", + "name": "Photoflare", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photometry", + "name": "Photometry", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "photos", + "name": "Photos", + "platform": "linux-flatpak", + "category_id": "photos", + "vendor_id": "unknown", + "sovereign": 0, + "boss": 0, + "art_slot": null, + "monthly_cost": null, + "vendor": "Unknown vendor", + "entity_type": "unknown", + "jurisdiction": "unknown", + "business_model": "unknown", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "icloud-photos", + "name": "iCloud Photos", + "platform": "web", + "category_id": "photos", + "vendor_id": "apple", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_icloud_photos", + "monthly_cost": 3, + "vendor": "Apple Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "hardware", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "google-workspace", + "name": "Google Workspace", + "platform": "web", + "category_id": "productivity", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_google_workspace", + "monthly_cost": 14, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "microsoft-365", + "name": "Microsoft 365", + "platform": "web", + "category_id": "productivity", + "vendor_id": "microsoft", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_microsoft_365", + "monthly_cost": 13, + "vendor": "Microsoft Corporation", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "asana", + "name": "Asana", + "platform": "web", + "category_id": "project", + "vendor_id": "asana", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_asana", + "monthly_cost": 11, + "vendor": "Asana, Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "trello", + "name": "Trello", + "platform": "web", + "category_id": "project", + "vendor_id": "atlassian", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_trello", + "monthly_cost": 0, + "vendor": "Atlassian Corporation", + "entity_type": "public", + "jurisdiction": "AU", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nest", + "name": "Google Nest", + "platform": "web", + "category_id": "smarthome", + "vendor_id": "google", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_nest", + "monthly_cost": 0, + "vendor": "Google LLC", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "ring", + "name": "Ring (Amazon)", + "platform": "web", + "category_id": "smarthome", + "vendor_id": "amazon", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_ring", + "monthly_cost": 0, + "vendor": "Amazon.com, Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "facebook", + "name": "Facebook", + "platform": "web", + "category_id": "social", + "vendor_id": "meta", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_facebook", + "monthly_cost": 0, + "vendor": "Meta Platforms", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "twitter", + "name": "X (Twitter)", + "platform": "web", + "category_id": "social", + "vendor_id": "x-corp", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_twitter", + "monthly_cost": 0, + "vendor": "X Corp.", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "advertising", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "netflix", + "name": "Netflix", + "platform": "web", + "category_id": "streaming", + "vendor_id": "netflix", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_netflix", + "monthly_cost": 16, + "vendor": "Netflix, Inc.", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "teams", + "name": "Microsoft Teams", + "platform": "web", + "category_id": "video", + "vendor_id": "microsoft", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_teams", + "monthly_cost": 0, + "vendor": "Microsoft Corporation", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "otter", + "name": "Otter.ai", + "platform": "web", + "category_id": "video", + "vendor_id": "otter", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_otter", + "monthly_cost": 17, + "vendor": "Otter.ai", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "zoom", + "name": "Zoom", + "platform": "web", + "category_id": "video", + "vendor_id": "zoom", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_zoom", + "monthly_cost": 16, + "vendor": "Zoom Communications", + "entity_type": "public", + "jurisdiction": "US", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "whisper-api", + "name": "OpenAI Whisper API", + "platform": "web", + "category_id": "voice", + "vendor_id": "openai", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_whisper_api", + "monthly_cost": 0, + "vendor": "OpenAI", + "entity_type": "private", + "jurisdiction": "US", + "business_model": "mixed", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + }, + { + "id": "nordvpn", + "name": "NordVPN", + "platform": "web", + "category_id": "vpn", + "vendor_id": "nord-security", + "sovereign": 0, + "boss": 0, + "art_slot": "outlaw_nordvpn", + "monthly_cost": 4, + "vendor": "Nord Security", + "entity_type": "private", + "jurisdiction": "PA", + "business_model": "subscription", + "weighted_total": null, + "grade": null, + "policy": null, + "infra": null, + "weakest_dimension": null, + "headline": null, + "assessed_on": null + } + ], + "assessments": [ + { + "id": "A-2026-10-29-SIGNAL-DESKTOP", + "product_id": "signal-desktop", + "version": "8.36.0-alpha.1", + "source_commit": "5dad34ad5ea1a5b6229412e5c8ac0a696ff7532d", + "assessed_on": "2026-10-29", + "method_version": "btr-0.1", + "reproducible_build": 1, + "weighted_total": 75.9, + "grade": "B", + "weakest_dimension": "local_data_exposure", + "headline": "The strongest transport on the internet, sitting behind the weakest desktop client we have scored.", + "not_tested": "No live account was used. No packet capture was run (D1 to D4 not executed, this is a source audit only). Android and iOS clients not assessed. No attempt to verify the shipped .deb against a local rebuild." + } + ], + "scores": [ + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "telemetry_egress", + "value": 9, + "rationale": "Zero analytics packages across 224 dependencies. Crash reporter started with uploadToServer:false. Only signal.org, support.signal.org, updates*.signal.org and sfu.voip.signal.org appear in source. Docked one point for update checks on launch and the megaphone channel, neither of which is telemetry but both of which are vendor-initiated contact.", + "label": "Telemetry and egress", + "weight": 25 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "verifiability", + "value": 6, + "rationale": "Fully open source. Reproducible builds exist for Linux only, via Docker, and Signal labels them experimental and possibly non-functioning on public releases. macOS and Windows have none. Capped at 6 by the instrument rule.", + "label": "Verifiability", + "weight": 20 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "server_retention", + "value": 10, + "rationale": "The published answer to a 2021 federal grand jury subpoena was registration date and last connection date. No messages, contacts, groups, profile or avatar exist server-side to hand over.", + "label": "Server-side retention", + "weight": 15 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "ownership_jurisdiction", + "value": 8, + "rationale": "501(c)(3) nonprofit, EIN 82-4506840, no advertising and no data sale, so the incentive to surveil is absent rather than merely restrained. Docked for US jurisdiction and for early Open Technology Fund grant funding.", + "label": "Ownership, jurisdiction, business model", + "weight": 12 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "local_data_exposure", + "value": 5, + "rationale": "Received attachments are stored unencrypted at ~/.config/Signal/attachments.noindex (CVE-2023-24069). The SQLCipher key lives in gnome-keyring, so anything running as the user can read db.sqlite. On this operator machine that means every agent process.", + "label": "Local data exposure", + "weight": 10 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "dependency_surface", + "value": 6, + "rationale": "224 dependencies, Electron 45.0.0 pinned. Electron has produced CVEs enabling persistent backdoors in exactly this class of app. Update channel is a signed apt repo, which is the good part.", + "label": "Dependency surface", + "weight": 8 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "user_control_exit", + "value": 7, + "rationale": "Registration still requires a phone number, though usernames and phone-number privacy now reduce the exposure. No practical encrypted export of message history in a portable format.", + "label": "User control and exit", + "weight": 5 + }, + { + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "incident_record", + "value": 7, + "rationale": "Roughly 15 CVEs under the signal vendor entry. The 2023 local-storage flaws were acknowledged and fixed in 6.2.0. Signal is under continuous scrutiny, which is a better position than an untested clean record.", + "label": "Incident record", + "weight": 5 + } + ], + "evidence": [ + { + "id": 8, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "local_data_exposure", + "claim": "Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.", + "tier": 1, + "kind": "source", + "artifact": "00-Artifacts/2026/10-Oct/29/clu-big-tech-report/01-capture-sites.txt", + "sha256": null, + "observed_at": "2026-10-29T13:13:56-05:00" + }, + { + "id": 9, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "telemetry_egress", + "claim": "Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.", + "tier": 1, + "kind": "source", + "artifact": "00-Artifacts/2026/10-Oct/29/clu-big-tech-report/02-permissions.txt", + "sha256": "0a64f213f3c241c1211dec56c0018d9220651c2550a7cf44609d586e74369cf2", + "observed_at": "2026-10-29T13:13:56-05:00" + }, + { + "id": 10, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "telemetry_egress", + "claim": "Zero analytics, tracker or crash-upload dependencies across 224 packages.", + "tier": 1, + "kind": "source", + "artifact": "00-Artifacts/2026/10-Oct/29/clu-big-tech-report/05-dependencies.txt", + "sha256": null, + "observed_at": "2026-10-29T13:13:56-05:00" + }, + { + "id": 11, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "telemetry_egress", + "claim": "Only two audio capture call sites exist and both are reachable only from an explicit UI action.", + "tier": 1, + "kind": "source", + "artifact": "00-Artifacts/2026/10-Oct/29/clu-big-tech-report/03-call-path.txt", + "sha256": null, + "observed_at": "2026-10-29T13:13:56-05:00" + }, + { + "id": 12, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "verifiability", + "claim": "Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.", + "tier": 2, + "kind": "record", + "artifact": "https://github.com/signalapp/Signal-Desktop/blob/main/reproducible-builds/README.md", + "sha256": null, + "observed_at": "2026-10-29T13:13:56-05:00" + }, + { + "id": 13, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "server_retention", + "claim": "Grand jury subpoena response returned two timestamps and nothing else.", + "tier": 2, + "kind": "filing", + "artifact": "https://signal.org/bigbrother/cd-california-grand-jury/", + "sha256": null, + "observed_at": "2026-10-29T13:13:56-05:00" + }, + { + "id": 14, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "dimension_id": "ownership_jurisdiction", + "claim": "Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.", + "tier": 2, + "kind": "record", + "artifact": "https://projects.propublica.org/nonprofits/organizations/824506840", + "sha256": null, + "observed_at": "2026-10-29T13:13:56-05:00" + } + ], + "findings": [ + { + "id": 5, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "severity": "high", + "title": "Received attachments are stored unencrypted on disk", + "detail": "Every image and file received is readable by any process running as the user. On a machine running agent software under the same account, this is the most likely real-world exposure.", + "status": "by_design", + "cve": "CVE-2023-24069" + }, + { + "id": 6, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "severity": "medium", + "title": "No verified reproducible build for the Linux package", + "detail": "The source is auditable; the shipped binary is not yet provably the same artifact. Until this closes, a source audit is evidence about the repository, not about the running process.", + "status": "open", + "cve": null + }, + { + "id": 7, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "severity": "medium", + "title": "Local database key is held in the OS keyring", + "detail": "Any process running in the unlocked session can decrypt db.sqlite. There is no user-presence gate.", + "status": "accepted", + "cve": null + }, + { + "id": 8, + "assessment_id": "A-2026-10-29-SIGNAL-DESKTOP", + "severity": "low", + "title": "Registration requires a phone number", + "detail": "Mitigated by usernames and phone-number privacy, but the account root remains a phone number.", + "status": "accepted", + "cve": null + } + ] +} \ No newline at end of file diff --git a/packages/web/public/oath.html b/packages/web/public/oath.html new file mode 100644 index 0000000..9c856a8 --- /dev/null +++ b/packages/web/public/oath.html @@ -0,0 +1,183 @@ + + + + + +The Ranch Oath — bigtech.sucks + + + +
+ +
+ +

The Ranch Oath

+
Taken at bigtech.sucks · over a living database
+ +
+ +
+

I, Christian Sass, of sound mind and sober judgment, do solemnly swear, with my hand on the Book:

+ +

That every number published on this site is a number we measured, and that every measurement names the artifact it came from.

+ +

That where we could not prove a thing, we have said so in the same size type as the things we could.

+ +

That no claim here rests on our word alone.

+ +

That we would rather publish a lower number than a comfortable one.

+ +

That when we are shown to be wrong, the correction is published with its date and the original stays visible.

+
+ +
the truth, the whole truth, and nothing but the truth
+
so help me God
+ +
+
+
Sworn by
Christian Sass, Binary Ranch
+
On
—
+
By the method
—
+
Over the digest
—
+
Covering
—
+
+

CHECKING  

+
+ +

+ This page recomputes the SHA-256 of the catalog the site is serving, in your browser, and compares it to + the digest printed above. Nothing is trusted in transit. If the two disagree, the oath has been broken and + you are reading a promise that has gone stale: the data changed and the words did not. + Verification is a plain crypto.subtle.digest over catalog.json, and you can repeat it + yourself with sha256sum catalog.json. +

+ +
+ + + + diff --git a/packages/web/public/oath.json b/packages/web/public/oath.json new file mode 100644 index 0000000..57f241b --- /dev/null +++ b/packages/web/public/oath.json @@ -0,0 +1,10 @@ +{ + "digest": "5aadd709b394ab19e13a65aa21fb5182cb736f53e2b60c175abebb8dd11f1d8a", + "algorithm": "sha256", + "file": "catalog.json", + "byte_length": 79846, + "rebuilt_at": "2026-10-29T18:23:54.074Z", + "method_version": "btr-0.1", + "products": 122, + "assessed": 1 +} \ No newline at end of file