Files
lockbitchat 9e63cf65a4 v6.8.0: light theme
The palette lived as ~620 hex literals in inline styles plus a few hundred more in
the stylesheets, so there was no single thing to change. It is now 113 custom
properties in src/styles/theme.css, in two blocks.

src/scripts/theme-boot.js decides the theme before first paint — blocking, in <head>,
above the stylesheet, because a deferred script paints dark first and corrects itself.
It stores the mode ('system' | 'light' | 'dark'), never the colour it resolved to, and
stamps data-theme so an explicit choice can beat the media query. The switcher in the
header is a view onto it.

A filled accent stays the brand colour in both themes — the ink on it is near-black
either way — while an accent used as text darkens to clear 4.5:1 on white. A colour
reaches a fill by four routes (a style property, a constant, a helper argument, an SVG
source string), and tests/theme-switching.test.mjs covers all four.

The dark theme is unchanged: every colour declaration the previous build produced comes
out of this one identically once the properties are resolved.

Also: the roadmap drops its status chips on mobile, and Roadmap.jsx no longer splits a
colour with parseInt at runtime, which a var() reference cannot survive.
2026-09-04 17:38:41 -04:00

225 lines
14 KiB
HTML

<!DOCTYPE html>
<!-- Generated by scripts/build-docs.js from doc/*.md. Edits here are overwritten;
change the Markdown instead. -->
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src 'self' data:; base-uri 'none'; form-action 'none'; frame-ancestors 'none'; upgrade-insecure-requests;">
<meta http-equiv="X-Content-Type-Options" content="nosniff">
<meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin">
<title>Use policy and limitations - SecureBit.chat</title>
<meta name="description" content="SecureBit.chat is open-source software for private communication, research and education. It is provided as is, without warranty of any kind. This…">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
<link rel="canonical" href="https://securebit.chat/docs/use-policy/">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico">
<meta property="og:site_name" content="SecureBit.chat">
<meta property="og:title" content="Use policy and limitations - SecureBit.chat">
<meta property="og:description" content="SecureBit.chat is open-source software for private communication, research and education. It is provided as is, without warranty of any kind. This…">
<meta property="og:url" content="https://securebit.chat/docs/use-policy/">
<meta property="og:type" content="article">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://securebit.chat/assets/social-card.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Use policy and limitations - SecureBit.chat">
<meta name="twitter:description" content="SecureBit.chat is open-source software for private communication, research and education. It is provided as is, without warranty of any kind. This…">
<meta name="twitter:image" content="https://securebit.chat/assets/social-card.png">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": "Use policy and limitations",
"description": "SecureBit.chat is open-source software for private communication, research and education. It is provided as is, without warranty of any kind. This…",
"url": "https://securebit.chat/docs/use-policy/",
"inLanguage": "en",
"isPartOf": {
"@type": "WebSite",
"@id": "https://securebit.chat/#website"
},
"publisher": {
"@id": "https://securebit.chat/#organization"
}
}
</script>
<style>
/* These pages carry no script — that is the point of them — so the theme can only
come from the media query. There is no toggle here and no stored preference: a
reference page follows the reader's system and nothing else. The values are the
same two palettes as src/styles/theme.css, restated because these pages do not
load the app's stylesheet and are not going to start for eleven declarations. */
:root {
color-scheme: dark;
--d-ink: 255, 255, 255;
--d-bg: #0f0f11;
--d-bg-deep: #0b0b0e;
--d-code-bg: #17171c;
--d-text: #d6d6dc;
--d-heading: #f4f4f6;
--d-strong: #e8e8eb;
--d-body: #a9a9b3;
--d-pre: #c9c9d1;
--d-muted: #8a8a92;
--d-faint: #6b6b73;
--d-accent: #f0892a;
--d-accent-rgb: 240, 137, 42;
}
@media (prefers-color-scheme: light) {
:root {
color-scheme: light;
--d-ink: 0, 0, 0;
--d-bg: #fbfbfc;
--d-bg-deep: #f2f3f5;
--d-code-bg: #f2f3f5;
--d-text: #26262c;
--d-heading: #0e0e12;
--d-strong: #1b1b20;
--d-body: #43434c;
--d-pre: #2f3340;
--d-muted: #63636c;
--d-faint: #7c7c85;
--d-accent: #b05c08;
--d-accent-rgb: 176, 92, 8;
}
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--d-bg);
color: var(--d-text);
font-family: Inter, system-ui, -apple-system, "Segoe UI", sans-serif;
font-size: 16px;
line-height: 1.68;
}
.wrap { max-width: 46rem; margin: 0 auto; padding: 28px 24px 90px; }
.top {
display: flex; flex-wrap: wrap; gap: 8px 18px; align-items: baseline;
padding-bottom: 16px; margin-bottom: 40px;
border-bottom: 1px solid rgba(var(--d-ink),.08);
font-size: 13.5px;
}
.top a { color: var(--d-muted); text-decoration: none; }
.top a:hover, .top a:focus-visible { color: var(--d-accent); }
.top .brand { color: var(--d-accent); font-weight: 700; letter-spacing: .04em; }
.top .here { color: var(--d-text); margin-inline-start: auto; }
h1 { font-size: clamp(28px, 5vw, 36px); font-weight: 800; letter-spacing: -1px; line-height: 1.14; color: var(--d-heading); margin: 0 0 24px; }
h2 { font-size: 22px; font-weight: 700; letter-spacing: -.4px; color: var(--d-heading); margin: 46px 0 12px; padding-top: 14px; border-top: 1px solid rgba(var(--d-ink),.07); }
h3 { font-size: 17.5px; font-weight: 700; color: var(--d-strong); margin: 30px 0 8px; }
h4 { font-size: 15.5px; font-weight: 700; color: var(--d-strong); margin: 22px 0 6px; }
p, li { color: var(--d-body); }
p { margin: 0 0 16px; }
ul, ol { padding-inline-start: 22px; margin: 0 0 16px; }
li { margin: 5px 0; }
a { color: var(--d-accent); text-underline-offset: 2px; }
strong { color: var(--d-strong); }
code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .88em; background: var(--d-code-bg); border: 1px solid rgba(var(--d-ink),.07); border-radius: 4px; padding: 1px 5px; color: var(--d-strong); }
pre { background: var(--d-bg-deep); border: 1px solid rgba(var(--d-ink),.08); border-radius: 8px; padding: 14px 16px; overflow-x: auto; margin: 0 0 18px; }
pre code { background: none; border: 0; padding: 0; font-size: 13px; line-height: 1.62; color: var(--d-pre); }
.tablewrap { overflow-x: auto; margin: 0 0 20px; }
table { border-collapse: collapse; width: 100%; font-size: 14.5px; min-width: 30rem; }
th { text-align: start; color: var(--d-muted); font-weight: 600; font-size: 12px; letter-spacing: .08em; text-transform: uppercase; padding: 0 14px 8px 0; border-bottom: 1px solid rgba(var(--d-ink),.12); }
td { padding: 9px 14px 9px 0; border-bottom: 1px solid rgba(var(--d-ink),.06); vertical-align: top; color: var(--d-body); }
td:first-child, th:first-child { padding-inline-start: 0; }
blockquote { margin: 0 0 18px; padding: 2px 0 2px 16px; border-inline-start: 3px solid rgba(var(--d-accent-rgb),.4); color: var(--d-muted); }
hr { border: 0; border-top: 1px solid rgba(var(--d-ink),.08); margin: 34px 0; }
img { max-width: 100%; height: auto; }
a:focus-visible { outline: 2px solid var(--d-accent); outline-offset: 2px; border-radius: 2px; }
.more { margin-top: 64px; padding-top: 22px; border-top: 1px solid rgba(var(--d-ink),.08); }
.more h2 { font-size: 13px; letter-spacing: .12em; text-transform: uppercase; color: var(--d-faint); border: 0; margin: 0 0 12px; padding: 0; font-weight: 700; }
.more ul { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: 4px 24px; }
.more li { margin: 0; padding: 7px 0; border-bottom: 1px solid rgba(var(--d-ink),.05); font-size: 14.5px; }
@media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } }
</style>
</head>
<body>
<div class="wrap">
<nav class="top">
<a class="brand" href="/">SecureBit.chat</a>
<a href="/docs/">Documentation</a>
<a href="https://github.com/SecureBitChat/securebit-chat" rel="noopener">GitHub</a>
<span class="here">Use policy and limitations</span>
</nav>
<h1>Use policy and limitations</h1>
<p>SecureBit.chat is open-source software for private communication, research and
education. It is provided as is, without warranty of any kind. This document sets
out what the software can and cannot do for you, and what is expected of you when
you use it.</p>
<h2 id="what-it-protects">What it protects</h2>
<p>Message content between two verified peers, against anyone observing or
manipulating the network between them. That is a real guarantee and it is what
the design is built around.</p>
<h2 id="what-it-does-not-protect">What it does not protect</h2>
<p>Be clear about these before relying on the software for anything that matters.</p>
<p><strong>A compromised device.</strong> Malware, a hostile browser extension, a keylogger or
someone with access to an unlocked machine sees your messages as you do. No
transport encryption helps. This is the most common way private communication is
actually broken.</p>
<p><strong>The person you are talking to.</strong> They can screenshot, photograph the screen,
copy the text, or simply repeat what you said. View-once and disappearing
messages are cooperative features that a normal client honours; they are not a
technical restriction on a determined recipient.</p>
<p><strong>Verification you skipped.</strong> If you do not compare the safety code, or you
compare it over a channel the attacker controls, the software cannot tell that
someone is in the middle. The comparison must happen over something an attacker
cannot impersonate: in person, or a voice you recognise.</p>
<p><strong>Metadata, depending on your setup.</strong> A direct connection reveals your IP
address to the peer. Relay-only mode with your own TURN server prevents that, but
the relay operator can then see both addresses and the timing of traffic, though
never the content. Choose according to who you are protecting against.</p>
<p><strong>The fact that you are using it.</strong> Someone watching your network can see a
WebRTC connection and can see you loading this application. The software does not
hide its own use.</p>
<h2 id="your-responsibilities">Your responsibilities</h2>
<ul>
<li>Comply with the law where you are and with any policies that apply to you</li>
<li>Keep your device and browser current and under your control</li>
<li>Compare the safety code out of band, every time, on every new session</li>
<li>Configure TURN correctly if you need relay-only mode, and verify it works</li>
<li>Understand that endpoint compromise defeats everything above the endpoint</li>
</ul>
<h2 id="intended-use">Intended use</h2>
<p>The software is meant for legitimate private communication: journalism and source
protection, human rights work, business confidentiality, medical and legal
matters, research and education, and ordinary personal conversation that is
nobody else&#39;s business.</p>
<p>It is not meant to facilitate unlawful activity, abuse, harassment, exploitation
or harm, and being able to communicate privately does not make any of those
acceptable.</p>
<p>If you become aware of the software being used to harm someone, report it to the
appropriate authorities. Vulnerabilities in the software itself go to the
maintainers first: see <a href="https://github.com/SecureBitChat/securebit-chat/blob/main/SECURITY.md">SECURITY.md</a>.</p>
<h2 id="operational-notes">Operational notes</h2>
<p>If your threat model is serious, the software is only one part of it.</p>
<p>Use a device you control and keep it patched. Consider a separate device for
sensitive conversations. Be aware of who can see your screen and who can hear
you. Understand that a camera and microphone are attached to the machine you are
typing on. Consider what your network operator can observe, and whether a VPN or
Tor changes that in your favour or simply moves the observation point.</p>
<p>Know the law where you are. Encryption is regulated differently in different
places, and in some jurisdictions there are disclosure requirements attached to
it.</p>
<h2 id="contributing">Contributing</h2>
<p>Contributions are welcome under the same expectations. Report vulnerabilities
through the process in <a href="https://github.com/SecureBitChat/securebit-chat/blob/main/SECURITY.md">SECURITY.md</a> rather than publishing them,
and give a fix reasonable time to reach users before disclosure. Users who have
not updated yet are the ones exposed by early publication.</p>
<p>See <a href="/docs/contributing/">CONTRIBUTING.md</a> for the development workflow.</p>
<nav class="more">
<h2>More documentation</h2>
<ul>
<li><a href="/docs/">Documentation</a></li>
<li><a href="/docs/faq/">Frequently asked questions</a></li>
<li><a href="/docs/architecture/">Architecture</a></li>
<li><a href="/docs/cryptography/">Cryptography</a></li>
<li><a href="/docs/descriptor-sbq2/">SBQ2 — connection descriptor v2</a></li>
<li><a href="/docs/configuration/">Configuration</a></li>
<li><a href="/docs/calls/">Voice and video calls</a></li>
<li><a href="/docs/api/">API Notes</a></li>
<li><a href="/docs/contributing/">Contributing</a></li>
</ul>
</nav>
</div>
</body>
</html>