A social RSS reader built on the AT Protocol. glean.at
glean atproto atmosphere rss feed social app
14
fork

Configure Feed

Select the types of activity you want to include in your feed.

Improve logo and footer

+73 -55
+6 -1
Makefile
··· 37 37 css-watch: 38 38 npx tailwindcss -i ./static/input.css -o ./static/output.css --watch 39 39 40 + .PHONY: icons 41 + icons: 42 + magick static/favicon.svg -background none -density 1200 -resize 512x512 -depth 8 PNG32:static/favicon.png 43 + magick static/favicon.svg -background none -density 1200 -resize 180x180 -depth 8 PNG32:static/apple-touch-icon.png 44 + 40 45 .PHONY: test 41 46 test: 42 47 go test -tags fts5 ./... 43 48 44 49 .PHONY: clean 45 50 clean: 46 - rm -f glean glean.db static/output.css 51 + rm -f glean glean.db static/output.css static/favicon.png static/apple-touch-icon.png 47 52 48 53 .PHONY: docker-build 49 54 docker-build:
+2 -2
docs/design.md
··· 156 156 - **CSS build:** `make css` (minified) or `make css-watch` (dev with live reload) 157 157 - **Source:** `static/input.css` — contains `@tailwind` directives, CSS variables for themes, `@layer components` for article-body styles, and base utilities 158 158 - **Output:** `static/output.css` (gitignored, rebuilt on deploy) 159 - - **Favicon:** `static/favicon.svg` — wheat stalk SVG on House Green background 160 - - **Logo:** Inline SVG in base.html sidebar and index.html hero 159 + - **Favicon:** `static/favicon.svg` — bee logo (gradient green background, rounded rect). `static/favicon.png` — 512x512 raster fallback. Both linked in `base.html` `<head>`. 160 + - **Logo:** `<img>` referencing `/static/favicon.svg`, defined in `partials/logo.html` (`logo-icon`, `logo-link`, `logo-text` templates). 161 161 162 162 ## 8. Page Structure 163 163
+19 -16
internal/tmpl/base.html
··· 28 28 </script> 29 29 <meta property="og:title" content="Glean"> 30 30 <meta property="og:description" content="A social RSS reader on the AT Protocol."> 31 - <meta property="og:image" content="/static/favicon.svg"> 31 + <meta property="og:image" content="/static/banner.png"> 32 32 <meta property="og:type" content="website"> 33 33 <meta property="og:site_name" content="Glean"> 34 + <link rel="icon" type="image/png" sizes="512x512" href="/static/favicon.png"> 34 35 <link rel="icon" type="image/svg+xml" href="/static/favicon.svg"> 36 + <link rel="apple-touch-icon" href="/static/apple-touch-icon.png"> 37 + <meta name="theme-color" content="#00754A"> 38 + <meta name="apple-mobile-web-app-capable" content="yes"> 39 + <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> 40 + <link rel="manifest" href="/static/manifest.json"> 35 41 <link rel="preconnect" href="https://fonts.googleapis.com"> 36 42 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 37 43 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet"> ··· 139 145 <main id="main-content" class="{{if or .User (or (eq .ActivePath "/trending") (eq .ActivePath "/stats"))}}lg:ml-60 pb-20 lg:pb-0{{end}} flex-1 min-h-screen flex flex-col"> 140 146 {{if or .User (or (eq .ActivePath "/trending") (eq .ActivePath "/stats"))}} 141 147 <div class="lg:hidden bg-spot-surface border-b border-spot-divider px-4 py-3 flex items-center justify-between sticky top-0 z-20"> 142 - {{template "logo-text"}} 148 + {{template "logo-link"}} 143 149 {{if .User}} 144 150 <a href="/profile/{{.User.DID}}" class="flex items-center gap-2"> 145 151 {{if .User.AvatarURL}}<img src="{{.User.AvatarURL}}" class="w-7 h-7 rounded-full">{{end}} ··· 155 161 </div> 156 162 <footer class="mt-auto"> 157 163 <div class="w-full bg-spot-surface border-t border-spot-divider"> 158 - <div class="max-w-6xl mx-auto px-4 lg:px-8 py-8"> 159 - <div class="hidden md:grid md:grid-cols-[auto_1fr_auto] md:gap-12 md:items-start"> 160 - <div> 161 - {{template "logo-text"}} 162 - <p class="text-xs text-spot-secondary mt-1 max-w-[200px]">A social RSS reader<br>on the AT Protocol.</p> 163 - </div> 164 + <div class="max-w-6xl mx-auto px-4 lg:px-8 py-6 lg:py-8"> 165 + <div class="hidden md:grid md:grid-cols-[2fr_1fr] md:gap-8 md:items-start"> 164 166 <div class="grid grid-cols-3 gap-8"> 165 167 <div class="flex flex-col gap-1.5"> 166 168 <div class="text-spot-text font-bold text-xs uppercase tracking-wide mb-1">Browse</div> ··· 204 206 </button> 205 207 <button onclick="document.getElementById('shortcuts-dialog').showModal()" class="text-xs text-spot-secondary hover:text-spot-text hover:underline inline-flex gap-1.5 items-center transition text-left"> 206 208 <svg class="w-3.5 h-3.5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6.75 7.5 3 2.25-3 2.25m4.5 0h3m-9 8.25h13.5A2.25 2.25 0 0 0 21 18V6a2.25 2.25 0 0 0-2.25-2.25H5.25A2.25 2.25 0 0 0 3 6v12a2.25 2.25 0 0 0 2.25 2.25Z"/></svg> 207 - Keyboard shortcuts 209 + Shortcuts 208 210 </button> 209 211 </div> 210 212 </div> 211 213 <div class="text-right"> 212 - <div class="text-xs text-spot-secondary">&copy; {{now.Format "2006"}} <a href="https://bsky.app/profile/julien.rbrt.fr">julien.rbrt.fr</a></div> 214 + <div class="text-xs text-spot-secondary">&copy; {{now.Format "2006"}} <a href="https://bsky.app/profile/julien.rbrt.fr" class="hover:text-spot-text transition">julien.rbrt.fr</a></div> 213 215 <div class="text-[10px] text-spot-secondary mt-0.5">Made in Europe &#127466;&#127482;</div> 214 216 </div> 215 217 </div> 216 218 217 - <div class="md:hidden flex flex-col gap-6"> 218 - {{template "logo-text"}} 219 + <div class="md:hidden flex flex-col gap-5"> 219 220 <div class="grid grid-cols-2 gap-6"> 220 221 <div class="flex flex-col gap-1.5"> 221 222 <div class="text-spot-text font-bold text-xs uppercase tracking-wide mb-1">Browse</div> 222 223 <a href="/dashboard" class="text-xs text-spot-secondary hover:text-spot-text transition">Dashboard</a> 223 224 <a href="/trending" class="text-xs text-spot-secondary hover:text-spot-text transition">Trending</a> 225 + <a href="/articles" class="text-xs text-spot-secondary hover:text-spot-text transition">Articles</a> 224 226 </div> 225 227 <div class="flex flex-col gap-1.5"> 226 228 <div class="text-spot-text font-bold text-xs uppercase tracking-wide mb-1">Library</div> 227 - <a href="/articles" class="text-xs text-spot-secondary hover:text-spot-text transition">Articles</a> 228 229 <a href="/feeds" class="text-xs text-spot-secondary hover:text-spot-text transition">Feeds</a> 229 230 <a href="/library" class="text-xs text-spot-secondary hover:text-spot-text transition">Library</a> 230 231 </div> 231 232 </div> 232 - <div class="flex flex-col gap-3"> 233 - <div class="flex items-center gap-4"> 233 + <div class="border-t border-spot-divider pt-4"> 234 + <div class="flex flex-wrap items-center gap-3"> 234 235 <button onclick="toggleTheme()" class="text-xs text-spot-secondary hover:text-spot-text inline-flex gap-1.5 items-center transition"> 235 236 <svg class="w-3.5 h-3.5 theme-icon-dark" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"/></svg> 236 237 <svg class="w-3.5 h-3.5 theme-icon-light hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"/></svg> ··· 244 245 <span class="shape-text">Squared</span> 245 246 </button> 246 247 </div> 247 - <span class="text-xs text-spot-secondary">&copy; {{now.Format "2006"}} <a href="https://bsky.app/profile/julien.rbrt.fr">julien.rbrt.fr</a> &middot; Made in Europe &#127466;&#127482;</span> 248 + <div class="border-t border-spot-divider mt-4 pt-3"> 249 + <span class="text-xs text-spot-secondary">&copy; {{now.Format "2006"}} <a href="https://bsky.app/profile/julien.rbrt.fr" class="hover:text-spot-text transition">julien.rbrt.fr</a> &middot; Made in Europe &#127466;&#127482;</span> 250 + </div> 248 251 </div> 249 252 </div> 250 253 </div>
+1 -1
internal/tmpl/login.html
··· 2 2 <div class="max-w-md mx-auto mt-20"> 3 3 <div class="bg-spot-surface rounded-xl shadow-spot-heavy p-8"> 4 4 <div class="flex justify-center mb-6"> 5 - <span class="w-14 h-14">{{template "logo-icon"}}</span> 5 + <a href="/" class="w-14 h-14 block">{{template "logo-icon"}}</a> 6 6 </div> 7 7 <h1 class="text-2xl font-bold text-spot-text mb-2 text-center">Sign in to Glean</h1> 8 8 <p class="text-spot-secondary text-sm mb-6 text-center">Enter your handle.</p>
+4 -20
internal/tmpl/partials/logo.html
··· 1 - {{define "logo-icon"}}<svg class="w-full h-full" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 - <rect width="32" height="32" rx="8" fill="#00754A"/> 3 - <ellipse cx="16" cy="20" rx="5.5" ry="6" fill="#fff"/> 4 - <path d="M10.5 19.5c-2.5-1-5.5-4-5-7.5.2-1.2 1-1.8 1.8-1.5 2 .7 3.5 4 3.8 7" fill="#fff" fill-opacity=".5"/> 5 - <path d="M21.5 19.5c2.5-1 5.5-4 5-7.5-.2-1.2-1-1.8-1.8-1.5-2 .7-3.5 4-3.8 7" fill="#fff" fill-opacity=".5"/> 6 - <line x1="13" y1="17" x2="19" y2="17" stroke="#00754A" stroke-width="1.2"/> 7 - <line x1="12.5" y1="20" x2="19.5" y2="20" stroke="#00754A" stroke-width="1.2"/> 8 - <line x1="13" y1="23" x2="19" y2="23" stroke="#00754A" stroke-width="1.2"/> 9 - <circle cx="13.5" cy="11" r="1.8" fill="#fff"/> 10 - <circle cx="18.5" cy="11" r="1.8" fill="#fff"/> 11 - <line x1="13.5" y1="9.2" x2="12" y2="6.5" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/> 12 - <line x1="18.5" y1="9.2" x2="20" y2="6.5" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/> 13 - <path d="M13 26c.5 1 1.5 1.5 3 1.5s2.5-.5 3-1.5" stroke="#fff" stroke-width="1.2" stroke-linecap="round" fill="none"/> 14 - </svg>{{end}} 15 - 16 - {{define "logo-link"}}<a href="/" class="text-spot-green font-bold text-xl tracking-tight flex items-center gap-2"> 17 - <span class="w-7 h-7">{{template "logo-icon"}}</span> 18 - <span class="font-bold text-xl text-spot-text">Glean</span> 19 - </a>{{end}} 1 + {{define "logo-icon"}}<img src="/static/favicon.svg" class="w-full h-full" alt="Glean">{{end}} 20 2 21 - {{define "logo-text"}}<a href="/" class="text-spot-green font-bold text-lg tracking-tight"><span class="font-bold text-xl text-spot-text">Glean</span>.at</a>{{end}} 3 + {{define "logo-link"}}<a href="/" class="font-bold text-xl tracking-tight flex items-center gap-2"> 4 + <span class="w-7 h-7">{{template "logo-icon"}}</span><span class="text-spot-text">Glean</span> 5 + </a>{{end}}
+2 -2
internal/tmpl/trending.html
··· 1 1 {{define "trending.html"}} 2 2 {{if not .User}} 3 - <div class="bg-spot-surface rounded-xl shadow-spot-heavy p-6 mb-6 flex items-center justify-between gap-4"> 3 + <div class="bg-spot-surface rounded-xl shadow-spot-heavy p-6 mb-6 flex items-center justify-between gap-4 flex-wrap"> 4 4 <div> 5 5 <p class="text-sm text-spot-text font-bold">Sign in to like, annotate, and get personalized recommendations.</p> 6 6 </div> ··· 8 8 </div> 9 9 {{end}} 10 10 11 - <div class="flex items-center justify-between mb-2"> 11 + <div class="flex items-center justify-between mb-2 flex-wrap gap-2"> 12 12 <h1 class="text-2xl font-bold text-spot-text">Trending</h1> 13 13 <div class="flex gap-2"> 14 14 <a href="/trending?scope=all"
static/apple-touch-icon.png

