feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
<!doctype html>
< html lang = "en" > < head > < meta charset = "utf-8" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1" / >
< title > Signal Desktop scored 76.4 — BigTech.sucks< / title >
< style >
:root{--ink:#0d0f0e;--bone:#e8e2d4;--dim:#8a8272;--amber:#d9a441;--good:#7fae7a;--bad:#c9563f;--rule:#2a2d2a}
*{box-sizing:border-box}
body{margin:0;padding:3rem 1.25rem 7rem;background:var(--ink);color:var(--bone);
font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;font-size:15px;line-height:1.7;
-webkit-font-smoothing:antialiased}
.wrap{max-width:58rem;margin:0 auto}
nav{font-size:.72rem;letter-spacing:.18em;text-transform:uppercase;color:var(--dim);margin-bottom:3rem;display:flex;gap:1.5rem;flex-wrap:wrap}
nav a{color:var(--dim);text-decoration:none;border-bottom:1px solid transparent}
nav a:hover{color:var(--amber);border-bottom-color:var(--amber)}
h1{font-size:clamp(1.3rem,3.6vw,2.1rem);font-weight:400;line-height:1.2;margin:0 0 .6rem;letter-spacing:-.01em}
h2{font-size:.78rem;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);font-weight:400;
margin:3.5rem 0 1rem;padding-bottom:.5rem;border-bottom:1px solid var(--rule)}
.sub{color:var(--dim);font-size:.85rem;margin:0 0 2.5rem}
.score{display:flex;align-items:baseline;gap:1rem;flex-wrap:wrap;margin:0 0 .5rem}
.score .n{font-size:clamp(2.6rem,9vw,4.4rem);line-height:1;color:var(--amber);letter-spacing:-.03em}
.score .g{font-size:1rem;color:var(--dim);letter-spacing:.2em}
.lede{font-size:1.02rem;margin:1.5rem 0 0;padding-left:1rem;border-left:2px solid var(--amber);color:var(--bone)}
table{width:100%;border-collapse:collapse;font-size:.84rem;margin:0}
th{text-align:left;color:var(--dim);font-weight:400;font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;
padding:.5rem .6rem;border-bottom:1px solid var(--rule)}
td{padding:.55rem .6rem;border-bottom:1px solid #1b1e1b;vertical-align:top}
td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.bar{display:inline-block;height:7px;background:var(--amber);vertical-align:middle;border-radius:1px}
.bar.low{background:var(--bad)}
.weak td{background:rgba(201,86,63,.07)}
feat: the hook prober, and the list becomes the front door
Christian: 'drop any URL and say tell me where Big Tech has its hooks... we're
not just rating software, we're rating software as a service.'
db/hooks/probe.mjs answers that from public records only: DNS, MX, SPF, ASN via
Team Cymru, HTTP headers, and the third-party hosts named in the page's own HTML.
Nothing is scanned. If a site tells the world it sends mail through Google, this
reads it.
Verified live, 2026-10-29:
parler.com -> AS16509 AMAZON, plus Microsoft email, plus Vercel
netflix.com -> AS40027 NETFLIX (their own Open Connect edge), NOT AWS
signal.org -> Cloudflare CDN, Google touchpoints
bigtech.sucks-> AS16509 AMAZON (GoDaddy parking sits on AWS)
That netflix result is the important one. The front door is Netflix's own network;
the catalog and user data are in AWS. Edge ASN is not backend custody, and the tool
says so in its own header comment rather than pretending otherwise.
Also:
- The list is now the front door (public/index.html, generated from the DB).
The game moved to /game.html and keeps working, ready for its own subdomain.
- suggestion table + v_requested view: anyone can ask for a product to be rated,
no account, no email. Optional contact. Addresses are salted-hashed, never stored.
- POST /api/suggest on the existing server package, with a graceful fallback on the
static page to a Forgejo issue so requests are never lost when the server is down.
2026-10-29 17:23:11 -05:00
tr.cathead td{background:#151815;color:var(--dim);font-size:.7rem;letter-spacing:.18em;
text-transform:uppercase;padding:.9rem .6rem .45rem;border-bottom:1px solid var(--rule)}
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
.sev{font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;padding:.1rem .4rem;border:1px solid var(--rule)}
.sev.high{border-color:var(--bad);color:var(--bad)}
.sev.medium{border-color:var(--amber);color:var(--amber)}
.sev.low,.sev.info{color:var(--dim)}
.tier{color:var(--dim);font-size:.72rem}
a{color:var(--amber);text-decoration:none;border-bottom:1px solid rgba(217,164,65,.35)}
a:hover{border-bottom-color:var(--amber)}
.note{color:var(--dim);font-size:.8rem;line-height:1.65;margin:1rem 0 0}
pre{overflow-x:auto;background:#111413;border:1px solid var(--rule);padding:1rem;font-size:.76rem;line-height:1.5;color:var(--bone)}
code{font-size:.86em;color:var(--bone)}
fix(signal): the uninstall does not uninstall
Observed on the operator's machine 2026-10-30 while reinstalling to put the app
to use. Four months after the package was purged, a fresh install found
~/.config/Signal/sql/db.sqlite (54,214,656 bytes, mtime 2026-06-21), tried to
open it, and aborted before the linking screen:
MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL
MainSQL: migrateDatabase: Migration without cipher change failed
sql.initialize was unsuccessful; returning early
The SQLCipher key in config.json no longer resolved. The UI named nothing and
offered only 'Delete data and restart', which discards the history. Moving the
config directory aside fixes it; nothing in the product says so.
Recorded as a medium finding, status open. The score does not move: 76.4 / B.
local_data_exposure was already 5 for exactly this behaviour, and a finding is
evidence, not a point. What changes is that the number now has a receipt instead
of a rationale.
Artifact: Servetus/00-Artifacts/2026/10-Oct/30/clu-signal-startup-failure/
main.log.excerpt - the failing run, verbatim
00-provenance.txt - package version, file sizes, sha256 of the retained db
Retained state moved to ~/Signal-backup-2026-10-30-0026, not deleted.
2026-10-30 00:31:21 -05:00
footer{margin-top:4rem;padding:1.25rem 0 2rem;border-top:1px dashed var(--rule);color:var(--dim);font-size:.78rem}
footer a{color:var(--dim);border-bottom:1px solid var(--rule)}
footer a:hover{color:var(--amber);border-color:var(--amber)}
.frow{display:flex;justify-content:space-between;gap:2rem;flex-wrap:wrap;margin-bottom:.6rem}
.frow>div{flex:1 1 22rem;min-width:16rem}
.fmeta{font-size:.72rem;letter-spacing:.02em}
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
< / style > < / head >
< body > < div class = "wrap" > < nav >
feat: the hook prober, and the list becomes the front door
Christian: 'drop any URL and say tell me where Big Tech has its hooks... we're
not just rating software, we're rating software as a service.'
db/hooks/probe.mjs answers that from public records only: DNS, MX, SPF, ASN via
Team Cymru, HTTP headers, and the third-party hosts named in the page's own HTML.
Nothing is scanned. If a site tells the world it sends mail through Google, this
reads it.
Verified live, 2026-10-29:
parler.com -> AS16509 AMAZON, plus Microsoft email, plus Vercel
netflix.com -> AS40027 NETFLIX (their own Open Connect edge), NOT AWS
signal.org -> Cloudflare CDN, Google touchpoints
bigtech.sucks-> AS16509 AMAZON (GoDaddy parking sits on AWS)
That netflix result is the important one. The front door is Netflix's own network;
the catalog and user data are in AWS. Edge ASN is not backend custody, and the tool
says so in its own header comment rather than pretending otherwise.
Also:
- The list is now the front door (public/index.html, generated from the DB).
The game moved to /game.html and keeps working, ready for its own subdomain.
- suggestion table + v_requested view: anyone can ask for a product to be rated,
no account, no email. Optional contact. Addresses are salted-hashed, never stored.
- POST /api/suggest on the existing server package, with a graceful fallback on the
static page to a Forgejo issue so requests are never lost when the server is down.
2026-10-29 17:23:11 -05:00
< a href = "/" > The list< / a >
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
< a href = "/method.html" > Method< / a >
feat: the rating badge, served from our domain and regenerated from the record
Christian: 'I want them to put the BigTech.Sucks rating badge on their site.
It should be marketing for them.'
A sticker anyone can copy is worthless, so it is not a sticker.
- badge/<product>.svg is generated from the assessment row on every build.
Score, grade and date are never typed by a human.
- Served from bigtech.sucks. A copy pasted onto a vendor's own server is not a
badge and its link will not resolve. The domain is the signature.
- Regenerated every build, so improving earns a better badge without asking and
regressing loses it without warning.
- The SVG carries the record id, version and method in a comment, so a real
badge can be traced back to one assessment.
badges.html publishes the rules: free forever, only rated products, no badge as
a favour, and misuse called out publicly. Free matters, because charging for it
would make it worthless to both sides: marketing for the vendor, receipts for
their customer.
Also rewrote the write pass to emit report + badge per assessment in one loop, so
they can never drift apart.
2026-10-29 17:24:33 -05:00
< a href = "/badges.html" > Badge< / a >
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
< a href = "/oath.html" > The Oath< / a >
feat: the hook prober, and the list becomes the front door
Christian: 'drop any URL and say tell me where Big Tech has its hooks... we're
not just rating software, we're rating software as a service.'
db/hooks/probe.mjs answers that from public records only: DNS, MX, SPF, ASN via
Team Cymru, HTTP headers, and the third-party hosts named in the page's own HTML.
Nothing is scanned. If a site tells the world it sends mail through Google, this
reads it.
Verified live, 2026-10-29:
parler.com -> AS16509 AMAZON, plus Microsoft email, plus Vercel
netflix.com -> AS40027 NETFLIX (their own Open Connect edge), NOT AWS
signal.org -> Cloudflare CDN, Google touchpoints
bigtech.sucks-> AS16509 AMAZON (GoDaddy parking sits on AWS)
That netflix result is the important one. The front door is Netflix's own network;
the catalog and user data are in AWS. Edge ASN is not backend custody, and the tool
says so in its own header comment rather than pretending otherwise.
Also:
- The list is now the front door (public/index.html, generated from the DB).
The game moved to /game.html and keeps working, ready for its own subdomain.
- suggestion table + v_requested view: anyone can ask for a product to be rated,
no account, no email. Optional contact. Addresses are salted-hashed, never stored.
- POST /api/suggest on the existing server package, with a graceful fallback on the
static page to a Forgejo issue so requests are never lost when the server is down.
2026-10-29 17:23:11 -05:00
< a href = "/game.html" > Game< / a >
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
< a href = "https://forge.binaryranch.com/bunkhouse/bigtech-sucks" > Source< / a >
< / nav >
< h1 > Signal Desktop < span style = "color:var(--dim);font-size:.55em" > 8.36.0-alpha.1 on < / span > < / h1 >
< p class = "sub" > Assessed 2026-10-29 by CLU, Binary Ranch. Source commit
< code > 5dad34ad5ea1< / code > . Method btr-0.1.< / p >
< div class = "score" > < span class = "n" > 76.4< / span > < span class = "g" > / 100 GRADE B< / span > < / div >
< p class = "lede" > The strongest transport on the internet, sitting behind the weakest desktop client we have scored.< / p >
< h2 > The score< / h2 >
< table >
< tr > < th > Dimension< / th > < th class = "num" style = "text-align:right" > Weight< / th > < th class = "num" style = "text-align:right" > Score< / th > < th > < / th > < / tr >
< tr class = "" >
< td > Telemetry and egress< / td >
< td class = "num" > 25< / td >
< td class = "num" > 9< / td >
< td style = "width:150px" > < span class = "bar" style = "width:126px" > < / span > < / td >
< / tr > < tr class = "" >
< td > Verifiability< / td >
< td class = "num" > 20< / td >
< td class = "num" > 6< / td >
< td style = "width:150px" > < span class = "bar" style = "width:84px" > < / span > < / td >
< / tr > < tr class = "" >
< td > Server-side retention< / td >
< td class = "num" > 15< / td >
< td class = "num" > 10< / td >
< td style = "width:150px" > < span class = "bar" style = "width:140px" > < / span > < / td >
< / tr > < tr class = "" >
< td > Ownership, jurisdiction, business model< / td >
< td class = "num" > 12< / td >
< td class = "num" > 8< / td >
< td style = "width:150px" > < span class = "bar" style = "width:112px" > < / span > < / td >
< / tr > < tr class = "weak" >
< td > Local data exposure< / td >
< td class = "num" > 10< / td >
< td class = "num" > 5< / td >
< td style = "width:150px" > < span class = "bar low" style = "width:70px" > < / span > < / td >
< / tr > < tr class = "" >
< td > Dependency surface< / td >
< td class = "num" > 8< / td >
< td class = "num" > 6< / td >
< td style = "width:150px" > < span class = "bar" style = "width:84px" > < / span > < / td >
< / tr > < tr class = "" >
< td > User control and exit< / td >
< td class = "num" > 5< / td >
< td class = "num" > 7< / td >
< td style = "width:150px" > < span class = "bar" style = "width:98px" > < / span > < / td >
< / tr > < tr class = "" >
< td > Incident record< / td >
< td class = "num" > 5< / td >
< td class = "num" > 8< / td >
< td style = "width:150px" > < span class = "bar" style = "width:112px" > < / span > < / td >
< / tr >
< / table >
< p class = "note" > The weighted average is not the headline. < strong > The weakest dimension is< / strong > , because a
high average with one bad rung is an average that hides the thing that will hurt you.< / p >
< h2 > Findings< / h2 >
< table >
< tr > < th > Severity< / th > < th > Finding< / th > < th > Status< / th > < / tr >
< tr >
< td > < span class = "sev high" > high< / span > < / td >
< td > Received attachments are stored unencrypted on disk < span class = "tier" > CVE-2023-24069< / span > < / td >
< td class = "tier" > by_design< / td >
< / tr > < tr >
< td > < span class = "sev medium" > medium< / span > < / td >
< td > No verified reproducible build for the Linux package< / td >
< td class = "tier" > open< / td >
< / tr > < tr >
< td > < span class = "sev medium" > medium< / span > < / td >
< td > Local database key is held in the OS keyring< / td >
< td class = "tier" > accepted< / td >
fix(signal): the uninstall does not uninstall
Observed on the operator's machine 2026-10-30 while reinstalling to put the app
to use. Four months after the package was purged, a fresh install found
~/.config/Signal/sql/db.sqlite (54,214,656 bytes, mtime 2026-06-21), tried to
open it, and aborted before the linking screen:
MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL
MainSQL: migrateDatabase: Migration without cipher change failed
sql.initialize was unsuccessful; returning early
The SQLCipher key in config.json no longer resolved. The UI named nothing and
offered only 'Delete data and restart', which discards the history. Moving the
config directory aside fixes it; nothing in the product says so.
Recorded as a medium finding, status open. The score does not move: 76.4 / B.
local_data_exposure was already 5 for exactly this behaviour, and a finding is
evidence, not a point. What changes is that the number now has a receipt instead
of a rationale.
Artifact: Servetus/00-Artifacts/2026/10-Oct/30/clu-signal-startup-failure/
main.log.excerpt - the failing run, verbatim
00-provenance.txt - package version, file sizes, sha256 of the retained db
Retained state moved to ~/Signal-backup-2026-10-30-0026, not deleted.
2026-10-30 00:31:21 -05:00
< / tr > < tr >
< td > < span class = "sev medium" > medium< / span > < / td >
< td > Purging the package leaves the database behind, and the next install then fails to start< / td >
< td class = "tier" > open< / td >
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
< / tr > < tr >
< td > < span class = "sev low" > low< / span > < / td >
< td > Registration requires a phone number< / td >
< td class = "tier" > accepted< / td >
< / tr >
< / table >
< h2 > Evidence< / h2 >
< table >
< tr > < th > Claim< / th > < th > Tier< / th > < th > Artifact< / th > < / tr >
< tr >
< td > Attachments are stored unencrypted on the filesystem; the SQLCipher key is held by the OS keyring.< / td >
< td class = "tier" > T1< / td >
< td > < code > 01-capture-sites.txt< / code > < / td >
< / tr > < tr >
< td > Electron media permission defaults to false and audio is denied unless the user has enabled mediaPermissions.< / td >
< td class = "tier" > T1< / td >
< td > < code > 02-permissions.txt< / code > < / td >
< / tr > < tr >
< td > Zero analytics, tracker or crash-upload dependencies across 224 packages.< / td >
< td class = "tier" > T1< / td >
< td > < code > 05-dependencies.txt< / code > < / td >
< / tr > < tr >
< td > Only two audio capture call sites exist and both are reachable only from an explicit UI action.< / td >
< td class = "tier" > T1< / td >
< td > < code > 03-call-path.txt< / code > < / td >
< / tr > < tr >
< td > Signal states reproducible builds for macOS and Windows are not available, and the Linux build is experimental.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://github.com/signalapp/Signal-Desktop/blob/main/reproducible-builds/README.md" > source< / a > < / td >
< / tr > < tr >
< td > Grand jury subpoena response returned two timestamps and nothing else.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://signal.org/bigbrother/cd-california-grand-jury/" > source< / a > < / td >
< / tr > < tr >
< td > Signal Technology Foundation is a 501(c)(3) with EIN 82-4506840.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://projects.propublica.org/nonprofits/organizations/824506840" > source< / a > < / td >
< / tr > < tr >
< td > FBI and CISA PSA260626: Russian intelligence compromised individual Signal accounts via phishing and Backup Recovery Key theft, but NOT the encryption or the application itself.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://www.ic3.gov/PSA/2026/PSA260626" > source< / a > < / td >
< / tr > < tr >
< td > Signal statement, 28 April 2026: " Signal was not hacked, in that our encryption, infrastructure, and the integrity of the app code was not compromised." Additional linkage confirmations shipped 13 May 2026.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://x.com/signalapp/status/2048866663580246302" > source< / a > < / td >
< / tr > < tr >
< td > Open Technology Fund funded Open Whisper Systems $2,955,000 across 2013 to 2016, itemised on OTF own project page. This is the factual core under the " US government funded Signal" claim, and it is already reflected in the two points docked on this dimension.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://www.opentech.fund/projects-we-support/supported-projects/signal-open-whisper-systems" > source< / a > < / td >
< / tr > < tr >
< td > Signal publicly committed to leaving the UK (2023, Online Safety Act) and Sweden (Feb 2025) rather than weaken encryption. A vendor that threatens to lose a market is behaving incompatibly with a secret backdoor.< / td >
< td class = "tier" > T2< / td >
< td > < a href = "https://www.infosecurity-magazine.com/news/signal-exit-sweden-government/" > source< / a > < / td >
< / tr >
< / table >
< p class = "note" > Tier 1 is something we observed and saved. Tier 2 is a primary source anyone can open.
Tier 3 is credible second-hand. Tier 4 is a claim with no artifact, and < strong > no tier 4 claim is
allowed to move a score< / strong > .< / p >
< h2 > What was not tested< / h2 >
< p class = "note" > 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.< / p >
< h2 > Check it yourself< / h2 >
< p class = "note" > The audit script that produced the tier 1 rows is public and re-runnable.
The database that holds this score is public. The build refuses to pass if the total does not
recompute from these weights and these scores.< / p >
< pre > git clone ssh://git@forge.binaryranch.com:2222/bunkhouse/bigtech-sucks.git
cd bigtech-sucks & & npm run db:build< / pre >
fix(signal): the uninstall does not uninstall
Observed on the operator's machine 2026-10-30 while reinstalling to put the app
to use. Four months after the package was purged, a fresh install found
~/.config/Signal/sql/db.sqlite (54,214,656 bytes, mtime 2026-06-21), tried to
open it, and aborted before the linking screen:
MainSQL: sqlite(SQLITE_NOTADB): file is not a database in PRAGMA journal_mode = WAL
MainSQL: migrateDatabase: Migration without cipher change failed
sql.initialize was unsuccessful; returning early
The SQLCipher key in config.json no longer resolved. The UI named nothing and
offered only 'Delete data and restart', which discards the history. Moving the
config directory aside fixes it; nothing in the product says so.
Recorded as a medium finding, status open. The score does not move: 76.4 / B.
local_data_exposure was already 5 for exactly this behaviour, and a finding is
evidence, not a point. What changes is that the number now has a receipt instead
of a rationale.
Artifact: Servetus/00-Artifacts/2026/10-Oct/30/clu-signal-startup-failure/
main.log.excerpt - the failing run, verbatim
00-provenance.txt - package version, file sizes, sha256 of the retained db
Retained state moved to ~/Signal-backup-2026-10-30-0026, not deleted.
2026-10-30 00:31:21 -05:00
< footer >
< div class = "frow" >
< div >
Built in the open at the
< a href = "https://forge.binaryranch.com/bunkhouse" > Binary Ranch Bunkhouse< / a > .
Every repository there is one you can read, clone, and leave with.
< / div >
< div class = "fmeta" >
Generated from < code > bigtech.db< / code > on 2026-10-30.
Method btr-0.1. Every number recomputes from its evidence or the build fails.
< / div >
< / div >
< div class = "frow" >
< div class = "fmeta" >
< a href = "https://forge.binaryranch.com/bunkhouse/bigtech-sucks" > Source for this site< / a > ·
< a href = "https://forge.binaryranch.com/bunkhouse/vitals" > vitals< / a > ·
< a href = "https://forge.binaryranch.com/bunkhouse/otter-dark-mode" > otter-dark-mode< / a >
< / div >
< div class = "fmeta" >
< a href = "https://binaryranch.com" > Binary Ranch< / a > · Venice, Florida
< / div >
< / div >
< / footer >
feat: render the public site from the database
The site is now a view over bigtech.db, not a hand-maintained set of pages.
- packages/core/db/render.mjs emits report/<product>.html and method.html into
web/public, so Vite copies them into the deployable bundle. Re-running
db:build regenerates them from whatever the database currently says.
- The report page leads with the score, then the dimension table with the
weakest rung highlighted, then findings, then the evidence table with its
tiers, then what was not tested, then how to clone and re-run the audit.
- The method page publishes the eight weights, the evidence tiers, both caps
(reproducible builds and the closed-source ladder), the D1-D4 dynamic test,
and a plain section on what the method cannot do.
Deployable bundle is 372K: the game, the method, the oath, the catalog and the
report. No server-side code, so it can sit on a Caddy static root and be nobody
else's problem to host.
Rendered 1 report page + method.html. All instrument checks still pass.
2026-10-29 16:24:13 -05:00
< / div > < / body > < / html >