Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ <h2>Energy infrastructure you can own.</h2>
<div class="footer-links">
<div><span>Project</span><a href="https://github.com/srcfl/ftw">GitHub</a><a href="https://github.com/srcfl/ftw/releases">Releases</a><a href="https://github.com/srcfl/ftw#documentation">Documentation</a><a href="https://srcfl.github.io/device-drivers/">Device catalog</a><a href="https://github.com/srcfl/ftw/blob/master/docs/roadmap.md">Roadmap</a><a href="https://github.com/srcfl/ftw/blob/master/VISION.md">Vision</a></div>
<div><span>Community</span><a href="https://discord.gg/25xcBzQaux">Discord</a><a href="https://github.com/srcfl/ftw/issues">Issues</a><a href="https://github.com/srcfl/ftw/blob/master/CONTRIBUTING.md">Contribute</a></div>
<div><span>Terms</span><a href="https://github.com/srcfl/ftw/blob/master/LICENSE">AGPLv3</a><a href="https://github.com/srcfl/ftw/blob/master/TRADEMARKS.md">Trademarks</a><a href="https://github.com/srcfl/ftw/blob/master/SUPPORT.md">Support</a></div>
<div><span>Terms</span><a href="https://github.com/srcfl/ftw/blob/master/LICENSE">AGPLv3</a><a href="https://github.com/srcfl/ftw/blob/master/TRADEMARKS.md">Trademarks</a><a href="https://github.com/srcfl/ftw/blob/master/SUPPORT.md">Support</a><a href="/support">App support</a><a href="/privacy">App privacy</a></div>
</div>
</div>
<div class="wrap footer-bottom"><span>© Sourceful Labs AB and FTW contributors</span><a href="https://www.sourceful.energy/">sourceful.energy <span aria-hidden="true">↗</span></a></div>
Expand Down
101 changes: 101 additions & 0 deletions privacy.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Privacy | FTW app</title>
<meta name="description" content="What the FTW app for iPhone does with your data: it stays on your box and your phone, the relay carries only encrypted traffic, and there is no analytics or tracking.">
<meta name="robots" content="index,follow">
<meta name="theme-color" content="#0a0a0a">
<link rel="canonical" href="https://ftw.energy/privacy">
<link rel="alternate" hreflang="en" href="https://ftw.energy/privacy">
<link rel="alternate" hreflang="sv" href="https://ftw.energy/sv/privacy">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="/sourceful.css?v=app-pages-1">
</head>
<body>
<a class="skip-link" href="#content">Skip to content</a>

<header class="site-header">
<div class="wrap nav">
<a class="brand" href="/" aria-label="ftw home">
<img src="/favicon.svg" alt="ftw logo" width="34" height="34">
<span class="brand-name">ftw</span>
</a>
<nav class="nav-links" aria-label="Primary navigation">
<a href="/support">App support</a>
<a href="/privacy" aria-current="page">Privacy</a>
<a href="/sv/privacy" hreflang="sv" lang="sv">Svenska</a>
<a class="nav-cta" href="https://github.com/srcfl/ftw-app">GitHub <span aria-hidden="true">↗</span></a>
</nav>
<details class="mobile-nav">
<summary>Menu</summary>
<nav aria-label="Mobile navigation">
<a href="/">FTW</a>
<a href="/support">App support</a>
<a href="/privacy" aria-current="page">Privacy</a>
<a href="/sv/privacy" hreflang="sv" lang="sv">Svenska</a>
</nav>
</details>
</div>
</header>

<main id="content" class="doc">
<div class="wrap">
<p class="section-kicker">FTW app for iPhone</p>
<h1>Privacy</h1>
<p class="updated">Updated 12 October 2026</p>

<p class="doc-lede">Your energy data stays on your FTW box and your phone. The relay that connects them carries only encrypted traffic it cannot read. The app has no analytics and no tracking.</p>

<p>This page covers the FTW app for iPhone and the relay it uses. Sourceful Labs AB, Sweden, makes the app and runs the relay. The FTW box is software you run yourself; its <a href="https://github.com/srcfl/ftw">documentation</a> describes what it sends.</p>

<h2>What stays on your box</h2>
<p>Your box reads your meters, solar, battery and charger, keeps the history and makes the plan. That record stays on the box. The app asks the box for what it shows and sends the box what you choose, such as a charging goal.</p>

<h2>What the app keeps on your phone</h2>
<ul>
<li>The keys that let this phone talk to your box, in the iPhone keychain. They stay on this phone and are not backed up to iCloud.</li>
<li>The last readings, prices and car level, so the app can show your home before it reconnects. Each one keeps the time it was read.</li>
<li>A copy of the prices and car level that the widgets read. Widgets read nothing else.</li>
</ul>
<p>Delete the app to remove what it keeps. The box owner can also withdraw a phone's access from the box.</p>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Do not promise that uninstalling clears keychain keys

