Docker Compose + Glance YAML + Nginx + glance.theinfinity.dev
Most mornings, the internet isn’t an “ocean of knowledge.” It’s a soup of notifications. Glance takes that soup, pours it into a single bowl, and helps you keep the signal without drowning in the noise.
In this article, we’ll:
TL;DR
1) Setup: Docker Compose
Folder layout:
~/glance/
docker-compose.yml
config/
glance.ymldocker-compose.yml:
services:
glance:
container_name: glance
image: glanceapp/glance
restart: unless-stopped
volumes:
- ./config:/app/config
ports:
- 8081:8080Start it:
cd ~/glance
docker compose up -d
docker logs -f glanceAt this point, Glance should be reachable internally at http://SERVER_IP:8081. We’ll put it behind Nginx next.
2) Dashboard philosophy: what this page is actually for
This dashboard is not built to “show everything.”
It’s built to answer a few questions fast:
My Commentary: Done right, Glance becomes a daily briefing, not another time-sink."
3) Full config/glance.yml
Save the file below as config/glance.yml.
Note: since we’re placing Glance behind a reverse proxy (Nginx), I’m adding server.proxied: true so Glance can properly interpret forwarded headers."
theme:
background-color: 50 1 6
primary-color: 24 97 58
negative-color: 209 88 54
pages:
- name: "Tech"
columns:
- size: small
widgets:
- type: group
style: clean
widgets:
- type: custom-api
title: "🔥 Github Trends"
cache: 24h
url: 'https://api.ossinsight.io/v1/trends/repos/?period=past_24_hours&language=All'
template: |
<ul class="list list-gap-10 collapsible-container" data-collapse-after="10">
{{ range .JSON.Array "data.rows"}}
<li>
<a class="color-primary-if-not-visited" href="https://github.com/{{ .String "repo_name" }}">{{ .String "repo_name" }}</a>
<ul class="list-horizontal-text">
<li class="color-highlight"> {{.String "primary_language"}} </li>
<li style="display: flex; align-items: center;gap: 4px;">
{{ .Int "stars" }}
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="currentColor" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>
</svg>
</li>
<li style="display: flex; align-items: center;gap: 4px;">
{{ .Int "forks" }}
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="18" r="2" />
<circle cx="7" cy="6" r="2" />
<circle cx="17" cy="6" r="2" />
<path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" />
<path d="M12 12l0 4" />
</svg>
</li>
<li style="display: flex; align-items: center;gap: 4px;">
{{ .Int "pull_requests" }}
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
<circle cx="6" cy="6" r="3"></circle>
<circle cx="18" cy="18" r="3"></circle>
<path d="M13 6h3a2 2 0 0 1 2 2v7"></path>
<line x1="6" y1="9" x2="6" y2="21"></line>
</svg>
</li>
</ul>
<ul class="list collapsible-container">
<li style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;" class="color-subdue">
Contributors: {{ .String "contributor_logins"}}
</li>
<li>
{{ .String "description" }}
</li>
</ul>
</li>
{{ end }}
</ul>
- type: rss
title: "🔥 Product Hunt"
style: clean
feeds:
- url: https://www.producthunt.com/feed
collapse-after: 15
- type: monitor
cache: 1m
title: Services
sites:
- title: Website
url: https://theinfinity.dev
icon: https://www.theinfinity.dev/logo.svg
- size: full
widgets:
- type: rss
title: "🧠 Tech & Dev Feeds"
style: detailed-list
cache: 12h
feeds:
- url: https://www.lastweekinaws.com/newsletter/feed/
title: Last Week in AWS
- url: https://newsletter.systemdesign.one/feed
title: System Design Newsletter
- url: https://blog.bytebytego.com/feed
title: ByteByteGo
- url: https://newsletter.memesmotivations.com/feed
title: The M&Ms Newsletter
- url: https://nuvemmag.substack.com/feed
title: Nuvem Mag
- url: https://newsletter.francofernando.com/feed
title: Franco Fernando
- url: https://rss.beehiiv.com/feeds/xgTKUmMmUm.xml
title: TLDRSec
- url: https://rss.beehiiv.com/feeds/ypr2bi0H9m.xml
title: Hungry Minds
- url: https://blog.alexewerlof.com/feed
title: Alex Ewerlöf
- url: https://hellointerview.substack.com/feed
title: Hello Interview
- url: https://seattledataguy.substack.com/feed
title: Seattle Data Guy
- url: https://newsletter.systemdesigncodex.com/feed
title: System Design Codex
- url: https://blog.algomaster.io/feed
title: Algomaster
- url: https://dribbble.com/shots/popular.rss
title: Dribbble Inspiration
- type: group
title: "💬 Reddit Discussions"
style: cards
widgets:
- type: reddit
subreddit: technology
show-thumbnails: true
- type: reddit
subreddit: selfhosted
show-thumbnails: true
- type: reddit
subreddit: devops
show-thumbnails: true
- type: reddit
subreddit: kubernetes
show-thumbnails: true
- type: reddit
subreddit: n8n
show-thumbnails: true
- type: reddit
subreddit: automation
show-thumbnails: true
- type: reddit
subreddit: notebooklm
show-thumbnails: true
- type: reddit
subreddit: aicuriosity
show-thumbnails: true
- type: reddit
subreddit: GeminiNanoBanana
show-thumbnails: true
- type: reddit
subreddit: AgentsOfAI
show-thumbnails: true
- type: reddit
subreddit: OpenAI
show-thumbnails: true
- type: reddit
subreddit: ChatgptArtist
show-thumbnails: true
- type: reddit
subreddit: artificial
show-thumbnails: true
- type: reddit
subreddit: PromptEngineering
show-thumbnails: true
- type: reddit
subreddit: WritingPrompts
show-thumbnails: true
- size: small
widgets:
- type: group
style: clean
widgets:
- type: hacker-news
title: "🔥 Hacker News"
style: clean
collapse-after: 10
- type: lobsters
title: "🦞 Lobsters"
style: clean
collapse-after: 10
Restart after changes:
docker compose restart4) Community Widgets: from copy-paste to “include” level
Glance has a community-widgets repository: a shared pool of community-made widgets.
Small widgets: you can paste them directly into glance.yml.
Large widgets: split them into separate files to avoid YAML indentation pain, then include them.
Example structure:
# community widget content (could be long)Then in your main glance.yml:
widgets:
- $include: widgets/immich-stats.ymlThis keeps the main config readable and makes experimentation stupidly easy.
5) “Glance loads a bit slowly” (and why that can be normal)
Glance may cache and fetch data for multiple widgets on startup. If you keep stacking heavy sources, you may notice a few seconds of initial load time.
Practical fixes:
6) Publishing: glance.theinfinity.dev behind Nginx
6.1 DNS
Create an A record:
6.2 Nginx reverse proxy
Create:
/etc/nginx/sites-available/glance.theinfinity.dev
server {
listen 80;
server_name glance.theinfinity.dev;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_read_timeout 60s;
}
}Enable + reload:
sudo ln -s /etc/nginx/sites-available/glance.theinfinity.dev /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx6.3 SSL (Let’s Encrypt)
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d glance.theinfinity.dev7) If you expose it publicly: the simplest shield (Nginx Basic Auth)
This panel is your personal command center. It doesn’t have to be a public monument.
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd glanceadminUpdate your Nginx config:
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}Final thoughts
The power here isn’t “I installed Glance.”
The power is the combo:
glance.theinfinity.dev fits perfectly into the TheInfinity.dev ecosystem as a behind-the-scenes operations panel for discovery and content flow.