Files

359 lines
24 KiB
HTML
Raw Permalink Normal View History

<!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>Frequently asked questions - SecureBit.chat</title>
<meta name="description" content="Short answers to what people ask before they trust the software with anything. Every one of them is drawn from the documents linked alongside it, so if an…">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
<link rel="canonical" href="https://securebit.chat/docs/faq/">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico">
<meta property="og:site_name" content="SecureBit.chat">
<meta property="og:title" content="Frequently asked questions - SecureBit.chat">
<meta property="og:description" content="Short answers to what people ask before they trust the software with anything. Every one of them is drawn from the documents linked alongside it, so if an…">
<meta property="og:url" content="https://securebit.chat/docs/faq/">
<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="Frequently asked questions - SecureBit.chat">
<meta name="twitter:description" content="Short answers to what people ask before they trust the software with anything. Every one of them is drawn from the documents linked alongside it, so if an…">
<meta name="twitter:image" content="https://securebit.chat/assets/social-card.png">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"url": "https://securebit.chat/docs/faq/",
"inLanguage": "en",
"isPartOf": {
"@type": "WebSite",
"@id": "https://securebit.chat/#website"
},
"publisher": {
"@id": "https://securebit.chat/#organization"
},
"mainEntity": [
{
"@type": "Question",
"name": "Do I need an account?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>No. There is nothing to register, no email address, no phone number and no password. You open the page, your browser generates a key pair, and you send the resulting invitation to the person you want to talk to. Nothing about you is stored anywhere, because there is nowhere to store it.</p>"
}
},
{
"@type": "Question",
"name": "Where are my messages stored?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Nowhere. Messages travel directly between the two browsers over WebRTC and are held only in the memory of the two devices taking part. There is no message server, no database and no backup — which also means a conversation you close is gone, and nobody can hand it over later because nobody has it.</p>"
}
},
{
"@type": "Question",
"name": "Is there a server in the middle?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>No, and there is not even a signalling service. The offer and the answer that set up a connection are moved between the two people by whatever channel they already have: a QR code, a pasted block of text, a link. That is the unusual part of the design and it shapes everything else — the out-of-band channel is assumed to be readable and rewritable by an attacker, which is exactly why the safety code comparison exists. See <a href=\"/docs/architecture/\">ARCHITECTURE.md</a>.</p> <p>A TURN server, if you use one, relays encrypted packets. It never sees message content, and it is optional.</p>"
}
},
{
"@type": "Question",
"name": "What encryption does SecureBit.chat use?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Key exchange is ECDH on P-384, message payloads are AES-256-GCM, and messages carry ECDSA signatures with full ASN.1 validation of every key that arrives. Session keys rotate continuously through a Double Ratchet and are discarded after use, so a key recovered later cannot open earlier conversations. The transport underneath is DTLS, as WebRTC requires. Everything runs on the browser&#39;s Web Crypto API rather than hand-rolled primitives — <a href=\"/docs/cryptography/\">CRYPTOGRAPHY.md</a> sets out the key schedule in full.</p>"
}
},
{
"@type": "Question",
"name": "What is the safety code, and why do I have to compare it?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>It is a short code derived from both sides of the completed key exchange. If the two of you see the same code, nobody sat in the middle of the exchange; if someone did, the codes differ and the session is not what it claims to be.</p> <p>The comparison has to happen over a channel an attacker cannot impersonate — in person, or a voice you recognise. Comparing it inside the chat itself proves nothing. It is enforced rather than merely displayed: until both sides confirm, reconnection signalling, call setup, delivery receipts and incoming file transfers are all refused, and three incorrect entries end the session.</p>"
}
},
{
"@type": "Question",
"name": "Is it free, and can I read the source?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Yes to both. The software is free, has no paid tier and no upsell, and is published under the MIT licence at <a href=\"https://github.com/SecureBitChat/securebit-chat\">github.com/SecureBitChat/securebit-chat</a>. Nothing is minified beyond recognition or hidden behind a build you cannot reproduce; <a href=\"/docs/configuration/\">CONFIGURATION.md</a> describes building and running it yourself.</p>"
}
},
{
"@type": "Question",
"name": "Do I have to install anything?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>No. It runs in any current browser with WebRTC and the Web Crypto API. It can be installed as a Progressive Web App if you would rather have an icon, and there are native desktop builds for Windows, macOS and Linux. Calls are not yet available on the Linux desktop build; they work everywhere else, including in the browser.</p>"
}
},
{
"@type": "Question",
"name": "Can the person I am talking to see my IP address?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>On a default connection, yes — a direct WebRTC path means each side learns the other&#39;s address. That is how a direct connection works, not a flaw in this implementation.</p> <p>Relay-only mode prevents it: it sets <code>iceTransportPolicy: &quot;relay&quot;</code>, so all traffic goes through a TURN server and the peers see only the relay. The trade is that the relay operator can then see both addresses and the timing of the traffic, though never the content. Choose according to who you are protecting against.</p>"
}
},
{
"@type": "Question",
"name": "Do I need my own TURN server?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Only for relay-only mode, or when a direct path cannot be established at all. Public STUN defaults are built in and are enough for most connections. You can paste your own STUN and TURN servers under Advanced network settings; they are validated against an allowlist of schemes, hosts and transports before they reach the connection.</p> <p>One thing worth knowing: any TURN credential sent to a browser is public by definition, because the browser has to read it. Apply quotas on the TURN server rather than relying on the credential staying secret. <a href=\"/docs/configuration/\">CONFIGURATION.md</a> covers the setup and how to verify it works.</p>"
}
},
{
"@type": "Question",
"name": "Can I send files, and how large?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Yes, over the same encrypted channel, with a per-file AES-GCM key and a SHA-256 integrity check. The receiver sees name, size and type and has to accept before any buffer is allocated or a single chunk is sent.</p> <p>The ceiling is 100 MB per file, with lower limits by category: images 25 MB, PDFs 50 MB, text 10 MB, archives 100 MB, audio 20 MB. Executable and scriptable formats are blocked outright — <code>.exe</code>, <code>.js</code>, <code>.html</code>, <code>.svg</code> and others — and the file extension, not the browser-supplied MIME type, is the boundary that decides.</p>"
}
},
{
"@type": "Question",
"name": "Are group chats and calls supported?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Yes. Encrypted voice and video calls shipped in early 2026, and group communications are current work. Group sessions keep the same properties as one-to-one ones: no server holds the conversation, and members verify each other. <a href=\"/docs/calls/\">CALLS.md</a> covers codec choices and how the connection adapts to a poor network.</p>"
}
},
{
"@type": "Question",
"name": "Is there a mobile app?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Not yet. The web application works in mobile browsers today and can be installed to the home screen as a PWA. Native iOS and Android builds are planned; the roadmap on the front page lists where they sit relative to the rest of the work.</p>"
}
},
{
"@type": "Question",
"name": "What does it not protect against?",
"acceptedAnswer": {
"@type": "Answer",
"text": "<p>Read <a href=\"/docs/use-policy/\">USE-POLICY.md</a> before relying on this for anything that matters. In short: a compromised device sees your messages exactly as you do, and no transport encryption helps. The person you are talking to can screenshot or repeat what you said. A safety code you skipped protects nothing. And someone watching your network can see that you are using a WebRTC application, even though they cannot see what you send — the software does not hide its own use.</p>"
}
}
]
}
</script>
<style>
2026-09-04 17:38:41 -04:00
/* 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;
2026-09-04 17:38:41 -04:00
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;
2026-09-04 17:38:41 -04:00
border-bottom: 1px solid rgba(var(--d-ink),.08);
font-size: 13.5px;
}
2026-09-04 17:38:41 -04:00
.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; }
2026-09-04 17:38:41 -04:00
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; }
2026-09-04 17:38:41 -04:00
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; }
2026-09-04 17:38:41 -04:00
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; }
2026-09-04 17:38:41 -04:00
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; }
2026-09-04 17:38:41 -04:00
.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">Frequently asked questions</span>
</nav>
<h1>Frequently asked questions</h1>
<p>Short answers to what people ask before they trust the software with anything.
Every one of them is drawn from the documents linked alongside it, so if an answer
here and a document disagree, the document is right and this page is stale.</p>
<h2 id="do-i-need-an-account">Do I need an account?</h2>
<p>No. There is nothing to register, no email address, no phone number and no
password. You open the page, your browser generates a key pair, and you send the
resulting invitation to the person you want to talk to. Nothing about you is
stored anywhere, because there is nowhere to store it.</p>
<h2 id="where-are-my-messages-stored">Where are my messages stored?</h2>
<p>Nowhere. Messages travel directly between the two browsers over WebRTC and are
held only in the memory of the two devices taking part. There is no message
server, no database and no backup — which also means a conversation you close is
gone, and nobody can hand it over later because nobody has it.</p>
<h2 id="is-there-a-server-in-the-middle">Is there a server in the middle?</h2>
<p>No, and there is not even a signalling service. The offer and the answer that set
up a connection are moved between the two people by whatever channel they already
have: a QR code, a pasted block of text, a link. That is the unusual part of the
design and it shapes everything else — the out-of-band channel is assumed to be
readable and rewritable by an attacker, which is exactly why the safety code
comparison exists. See <a href="/docs/architecture/">ARCHITECTURE.md</a>.</p>
<p>A TURN server, if you use one, relays encrypted packets. It never sees message
content, and it is optional.</p>
<h2 id="what-encryption-does-securebitchat-use">What encryption does SecureBit.chat use?</h2>
<p>Key exchange is ECDH on P-384, message payloads are AES-256-GCM, and messages
carry ECDSA signatures with full ASN.1 validation of every key that arrives.
Session keys rotate continuously through a Double Ratchet and are discarded after
use, so a key recovered later cannot open earlier conversations. The transport
underneath is DTLS, as WebRTC requires. Everything runs on the browser&#39;s Web
Crypto API rather than hand-rolled primitives — <a href="/docs/cryptography/">CRYPTOGRAPHY.md</a>
sets out the key schedule in full.</p>
<h2 id="what-is-the-safety-code-and-why-do-i-have-to-compare-it">What is the safety code, and why do I have to compare it?</h2>
<p>It is a short code derived from both sides of the completed key exchange. If the
two of you see the same code, nobody sat in the middle of the exchange; if someone
did, the codes differ and the session is not what it claims to be.</p>
<p>The comparison has to happen over a channel an attacker cannot impersonate — in
person, or a voice you recognise. Comparing it inside the chat itself proves
nothing. It is enforced rather than merely displayed: until both sides confirm,
reconnection signalling, call setup, delivery receipts and incoming file
transfers are all refused, and three incorrect entries end the session.</p>
<h2 id="is-it-free-and-can-i-read-the-source">Is it free, and can I read the source?</h2>
<p>Yes to both. The software is free, has no paid tier and no upsell, and is
published under the MIT licence at
<a href="https://github.com/SecureBitChat/securebit-chat">github.com/SecureBitChat/securebit-chat</a>.
Nothing is minified beyond recognition or hidden behind a build you cannot
reproduce; <a href="/docs/configuration/">CONFIGURATION.md</a> describes building and running it
yourself.</p>
<h2 id="do-i-have-to-install-anything">Do I have to install anything?</h2>
<p>No. It runs in any current browser with WebRTC and the Web Crypto API. It can be
installed as a Progressive Web App if you would rather have an icon, and there are
native desktop builds for Windows, macOS and Linux. Calls are not yet available on
the Linux desktop build; they work everywhere else, including in the browser.</p>
<h2 id="can-the-person-i-am-talking-to-see-my-ip-address">Can the person I am talking to see my IP address?</h2>
<p>On a default connection, yes — a direct WebRTC path means each side learns the
other&#39;s address. That is how a direct connection works, not a flaw in this
implementation.</p>
<p>Relay-only mode prevents it: it sets <code>iceTransportPolicy: &quot;relay&quot;</code>, so all traffic
goes through a TURN server and the peers see only the relay. The trade is that the
relay operator can then see both addresses and the timing of the traffic, though
never the content. Choose according to who you are protecting against.</p>
<h2 id="do-i-need-my-own-turn-server">Do I need my own TURN server?</h2>
<p>Only for relay-only mode, or when a direct path cannot be established at all.
Public STUN defaults are built in and are enough for most connections. You can
paste your own STUN and TURN servers under Advanced network settings; they are
validated against an allowlist of schemes, hosts and transports before they reach
the connection.</p>
<p>One thing worth knowing: any TURN credential sent to a browser is public by
definition, because the browser has to read it. Apply quotas on the TURN server
rather than relying on the credential staying secret. <a href="/docs/configuration/">CONFIGURATION.md</a>
covers the setup and how to verify it works.</p>
<h2 id="can-i-send-files-and-how-large">Can I send files, and how large?</h2>
<p>Yes, over the same encrypted channel, with a per-file AES-GCM key and a SHA-256
integrity check. The receiver sees name, size and type and has to accept before
any buffer is allocated or a single chunk is sent.</p>
<p>The ceiling is 100 MB per file, with lower limits by category: images 25 MB, PDFs
50 MB, text 10 MB, archives 100 MB, audio 20 MB. Executable and scriptable formats
are blocked outright — <code>.exe</code>, <code>.js</code>, <code>.html</code>, <code>.svg</code> and others — and the file
extension, not the browser-supplied MIME type, is the boundary that decides.</p>
<h2 id="are-group-chats-and-calls-supported">Are group chats and calls supported?</h2>
<p>Yes. Encrypted voice and video calls shipped in early 2026, and group
communications are current work. Group sessions keep the same properties as
one-to-one ones: no server holds the conversation, and members verify each other.
<a href="/docs/calls/">CALLS.md</a> covers codec choices and how the connection adapts to a poor
network.</p>
<h2 id="is-there-a-mobile-app">Is there a mobile app?</h2>
<p>Not yet. The web application works in mobile browsers today and can be installed
to the home screen as a PWA. Native iOS and Android builds are planned; the
roadmap on the front page lists where they sit relative to the rest of the work.</p>
<h2 id="what-does-it-not-protect-against">What does it not protect against?</h2>
<p>Read <a href="/docs/use-policy/">USE-POLICY.md</a> before relying on this for anything that
matters. In short: a compromised device sees your messages exactly as you do, and
no transport encryption helps. The person you are talking to can screenshot or
repeat what you said. A safety code you skipped protects nothing. And someone
watching your network can see that you are using a WebRTC application, even though
they cannot see what you send — the software does not hide its own use.</p>
<nav class="more">
<h2>More documentation</h2>
<ul>
<li><a href="/docs/">Documentation</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>
<li><a href="/docs/use-policy/">Use policy and limitations</a></li>
</ul>
</nav>
</div>
</body>
</html>