This is a binary file and will not be displayed.

static/banner.png

This is a binary file and will not be displayed.

static/favicon.png

This is a binary file and will not be displayed.

+25 -13
static/favicon.svg
··· 1 - <svg class="w-full h-full" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 - <rect width="32" height="32" rx="8" fill="#00754A"/> 3 - <ellipse cx="16" cy="20" rx="5.5" ry="6" fill="#fff"/> 4 - <path d="M10.5 19.5c-2.5-1-5.5-4-5-7.5.2-1.2 1-1.8 1.8-1.5 2 .7 3.5 4 3.8 7" fill="#fff" fill-opacity=".5"/> 5 - <path d="M21.5 19.5c2.5-1 5.5-4 5-7.5-.2-1.2-1-1.8-1.8-1.5-2 .7-3.5 4-3.8 7" fill="#fff" fill-opacity=".5"/> 6 - <line x1="13" y1="17" x2="19" y2="17" stroke="#00754A" stroke-width="1.2"/> 7 - <line x1="12.5" y1="20" x2="19.5" y2="20" stroke="#00754A" stroke-width="1.2"/> 8 - <line x1="13" y1="23" x2="19" y2="23" stroke="#00754A" stroke-width="1.2"/> 9 - <circle cx="13.5" cy="11" r="1.8" fill="#fff"/> 10 - <circle cx="18.5" cy="11" r="1.8" fill="#fff"/> 11 - <line x1="13.5" y1="9.2" x2="12" y2="6.5" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/> 12 - <line x1="18.5" y1="9.2" x2="20" y2="6.5" stroke="#fff" stroke-width="1.3" stroke-linecap="round"/> 13 - <path d="M13 26c.5 1 1.5 1.5 3 1.5s2.5-.5 3-1.5" stroke="#fff" stroke-width="1.2" stroke-linecap="round" fill="none"/> 1 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"> 2 + <defs> 3 + <linearGradient id="bgGrad" x1="0" y1="0" x2="0" y2="1"> 4 + <stop offset="0%" stop-color="#00754A"/> 5 + <stop offset="100%" stop-color="#006241"/> 6 + </linearGradient> 7 + </defs> 8 + 9 + <rect width="500" height="500" rx="115" fill="url(#bgGrad)"/> 10 + <g transform="translate(250,250) scale(0.82) translate(-250,-280)"> 11 + <path d="M 325 290 C 450 260 510 170 495 85 C 400 130 360 200 325 290 Z" fill="#d4e9e2" opacity="0.75"/> 12 + <path d="M 175 290 C 50 260 -10 170 5 85 C 100 130 140 200 175 290 Z" fill="#d4e9e2" opacity="0.75"/> 13 + <path d="M 218 185 C 212 148 185 130 155 138" fill="none" stroke="#f2f2f2" stroke-width="11" stroke-linecap="round" opacity="0.55"/> 14 + <circle cx="155" cy="138" r="13" fill="#f2f2f2"/> 15 + <path d="M 282 185 C 288 148 315 130 345 138" fill="none" stroke="#f2f2f2" stroke-width="11" stroke-linecap="round" opacity="0.55"/> 16 + <circle cx="345" cy="138" r="13" fill="#f2f2f2"/> 17 + <rect x="155" y="165" width="190" height="290" rx="95" fill="#f2f2f2"/> 18 + <circle cx="215" cy="230" r="22" fill="#00754A"/> 19 + <circle cx="285" cy="230" r="22" fill="#00754A"/> 20 + <circle cx="220" cy="224" r="7" fill="#f2f2f2"/> 21 + <circle cx="290" cy="224" r="7" fill="#f2f2f2"/> 22 + <rect x="195" y="315" width="110" height="18" rx="9" fill="#00754A"/> 23 + <rect x="195" y="355" width="110" height="18" rx="9" fill="#00754A"/> 24 + <rect x="195" y="395" width="70" height="18" rx="9" fill="#00754A"/> 25 + </g> 14 26 </svg>
+14
static/manifest.json
··· 1 + { 2 + "name": "Glean", 3 + "short_name": "Glean", 4 + "description": "A social RSS reader on the AT Protocol.", 5 + "start_url": "/dashboard", 6 + "display": "standalone", 7 + "background_color": "#0a1814", 8 + "theme_color": "#00754A", 9 + "icons": [ 10 + { "src": "/static/favicon.svg", "sizes": "any", "type": "image/svg+xml" }, 11 + { "src": "/static/favicon.png", "sizes": "512x512", "type": "image/png" }, 12 + { "src": "/static/apple-touch-icon.png", "sizes": "180x180", "type": "image/png" } 13 + ] 14 + }