···88 "net"
99 "net/http"
1010 "net/url"
1111+ "slices"
1112 "strings"
1213 "sync"
1314 "time"
···7879 return nil
7980 }
80818181- for _, ip := range ips {
8282- if isPrivateIP(ip) {
8383- return ErrSSRFBlocked
8484- }
8282+ if slices.ContainsFunc(ips, isPrivateIP) {
8383+ return ErrSSRFBlocked
8584 }
86858786 return nil
···208207209208// PublicRecordEntry represents a single record in the public listRecords response
210209type PublicRecordEntry struct {
211211- URI string `json:"uri"`
212212- CID string `json:"cid"`
213213- Value map[string]interface{} `json:"value"`
210210+ URI string `json:"uri"`
211211+ CID string `json:"cid"`
212212+ Value map[string]any `json:"value"`
214213}
215214216215// GetProfile fetches a user's public profile by DID or handle
+2-2
internal/web/components/shared.templ
···150150151151templ WelcomeUnauthenticated() {
152152 <div>
153153- <p class="text-brown-800 mb-6 text-center text-lg">Please log in with your AT Protocol handle to start tracking your brews.</p>
153153+ <p class="text-brown-800 mb-6 text-center text-lg">Please log in with your <a href="/atproto" class="link-bold">atproto handle</a> to start tracking your brews.</p>
154154 <form method="POST" action="/auth/login" class="max-w-md mx-auto">
155155 <div class="relative">
156156 <label for="handle" class="block text-sm font-medium text-brown-900 mb-2">Your Handle</label>
···158158 type="text"
159159 id="handle"
160160 name="handle"
161161- placeholder="alice.bsky.social"
161161+ placeholder="alice.arabica.systems"
162162 autocomplete="off"
163163 required
164164 class="w-full px-4 py-3 border-2 border-brown-300 rounded-lg focus:ring-2 focus:ring-brown-600 focus:border-brown-600 bg-white"
+4-3
internal/web/pages/atproto.templ
···2020 <p class="text-brown-800 leading-relaxed">
2121 The <strong>AT Protocol</strong> (Authenticated Transfer Protocol) is a decentralized social networking
2222 protocol that puts you in control of your data and identity. It's the technology that powers
2323- <a href="https://bsky.app" class="link-bold" target="_blank" rel="noopener noreferrer">Bluesky</a> and now Arabica.
2323+ <a href="https://bsky.app" class="link-bold" target="_blank" rel="noopener noreferrer">Bluesky</a>,
2424+ <a href="https://leaflet.pub" class="link-bold" target="_blank" rel="noopener noreferrer">Leaflet</a>, Arabica and more.
2425 </p>
2526 </section>
2627 <section>
···3940 <p class="text-brown-700 text-sm">
4041 Your identity is represented by a DID (Decentralized Identifier) that you own.
4142 This identity is portable across applications and PDS providers. Your handle
4242- (like yourname.bsky.social) is just a human-friendly alias { "for" } your DID.
4343+ (e.g. yourname.arabica.systems) is just a human-friendly alias { "for" } your DID.
4344 </p>
4445 </div>
4546 <div class="bg-gradient-to-br from-brown-50 to-brown-100 border border-brown-200 p-4 rounded-lg shadow-md">
···129130 </li>
130131 <li>
131132 <a href="https://bsky.app" class="link-bold" target="_blank" rel="noopener noreferrer">Bluesky</a> -
132132- A social network built on AT Protocol
133133+ A microblogging social network built on AT Protocol
133134 </li>
134135 </ul>
135136 </section>
+4-4
internal/web/pages/terms.templ
···6969 <ul class="list-disc list-inside space-y-2 text-gray-700 mt-3">
7070 <li>Making public API calls to your PDS</li>
7171 <li>Temporarily caching brew data for feed display</li>
7272- <li>Not storing your data permanently on our servers</li>
7372 </ul>
7474- <p class="text-gray-700 leading-relaxed mt-3">
7575- You can opt out of the community feed at any time, and we'll stop reading your brews.
7676- </p>
7373+ // TODO: this hasn't been implemented yet
7474+ // <p class="text-gray-700 leading-relaxed mt-3">
7575+ // You can opt out of the community feed at any time, and we'll stop reading your brews.
7676+ // </p>
7777 </section>
7878 <section>
7979 <h2 class="text-2xl font-semibold text-brown-800 mb-4">5. Service Availability</h2>