When a paired user deletes the app expecting this instruction to remove all retained data, the connection keys listed immediately above may remain in the iOS keychain and become accessible again after reinstalling the same signed app; ThisDeviceOnly prevents migration to another device, not persistence across app deletion. Apple DTS confirms that preserving keychain items after uninstall is expected behavior. The Swedish page repeats the same promise, so both policies should instead explain how users can revoke/delete the credentials or the app must explicitly make persisted keys unusable after uninstall.

Useful? React with 👍 / 👎.


<h2>Passkeys</h2>
<p>When you pair, the app creates a passkey for app.ftw.energy in your password manager, for example iCloud Keychain. The passkey guards a copy of the key this phone uses with your box. Your password manager keeps the passkey; Sourceful never receives it. The app sends no copy of your keys to Sourceful.</p>

<h2>The relay</h2>
<p>The app reaches your box through Sourceful's relay at relay.ftw.energy, which runs in Frankfurt, Germany, on Amazon Web Services. The app and the box encrypt everything end to end (Noise protocol) before it leaves them. The relay has no key and cannot read what it carries.</p>
<p>To carry a connection the relay sees:</p>
<ul>
<li>your phone's IP address, while it is connected;</li>
<li>a meeting code that changes every hour and that only your box and phone can work out;</li>
<li>when you connect, for how long, and the size and timing of encrypted messages.</li>
</ul>
<p>The relay keeps none of the traffic. Its access log holds counts, not addresses or codes. If the relay fails to pass on a connection, its error log may record the address and code; that log replaces itself and stays small. We use what the relay sees only to carry your connection, which you ask for when you use the app.</p>

<h2>No analytics, no tracking, no ads</h2>
<p>The app contains no analytics, no advertising and no code from third parties. It does not track you across apps or websites. It talks to the relay and nothing else.</p>
<p>The camera reads the pairing code from your box and nothing else.</p>

<h2>Apple</h2>
<p>Apple runs the App Store and TestFlight under <a href="https://www.apple.com/legal/privacy/">its own privacy policy</a>. If you share analytics with app developers in your iPhone settings, Apple sends us crash reports and usage numbers that do not name you. If you test through TestFlight, Apple shares your name, email address, crash reports and any feedback you send with us.</p>

<h2>FTW Cloud, later</h2>
<p>FTW Cloud will be a separate service that you can choose to turn on. It will hold a readable copy of the data you allow, so that it can, for example, send notifications. It is not part of the app today. It will stay off unless you turn it on, and we will update this page before it ships.</p>

<h2>Your rights</h2>
<p>Sourceful Labs AB (reg. no. 559382-0458), Kalmar, Sweden, is responsible for the data the relay sees. Under the GDPR you can ask what we hold about you, have it corrected or deleted, and object to how we use it. In practice the relay holds nothing that names you. To ask, email <a href="mailto:support@sourceful.energy">support@sourceful.energy</a> or use <a href="https://www.sourceful.energy/contact">Sourceful's contact page</a>. You can also complain to the Swedish Authority for Privacy Protection (<a href="https://www.imy.se/en/">IMY</a>).</p>
<p>The app is not aimed at children.</p>

<h2>Changes</h2>
<p>When the app changes what it does with data, we change this page first and update the date at the top. The history of this page is public on <a href="https://github.com/srcfl/ftw-web/commits/main/privacy.html">GitHub</a>.</p>
</div>
</main>

<footer>
<div class="wrap footer-bottom"><span>© Sourceful Labs AB and FTW contributors</span><a href="https://www.sourceful.energy/">sourceful.energy <span aria-hidden="true">↗</span></a></div>
</footer>
<script src="/navigation.js?v=1" defer></script>
</body>
</html>
15 changes: 15 additions & 0 deletions sourceful.css
Original file line number Diff line number Diff line change
Expand Up @@ -301,3 +301,18 @@ footer { padding: 62px 0 26px; background: var(--ink); color: var(--cream); }
}

html { scroll-padding-top: 84px; }

/* Text pages: app privacy and support. */
.doc { padding: 72px 0 104px; }
.doc .wrap { max-width: 760px; }
.doc h1 { margin-bottom: 14px; font-size: clamp(2.6rem, 7vw, 4.2rem); line-height: 1; }
.doc h2 { margin: 52px 0 14px; font-size: 24px; font-weight: 700; line-height: 1.2; letter-spacing: -0.02em; }
.doc a { color: var(--ink); text-decoration-color: var(--signal); text-underline-offset: 3px; }
.doc ul, .doc ol { padding-left: 22px; }
.doc li + li { margin-top: 8px; }
.doc .updated { margin-bottom: 32px; color: var(--muted); font-family: "JetBrains Mono", monospace; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; }
.doc-lede { color: var(--ink); font-size: 20px; line-height: 1.45; }
.doc-terms { margin: 0; border-top: 1px solid var(--line); }
.doc-terms div { padding: 14px 0; border-bottom: 1px solid var(--line); }
.doc-terms dt { color: var(--ink); font-weight: 700; }
.doc-terms dd { margin: 4px 0 0; }
93 changes: 93 additions & 0 deletions support.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>App support | FTW app</title>
<meta name="description" content="Help with the FTW app for iPhone: what you need, how to pair with your FTW box, what the app's messages mean and how to reach Sourceful.">
<meta name="robots" content="index,follow">
<meta name="theme-color" content="#0a0a0a">
<link rel="canonical" href="https://ftw.energy/support">
<link rel="alternate" hreflang="en" href="https://ftw.energy/support">
<link rel="alternate" hreflang="sv" href="https://ftw.energy/sv/support">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="/sourceful.css?v=app-pages-1">
</head>
<body>
<a class="skip-link" href="#content">Skip to content</a>

