chore: added /privacy and now what detail 1817d1da
Steve Simkins · 2026-07-07 02:12 5 file(s) · +129 −0
app.go +1 −0
50 50
func (a *App) routes() *http.ServeMux {
51 51
	mux := http.NewServeMux()
52 52
	mux.HandleFunc("GET /", a.indexHandler)
53 +
	mux.HandleFunc("GET /privacy", a.privacyHandler)
53 54
	mux.HandleFunc("GET /og.png", a.ogImageHandler)
54 55
	mux.HandleFunc("GET /api/resolve", a.resolveHandler)
55 56
	mux.HandleFunc("GET /static/", embeddedHandler(appFS, "static"))
handlers.go +4 −0
12 12
13 13
const maxFeedURLs = 20
14 14
15 +
func (a *App) privacyHandler(w http.ResponseWriter, r *http.Request) {
16 +
	render(a.Templates, w, "privacy.html", nil, a.Log)
17 +
}
18 +
15 19
func (a *App) indexHandler(w http.ResponseWriter, r *http.Request) {
16 20
	data := indexPageData{
17 21
		BaseURL:         a.BaseURL,
static/styles.css +69 −0
390 390
  padding: 2rem 0;
391 391
}
392 392
393 +
/* ── Now what? (details dropdown) ────────────────────────────────── */
394 +
395 +
.now-what {
396 +
  width: 100%;
397 +
  margin-top: -0.5rem;
398 +
}
399 +
400 +
.now-what summary {
401 +
  font-size: 12px;
402 +
  opacity: 0.6;
403 +
  cursor: pointer;
404 +
  width: fit-content;
405 +
  list-style: none;
406 +
  text-decoration: underline;
407 +
  text-underline-offset: 2px;
408 +
}
409 +
410 +
.now-what summary::-webkit-details-marker {
411 +
  display: none;
412 +
}
413 +
414 +
.now-what summary:hover {
415 +
  opacity: 1;
416 +
}
417 +
418 +
.now-what[open] summary {
419 +
  opacity: 1;
420 +
}
421 +
422 +
.now-what-body {
423 +
  margin-top: 0.75rem;
424 +
  padding: 0.75rem 1rem;
425 +
  border: 1px solid #ddd;
426 +
  font-size: 13px;
427 +
  line-height: 1.5;
428 +
  display: flex;
429 +
  flex-direction: column;
430 +
  gap: 0.5rem;
431 +
}
432 +
433 +
.now-what-body ul {
434 +
  display: flex;
435 +
  flex-direction: column;
436 +
  gap: 0.5rem;
437 +
  padding-left: 1.1rem;
438 +
}
439 +
440 +
.now-what-body a {
441 +
  text-decoration: underline;
442 +
  text-underline-offset: 2px;
443 +
}
444 +
445 +
/* ── Footer ──────────────────────────────────────────────────────── */
446 +
447 +
.footer {
448 +
  display: flex;
449 +
  gap: 1rem;
450 +
  width: 100%;
451 +
  margin-top: auto;
452 +
  padding-top: 1rem;
453 +
  border-top: 1px solid #ddd;
454 +
  font-size: 12px;
455 +
  opacity: 0.6;
456 +
}
457 +
458 +
.footer a:hover {
459 +
  opacity: 1;
460 +
}
461 +
393 462
@media (max-width: 480px) {
394 463
  .feed-meta {
395 464
    flex-direction: column;
templates/index.html +20 −0
34 34
      {{range .FeedURLs}}{{.Name}}<br>{{end}}
35 35
    </div>
36 36
37 +
    <details class="now-what">
38 +
      <summary>now what?</summary>
39 +
      <div class="now-what-body">
40 +
        <p>Now that you've seen RSS in action, there's a few things you can do:</p>
41 +
        <ul>
42 +
          <li>Share this feed with someone else so they can also learn about RSS.</li>
43 +
          <li>Keep using this free app by bookmarking the URLs for specific feed collections.</li>
44 +
          <li>Download a dedicated RSS reader. These will have much more features and let you sync across devices. A few include <a href="https://netnewswire.com" target="_blank" rel="noopener noreferrer">NetNewsWire</a>, <a href="https://www.currentreader.app" target="_blank" rel="noopener noreferrer">Current</a>, or <a href="https://play.google.com/store/apps/details?id=com.prof18.feedflow" target="_blank" rel="noopener noreferrer">FeedFlow</a>.</li>
45 +
          <li>Create your own RSS feed that you can share with others. Quick and no nonsense way to do this is to use an app like <a href="https://www.sourcefeed.app" target="_blank" rel="noopener noreferrer">sourcefeed</a>. The old fashion way is to start a blog with something like <a href="https://pagecord.com" target="_blank" rel="noopener noreferrer">Pagecord</a> or <a href="https://bearblog.dev" target="_blank" rel="noopener noreferrer">BearBlog</a>.</li>
46 +
        </ul>
47 +
        <p>The web doesn't have to be a walled garden; we can make it open again.</p>
48 +
      </div>
49 +
    </details>
50 +
37 51
    {{if .Error}}
38 52
    <div id="error" class="error"><p>{{.Error}}</p></div>
39 53
    {{else}}
67 81
    </div>
68 82
    <script src="/static/app.js"></script>
69 83
    {{end}}
84 +
85 +
    <footer class="footer">
86 +
      <a href="https://github.com/stevedylandev/feeds" target="_blank" rel="noopener noreferrer">source</a>
87 +
      <a href="/privacy">privacy</a>
88 +
      <a href="https://stevedylan.dev" target="_blank" rel="noopener noreferrer">by steve</a>
89 +
    </footer>
70 90
  </body>
71 91
</html>
templates/privacy.html (added) +35 −0
1 +
<!doctype html>
2 +
<html lang="en">
3 +
  <head>
4 +
    <meta charset="UTF-8" />
5 +
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6 +
    <meta name="theme-color" content="#ffffff" />
7 +
    <link rel="stylesheet" href="/static/styles.css" />
8 +
    <title>Privacy — Feeds</title>
9 +
    <meta name="description" content="Privacy policy for Feeds" />
10 +
    <link rel="icon" type="image/x-icon" href="/static/favicon.ico" />
11 +
    <link rel="icon" type="image/png" sizes="16x16" href="/static/favicon-16x16.png" />
12 +
    <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png" />
13 +
    <link rel="apple-touch-icon" href="/static/apple-touch-icon.png" />
14 +
    <link rel="manifest" href="/static/site.webmanifest" />
15 +
  </head>
16 +
  <body>
17 +
    <div class="header">
18 +
      <a href="/" class="logo"><h1>FEEDS</h1></a>
19 +
    </div>
20 +
21 +
22 +
    <div class="about">
23 +
      <h2>Privacy</h2>
24 +
      <p>This app does not use any cookies, trackers, analytics, or observation. It's server side rendered on Railway that only records VPS system load (CPU, Memory, Number of Requests, Ingres/egres). Feeds is free and MIT open sourced software.</p>
25 +
    </div>
26 +
27 +
    <a href="/" class="btn">&larr; back</a>
28 +
29 +
    <footer class="footer">
30 +
      <a href="https://github.com/stevedylandev/feeds" target="_blank" rel="noopener noreferrer">source</a>
31 +
      <a href="/privacy">privacy</a>
32 +
      <a href="https://stevedylan.dev" target="_blank" rel="noopener noreferrer">by steve</a>
33 +
    </footer>
34 +
  </body>
35 +
</html>