···4455## Tech Stack
6677-- **Language:** Go 1.21+
77+- **Language:** Go 1.25+
88- **HTTP:** stdlib `net/http` with Go 1.22 routing
99- **Storage:** AT Protocol PDS (user data), BoltDB (sessions/feed registry)
1010- **Frontend:** Svelte SPA with client-side routing
+3
BACKLOG.md
···8484- The "back" button behaves kind of strangely
8585 - Goes back to brews list after clicking on view bean in feed,
8686 takes to profile for other users' brews.
8787+8888+- Update terms page to be more clear about the public nature of all data
8989+ - Link to about page and terms at the top of the unauthed feed
···11-<div class="max-w-4xl mx-auto">
22- <div class="bg-white rounded-xl p-8 shadow-lg">
33- <h1 class="text-3xl font-bold text-brown-900 mb-6">Terms of Service</h1>
11+<script>
22+ function goBack() {
33+ if (window.history.length > 1) {
44+ window.history.back();
55+ } else {
66+ window.location.href = "/";
77+ }
88+ }
99+</script>
1010+1111+<div class="max-w-3xl mx-auto">
1212+ <div class="flex items-center gap-3 mb-8">
1313+ <button
1414+ on:click={goBack}
1515+ class="inline-flex items-center text-brown-700 hover:text-brown-900 font-medium transition-colors cursor-pointer"
1616+ >
1717+ <svg
1818+ class="w-5 h-5"
1919+ fill="none"
2020+ stroke="currentColor"
2121+ viewBox="0 0 24 24"
2222+ xmlns="http://www.w3.org/2000/svg"
2323+ >
2424+ <path
2525+ stroke-linecap="round"
2626+ stroke-linejoin="round"
2727+ stroke-width="2"
2828+ d="M10 19l-7-7m0 0l7-7m-7 7h18"
2929+ ></path>
3030+ </svg>
3131+ </button>
3232+ <h1 class="text-4xl font-bold text-brown-800">Terms of Service</h1>
3333+ </div>
43455- <div class="prose prose-brown max-w-none text-brown-800 space-y-4">
66- <p class="text-sm text-brown-600 italic">
77- Last updated: {new Date().toLocaleDateString()}
3535+ <div class="prose prose-lg max-w-none space-y-6">
3636+ <section class="bg-green-50 border border-green-200 p-6 rounded-lg mb-8">
3737+ <h2 class="text-2xl font-semibold text-green-900 mb-4">
3838+ The Simple Truth
3939+ </h2>
4040+ <p class="text-gray-800 text-lg leading-relaxed">
4141+ <strong>You own all of your data.</strong> Period. Your brew logs, coffee
4242+ beans, equipment information, and any other data you create in Arabica belongs
4343+ to you and is stored in your Personal Data Server (PDS), not on our servers.
844 </p>
4545+ </section>
9461010- <h2 class="text-2xl font-bold text-brown-900 mt-8">
1111- 1. Acceptance of Terms
4747+ <section>
4848+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
4949+ 1. Your Data Ownership
1250 </h2>
1313- <p>
1414- By accessing and using Arabica, you accept and agree to be bound by the
1515- terms and provision of this agreement.
5151+ <!-- TODO: ensure this is correct, we may keep a witness cache of records -->
5252+ <p class="text-gray-700 leading-relaxed">
5353+ All data you create through Arabica is stored in your AT Protocol
5454+ Personal Data Server (PDS). Arabica acts as an interface to your PDS but
5555+ does not own, claim rights to, or permanently store your data.
1656 </p>
5757+ <ul class="list-disc list-inside space-y-2 text-gray-700 mt-3">
5858+ <li>You retain full ownership and control of your data</li>
5959+ <li>You can delete your data at any time</li>
6060+ <li>You can switch PDS providers without losing your data</li>
6161+ <li>You can stop using Arabica and your data remains in your PDS</li>
6262+ </ul>
6363+ </section>
17641818- <h2 class="text-2xl font-bold text-brown-900 mt-8">
1919- 2. Alpha Software Notice
6565+ <section>
6666+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
6767+ 2. What We Store
6868+ </h2>
6969+ <p class="text-gray-700 leading-relaxed mb-3">
7070+ Arabica's servers store minimal data necessary for the application to
7171+ function:
7272+ </p>
7373+ <ul class="list-disc list-inside space-y-2 text-gray-700">
7474+ <li>
7575+ <strong>Session information</strong> - Temporary authentication tokens
7676+ to keep you logged in
7777+ </li>
7878+ <li>
7979+ <strong>Feed registry</strong> - List of users who've opted into the community
8080+ feed
8181+ </li>
8282+ <li>
8383+ <strong>Temporary cache</strong> - Short-lived cache of your data to improve
8484+ performance
8585+ </li>
8686+ </ul>
8787+ <!-- TODO: This may not end up being true, for performance and validation purposes, commenting for now -->
8888+ <!-- If we do keep data, we will respect delete requests from PDS's -->
8989+ <!-- <p class="text-gray-700 leading-relaxed mt-3"> -->
9090+ <!-- We do <strong>not</strong> store your brew logs, beans, equipment, or any -->
9191+ <!-- other user-generated content on our servers. That data lives exclusively -->
9292+ <!-- in your PDS. -->
9393+ <!-- </p> -->
9494+ </section>
9595+9696+ <section>
9797+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
9898+ 3. Authentication
2099 </h2>
2121- <p>
2222- Arabica is currently in alpha testing. Features, data structures, and
2323- functionality may change without notice. We recommend backing up your
2424- data regularly.
100100+ <p class="text-gray-700 leading-relaxed">
101101+ Arabica uses OAuth to authenticate with your PDS. We never see or store
102102+ your PDS password. Authentication is handled between your browser and
103103+ your PDS, with Arabica receiving only temporary access tokens to read
104104+ and write data on your behalf.
25105 </p>
106106+ </section>
261072727- <h2 class="text-2xl font-bold text-brown-900 mt-8">3. Data Storage</h2>
2828- <p>
2929- Your brewing data is stored in your Personal Data Server (PDS) via the
3030- AT Protocol. Arabica does not store your brewing records on its servers.
3131- You are responsible for the security and backup of your PDS.
108108+ <section>
109109+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
110110+ 4. Community Feed
111111+ </h2>
112112+ <p class="text-gray-700 leading-relaxed">
113113+ If you opt into the community feed, Arabica will periodically read your
114114+ public brew records from your PDS to display them to other users. This
115115+ is done by:
32116 </p>
117117+ <ul class="list-disc list-inside space-y-2 text-gray-700 mt-3">
118118+ <li>Making public API calls to your PDS</li>
119119+ <li>Temporarily caching brew data for feed display</li>
120120+ <li>Not storing your data permanently on our servers</li>
121121+ </ul>
122122+ <p class="text-gray-700 leading-relaxed mt-3">
123123+ You can opt out of the community feed at any time, and we'll stop
124124+ reading your brews.
125125+ </p>
126126+ </section>
331273434- <h2 class="text-2xl font-bold text-brown-900 mt-8">
3535- 4. User Responsibilities
128128+ <section>
129129+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
130130+ 5. Service Availability
36131 </h2>
3737- <p>
3838- You are responsible for maintaining the confidentiality of your account
3939- credentials and for all activities that occur under your account.
132132+ <p class="text-gray-700 leading-relaxed">
133133+ Arabica is provided "as is" without warranties of any kind. We make
134134+ reasonable efforts to keep the service running but do not guarantee
135135+ uptime or availability. Since your data is stored in your PDS (not our
136136+ servers), you won't lose your data if Arabica goes offline.
137137+ </p>
138138+ </section>
139139+140140+ <section>
141141+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">6. Privacy</h2>
142142+ <p class="text-gray-700 leading-relaxed">
143143+ We respect your privacy and follow these principles:
40144 </p>
145145+ <ul class="list-disc list-inside space-y-2 text-gray-700 mt-3">
146146+ <li>We don't sell your data</li>
147147+ <li>We don't track you across websites</li>
148148+ <li>We use minimal analytics to understand service usage</li>
149149+ <li>We don't share your data with third parties</li>
150150+ </ul>
151151+ </section>
411524242- <h2 class="text-2xl font-bold text-brown-900 mt-8">
4343- 5. Limitation of Liability
153153+ <section>
154154+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">7. Open Source</h2>
155155+ <p class="text-gray-700 leading-relaxed">
156156+ Arabica is open source software. You can review the <a
157157+ href="https://tangled.org/arabica.social/arabica"
158158+ class="text-brown-700 hover:underline font-medium"
159159+ target="_blank">code</a
160160+ >, run your own instance, or contribute improvements. The transparency
161161+ of open source means you can verify that we're handling your data as
162162+ described in these terms.
163163+ </p>
164164+ </section>
165165+166166+ <section>
167167+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
168168+ 8. Changes to Terms
44169 </h2>
4545- <p>
4646- Arabica is provided "as is" without warranty of any kind. We are not
4747- liable for any data loss, service interruptions, or other damages
4848- arising from your use of the application.
170170+ <p class="text-gray-700 leading-relaxed">
171171+ We may update these terms occasionally. If we make significant changes,
172172+ we'll notify users through the application. Continued use of Arabica
173173+ after changes constitutes acceptance of the new terms.
49174 </p>
175175+ </section>
501765151- <h2 class="text-2xl font-bold text-brown-900 mt-8">
5252- 6. Changes to Terms
177177+ <section>
178178+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">
179179+ 9. Acceptable Use
53180 </h2>
5454- <p>
5555- We reserve the right to modify these terms at any time. Continued use of
5656- Arabica after changes constitutes acceptance of the modified terms.
181181+ <p class="text-gray-700 leading-relaxed">
182182+ Please use Arabica responsibly:
57183 </p>
5858- </div>
184184+ <ul class="list-disc list-inside space-y-2 text-gray-700 mt-3">
185185+ <li>Don't attempt to access other users' data without permission</li>
186186+ <li>Don't abuse the service with excessive API requests</li>
187187+ <li>Don't use Arabica for illegal purposes</li>
188188+ <li>Be respectful in community interactions</li>
189189+ </ul>
190190+ </section>
191191+192192+ <section>
193193+ <h2 class="text-2xl font-semibold text-brown-800 mb-4">10. Contact</h2>
194194+ <p class="text-gray-700 leading-relaxed">
195195+ Questions about these terms? You can reach us through our <a
196196+ href="https://tangled.org/arabica.social/arabica"
197197+ class="text-brown-700 hover:underline font-medium"
198198+ target="_blank">Tangled repository</a
199199+ >
200200+ or by email at
201201+ <a
202202+ href="mailto:mail@arabica.systems"
203203+ class="text-brown-700 hover:underline font-medium"
204204+ >mail@arabica.systems</a
205205+ >.
206206+ </p>
207207+ </section>
208208+209209+ <section class="bg-gray-100 p-6 rounded-lg mt-8">
210210+ <p class="text-sm text-gray-600">
211211+ <strong>Last Updated:</strong> January 2026<br />
212212+ <strong>Effective Date:</strong> January 2026
213213+ </p>
214214+ </section>
215215+ </div>
216216+217217+ <div class="mt-12 text-center">
218218+ <a
219219+ href="/brews/new"
220220+ class="inline-block bg-gradient-to-r from-brown-700 to-brown-800 text-white px-8 py-3 rounded-lg hover:from-brown-800 hover:to-brown-900 transition-all font-semibold shadow-lg hover:shadow-xl"
221221+ >
222222+ Back to Home</a
223223+ >
59224 </div>
60225</div>
+5
frontend/src/styles.css
···1111 min-width: 44px;
1212 }
13131414+ /* TODO: figure this out, @apply may not work with tailwind v4 */
1515+ /* a { */
1616+ /* @apply text-blue-600 hover:text-blue-800 underline; */
1717+ /* } */
1818+1419 /* Prevent iOS zoom on input focus */
1520 @media (max-width: 768px) {
1621 input,