<header class="site-header">
<div class="wrap nav">
<a class="brand" href="/" aria-label="ftw home">
<img src="/favicon.svg" alt="ftw logo" width="34" height="34">
<span class="brand-name">ftw</span>
</a>
<nav class="nav-links" aria-label="Primary navigation">
<a href="/support" aria-current="page">App support</a>
<a href="/privacy">Privacy</a>
<a href="/sv/support" hreflang="sv" lang="sv">Svenska</a>
<a class="nav-cta" href="https://github.com/srcfl/ftw-app">GitHub <span aria-hidden="true">↗</span></a>
</nav>
<details class="mobile-nav">
<summary>Menu</summary>
<nav aria-label="Mobile navigation">
<a href="/">FTW</a>
<a href="/support" aria-current="page">App support</a>
<a href="/privacy">Privacy</a>
<a href="/sv/support" hreflang="sv" lang="sv">Svenska</a>
</nav>
</details>
</div>
</header>

<main id="content" class="doc">
<div class="wrap">
<p class="section-kicker">FTW app for iPhone</p>
<h1>App support</h1>

<p class="doc-lede">The FTW app shows the FTW box in your home and lets you steer the car's charging. Here is how to set it up, what its messages mean and how to reach us.</p>

<h2>What you need</h2>
<ul>
<li>An iPhone with iOS 26 or later.</li>
<li>An FTW box at home with the FTW app turned on in its settings. <a href="https://github.com/srcfl/ftw/blob/master/docs/native-beta.md">Install and update FTW</a> explains how to set up a box.</li>
</ul>
<p>No box yet? On the app's first screen, tap <strong>Try the live demo</strong>. It runs a simulated home inside the app and saves nothing.</p>

<h2>Pair your phone</h2>
<ol>
<li>Open your box's local FTW dashboard while you are on your home network.</li>
<li>Go to <strong>Settings → FTW app</strong>.</li>
<li>Choose <strong>Show pairing code</strong>, then scan the QR code with the FTW app or the iPhone camera.</li>
<li>Confirm with Face ID or Touch ID if your phone asks. This creates a passkey for app.ftw.energy.</li>
</ol>

<h2>What the app's messages mean</h2>
<dl class="doc-terms">
<div><dt>Can't reach your box</dt><dd>The box is off or offline, or your phone has no connection. The app keeps trying by itself; there is no reconnect button. Until then it shows the last readings with their age.</dd></div>
<div><dt>FTW is busy</dt><dd>Up to four phones or browsers can show one home at a time. Close FTW on another device, then try again.</dd></div>
<div><dt>A reading with a time or age next to it</dt><dd>Every reading shows how old it is. Grey, dated values come from your phone while the app reconnects.</dd></div>
<div><dt>Open FTW to see prices</dt><dd>The price widgets show what the app last read from your box. Open the app while it can reach the box, and the widgets catch up.</dd></div>
<div><dt>Access ended</dt><dd>The box's owner has withdrawn this phone's access. Ask them for a new pairing code.</dd></div>
</dl>

<h2>Get help</h2>
<ul>
<li>Report a bug or ask for a feature in <a href="https://github.com/srcfl/ftw-app/issues">GitHub issues for the app</a>. Say which iPhone and iOS version you use.</li>
<li>Ask other users in the <a href="https://discord.gg/25xcBzQaux">FTW Discord</a>.</li>
<li>Email Sourceful at <a href="mailto:support@sourceful.energy">support@sourceful.energy</a>.</li>
</ul>
<p>Help from the community and maintainers is best effort, as the <a href="https://github.com/srcfl/ftw/blob/master/SUPPORT.md">FTW support policy</a> describes. Never post a pairing code, a picture of the pairing QR or a key in a public channel.</p>

<h2>Who makes the app</h2>
<p>Sourceful Labs AB (reg. no. 559382-0458), Kalmar, Sweden. <a href="https://www.sourceful.energy/contact">Contact Sourceful</a>.</p>
<p>Read how the app handles your data in <a href="/privacy">Privacy</a>.</p>
</div>
</main>

<footer>
<div class="wrap footer-bottom"><span>© Sourceful Labs AB and FTW contributors</span><a href="https://www.sourceful.energy/">sourceful.energy <span aria-hidden="true">↗</span></a></div>
</footer>
<script src="/navigation.js?v=1" defer></script>
</body>
</html>
Loading