← Back to Blog

Glance — The Ultimate Self-Hosted Dashboard for All Your Feeds in One Place

Glance — The Ultimate Self-Hosted Dashboard for All Your Feeds in One Place

What is Glance?

Glance is an open-source, self-hosted dashboard that aggregates all your feeds and information sources in a single, beautiful interface. Think of it as your personal startpage on steroids — RSS feeds, Hacker News, Reddit posts, YouTube uploads, weather forecasts, stock prices, Docker container status, and much more, all arranged in a customizable multi-column layout.

GitHub: github.com/glanceapp/glance
Stars: ⭐ 34,000+
License: AGPL-3.0
Language: Go (single <20 MB binary)

Why this matters: If you're tired of jumping between tabs to check Hacker News, Reddit, your favorite blogs, YouTube channels, stock prices, and the weather — Glance brings everything together in one page. It's fast, lightweight, and runs on any machine with Docker.

Key Features

Feature Details
Widgets RSS, Hacker News, Reddit, YouTube, Twitch, Weather, Markets, Releases, Docker, Calendar, Bookmarks, Custom API
Performance Single <20 MB binary, minimal RAM usage, uncached pages load in ~1 second
Customizability Multi-column layouts, multiple pages/tabs, custom CSS, theming
Mobile-friendly Fully responsive design, works great on phones
Auth (v0.8+) Built-in authentication support, optional
Docker-native Official Docker image, one-liner deploy

Architecture Overview

Glance follows a clean, simple architecture. A single Go binary serves a web dashboard that fetches data from multiple external sources, caches results, and renders everything server-side into a responsive interface.

Glance Architecture

Here's how the data flows:

  1. User Browser makes an HTTP request to the Glance Server (port 8080)
  2. The Config Parser reads glance.yml to determine page layout, columns, and widget configuration
  3. The Widget Engine fetches data from each configured source (RSS feeds, APIs, etc.)
  4. Results pass through the Cache Layer with configurable TTLs per widget
  5. The server renders the HTML and serves it to the browser
  6. Docker Volumes persist configuration and custom CSS/assets

The architecture is intentionally stateless — no database required, no background workers. Data is fetched on page load and cached for the configured duration.

Prerequisites

  • A server with Docker and Docker Compose installed
  • A domain or IP address to access the dashboard
  • 256 MB RAM minimum (512 MB recommended)
  • Optional: a reverse proxy (Nginx, Caddy, or Traefik) for TLS and custom domains

Step-by-Step Setup Guide

Step 1: Create the Project Directory

mkdir -p glance/config && cd glance

Step 2: Create docker-compose.yml

Create a docker-compose.yml file:

services:
glance:
  container_name: glance
  image: glanceapp/glance:latest
  restart: unless-stopped
  ports:
    - "8080:8080"
  volumes:
    - ./config:/app/config
    - ./assets:/app/assets
  environment:
    - TZ=Europe/Paris

Or use the one-liner template from the project:

curl -sL https://github.com/glanceapp/docker-compose-template/archive/refs/heads/main.tar.gz | tar -xzf - --strip-components 2

Step 3: Create the Configuration File

Create config/glance.yml with your preferred widgets. Here's a complete example:

pages:
- name: Home
  columns:
    - size: small
      widgets:
        - type: calendar
          first-day-of-week: monday

        - type: rss
          limit: 10
          collapse-after: 3
          cache: 12h
          feeds:
            - url: https://selfh.st/rss/
              title: selfh.st
            - url: https://ciechanow.ski/atom.xml
            - url: https://www.joshwcomeau.com/rss.xml
              title: Josh Comeau

        - type: weather
          location: Paris, France
          units: metric
          hour-format: 24h

    - size: full
      widgets:
        - type: group
          widgets:
            - type: hacker-news
            - type: lobsters

        - type: videos
          channels:
            - UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips
            - UCsBjURrPoezykLs9EqgamOA # Fireship
            - UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium

        - type: reddit
          subreddit: selfhosted
          show-thumbnails: true

    - size: small
      widgets:
        - type: markets
          markets:
            - symbol: BTC-USD
              name: Bitcoin
            - symbol: ETH-USD
              name: Ethereum
            - symbol: SPY
              name: S&P 500

        - type: releases
          cache: 1d
          repositories:
            - glanceapp/glance
            - immich-app/immich
            - syncthing/syncthing

        - type: bookmark
          links:
            - icon: github
              url: https://github.com
              text: GitHub
            - icon: docker
              url: https://hub.docker.com
              text: Docker Hub

Step 4: Start Glance

docker compose up -d

Verify it's running:

docker compose ps

You should see:

NAME      IMAGE                      STATUS          PORTS
glance    glanceapp/glance:latest    Up 2 minutes    0.0.0.0:8080->8080/tcp

Open your browser and go to http://YOUR_SERVER_IP:8080. You should see your dashboard with all configured widgets.

Step 5: Add Authentication (Optional)

Since v0.8.0, Glance supports built-in authentication. Add this to your glance.yml:

theme:
  light: dark

authentication:
  method: basic
  users:
    - username: admin
      password: your-secure-password

Then restart:

docker compose restart

Step 6: Set Up a Reverse Proxy (Recommended)

For production use, put Glance behind a reverse proxy with TLS. Here's a Caddy example:

dashboard.yourdomain.com {
    reverse_proxy glance:8080
}

And update your docker-compose.yml to join the proxy network:

services:
  glance:
    # ... existing config ...
    networks:
      - proxy
      - default

networks:
  proxy:
    external: true

Widget Reference

Here's a quick reference of all available widgets:

  • RSS — Subscribe to any RSS/Atom feed
  • Hacker News — Top stories from news.ycombinator.com
  • Reddit — Posts from any subreddit
  • Lobsters — Top stories from lobste.rs
  • YouTube — Latest uploads from any channel
  • Twitch — Online status of Twitch channels
  • Weather — Forecast from Open-Meteo (no API key needed)
  • Markets — Stock prices and crypto quotes
  • Releases — Latest GitHub releases for tracked repos
  • Docker Containers — Status of running Docker containers
  • Calendar — A simple monthly calendar
  • Bookmarks — Custom link collections
  • Monitor — HTTP endpoint health checks
  • Server Stats — CPU, RAM, disk usage
  • Custom API — Fetch JSON from any API and render custom HTML
  • HTML — Embed arbitrary HTML content
  • iFrame — Embed external websites

Verification Checklist

  • Dashboard loads at http://YOUR_IP:8080
  • All configured widgets display content
  • RSS feeds show recent articles
  • Weather widget shows correct location and forecast
  • YouTube widget shows latest videos
  • Markets widget shows current prices
  • Calendar widget displays current month
  • Mobile viewport is responsive and readable
  • (Optional) Authentication works on page refresh
  • (Optional) TLS certificate works via reverse proxy

Tips & Best Practices

  1. Start simple — Add a few widgets first, then expand. Don't overload your first config file.
  2. Use the cache parameter — Set cache: 5m for time-sensitive widgets like markets, cache: 1h for feeds.
  3. Create multiple pages — Use the pages array to create separate tabs for different categories (Tech News, Finance, Social).
  4. Custom CSS — Create an assets/user.css file to customize colors, fonts, and layout beyond the built-in themes.
  5. Pi-Hole users — If requests time out, increase the rate limit in your ad-blocking DNS service, which defaults to a low threshold.
  6. GitHub token — Add a read-only token for the releases widget to avoid hitting the 60 req/h unauthenticated limit.
# In glance.yml, under releases widget:
- type: releases
  token: ghp_your_readonly_token
  repositories:
    - glanceapp/glance

Troubleshooting

Dashboard loads but widgets are empty → Check the logs: docker compose logs. Most issues are DNS-related or the external source being unreachable.

"cannot unmarshal !!map into []glance.page" error → You have a pages key at the top of an included page file. Remove it — included pages should only contain column definitions.

Broken layout with Dark Reader extension → Add dashboard.yourdomain.com to Dark Reader's ignore list, or disable it for the site.

Requests timing out → Common with Pi-Hole/AdGuard Home. Increase the rate limit in those services, or add networks: podman: external: true if using Podman.

Resources

← Retour au Blog

Glance — Le Tableau de Bord Auto-Hébergé Ultime pour Tous Vos Flux en Un Seul Endroit

Glance — Le Tableau de Bord Auto-Hébergé Ultime pour Tous Vos Flux en Un Seul Endroit

Qu'est-ce que Glance ?

Glance est un tableau de bord open-source auto-hébergé qui agrège tous vos flux et sources d'information dans une seule interface magnifique. Considérez-le comme votre page de démarrage personnelle surpuissante — flux RSS, Hacker News, posts Reddit, vidéos YouTube, prévisions météo, cours boursiers, statut des conteneurs Docker et bien plus, le tout organisé dans une disposition multi-colonnes personnalisable.

GitHub: github.com/glanceapp/glance
Stars: ⭐ 34 000+
Licence: AGPL-3.0
Langage: Go (binaire unique <20 Mo)

Pourquoi c'est important : Si vous en avez assez de passer d'un onglet à l'autre pour vérifier Hacker News, Reddit, vos blogs préférés, YouTube, les cours boursiers et la météo — Glance rassemble tout sur une seule page. Rapide, léger et fonctionne sur n'importe quelle machine avec Docker.

Fonctionnalités Clés

Fonctionnalité Détails
Widgets RSS, Hacker News, Reddit, YouTube, Twitch, Météo, Marchés, Versions, Docker, Calendrier, Signets, API personnalisée
Performance Binaire unique <20 Mo, utilisation RAM minimale, pages non mises en cache chargées en ~1 seconde
Personnalisation Dispositions multi-colonnes, plusieurs pages/onglets, CSS personnalisé, thèmes
Adapté mobile Design responsive complet, fonctionne parfaitement sur téléphone
Authentification (v0.8+) Support d'authentification intégré, optionnel
Natif Docker Image Docker officielle, déploiement en une ligne

Architecture

Glance suit une architecture simple et propre. Un seul binaire Go sert un tableau de bord web qui récupère les données de multiples sources externes, met en cache les résultats et affiche tout côté serveur dans une interface responsive.

Architecture Glance

Voici comment les données circulent :

  1. Le Navigateur Utilisateur envoie une requête HTTP au Serveur Glance (port 8080)
  2. L'Analyseur de Configuration lit glance.yml pour déterminer la disposition, les colonnes et la configuration des widgets
  3. Le Moteur de Widgets récupère les données de chaque source configurée (flux RSS, API, etc.)
  4. Les résultats passent par la Couche de Cache avec des TTL configurables par widget
  5. Le serveur génère le HTML et le sert au navigateur
  6. Les Volumes Docker persistent la configuration et les CSS/assets personnalisés

L'architecture est intentionnellement sans état — pas de base de données, pas de workers en arrière-plan. Les données sont récupérées au chargement de la page et mises en cache pour la durée configurée.

Prérequis

  • Un serveur avec Docker et Docker Compose installés
  • Un nom de domaine ou une adresse IP pour accéder au tableau de bord
  • 256 Mo de RAM minimum (512 Mo recommandé)
  • Optionnel : un proxy inverse (Nginx, Caddy ou Traefik) pour TLS et domaines personnalisés

Guide d'Installation Pas à Pas

Étape 1 : Créer le Répertoire du Projet

mkdir -p glance/config && cd glance

Étape 2 : Créer docker-compose.yml

Créez un fichier docker-compose.yml :

services:
glance:
  container_name: glance
  image: glanceapp/glance:latest
  restart: unless-stopped
  ports:
    - "8080:8080"
  volumes:
    - ./config:/app/config
    - ./assets:/app/assets
  environment:
    - TZ=Europe/Paris

Ou utilisez le modèle pré-configuré du projet :

curl -sL https://github.com/glanceapp/docker-compose-template/archive/refs/heads/main.tar.gz | tar -xzf - --strip-components 2

Étape 3 : Créer le Fichier de Configuration

Créez config/glance.yml avec vos widgets préférés. Voici un exemple complet :

pages:
- name: Accueil
  columns:
    - size: small
      widgets:
        - type: calendar
          first-day-of-week: monday

        - type: rss
          limit: 10
          collapse-after: 3
          cache: 12h
          feeds:
            - url: https://selfh.st/rss/
              title: selfh.st
            - url: https://ciechanow.ski/atom.xml
            - url: https://www.joshwcomeau.com/rss.xml
              title: Josh Comeau

        - type: weather
          location: Paris, France
          units: metric
          hour-format: 24h

    - size: full
      widgets:
        - type: group
          widgets:
            - type: hacker-news
            - type: lobsters

        - type: videos
          channels:
            - UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips
            - UCsBjURrPoezykLs9EqgamOA # Fireship
            - UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium

        - type: reddit
          subreddit: selfhosted
          show-thumbnails: true

    - size: small
      widgets:
        - type: markets
          markets:
            - symbol: BTC-USD
              name: Bitcoin
            - symbol: ETH-USD
              name: Ethereum
            - symbol: SPY
              name: S&P 500

        - type: releases
          cache: 1d
          repositories:
            - glanceapp/glance
            - immich-app/immich
            - syncthing/syncthing

        - type: bookmark
          links:
            - icon: github
              url: https://github.com
              text: GitHub
            - icon: docker
              url: https://hub.docker.com
              text: Docker Hub

Étape 4 : Démarrer Glance

docker compose up -d

Vérifiez que ça fonctionne :

docker compose ps

Vous devriez voir :

NAME      IMAGE                      STATUS          PORTS
glance    glanceapp/glance:latest    Up 2 minutes    0.0.0.0:8080->8080/tcp

Ouvrez votre navigateur et allez sur http://VOTRE_IP_SERVEUR:8080. Vous devriez voir votre tableau de bord avec tous les widgets configurés.

Étape 5 : Ajouter l'Authentification (Optionnel)

Depuis la v0.8.0, Glance supporte l'authentification intégrée. Ajoutez ceci à votre glance.yml :

theme:
  light: dark

authentication:
  method: basic
  users:
    - username: admin
      password: votre-mot-de-passe-securise

Puis redémarrez :

docker compose restart

Étape 6 : Configurer un Proxy Inverse (Recommandé)

Pour une utilisation en production, placez Glance derrière un proxy inverse avec TLS. Exemple avec Caddy :

dashboard.votredomaine.com {
    reverse_proxy glance:8080
}

Et mettez à jour votre docker-compose.yml pour rejoindre le réseau du proxy :

services:
  glance:
    # ... configuration existante ...
    networks:
      - proxy
      - default

networks:
  proxy:
    external: true

Référence des Widgets

Voici une référence rapide des widgets disponibles :

  • RSS — Abonnez-vous à n'importe quel flux RSS/Atom
  • Hacker News — Articles populaires de news.ycombinator.com
  • Reddit — Posts de n'importe quel subreddit
  • Lobsters — Articles populaires de lobste.rs
  • YouTube — Dernières vidéos de n'importe quelle chaîne
  • Twitch — Statut en ligne des chaînes Twitch
  • Météo — Prévisions via Open-Meteo (pas de clé API nécessaire)
  • Marchés — Cours boursiers et cotations crypto
  • Versions — Dernières versions GitHub des dépôts suivis
  • Conteneurs Docker — Statut des conteneurs Docker en cours d'exécution
  • Calendrier — Calendrier mensuel simple
  • Signets — Collections de liens personnalisées
  • Monitor — Vérifications de santé des points de terminaison HTTP
  • Stats Serveur — Utilisation CPU, RAM, disque
  • API Personnalisée — Récupérez du JSON depuis n'importe quelle API et affichez du HTML personnalisé
  • HTML — Intégrez du contenu HTML arbitraire
  • iFrame — Intégrez des sites web externes

Liste de Vérification

  • Le tableau de bord se charge sur http://VOTRE_IP:8080
  • Tous les widgets configurés affichent du contenu
  • Les flux RSS montrent des articles récents
  • La météo affiche la bonne localisation et les prévisions
  • YouTube montre les dernières vidéos
  • Les marchés affichent les cours actuels
  • Le calendrier affiche le mois en cours
  • La vue mobile est responsive et lisible
  • (Optionnel) L'authentification fonctionne après rafraîchissement
  • (Optionnel) Le certificat TLS fonctionne via le proxy inverse

Conseils et Bonnes Pratiques

  1. Commencez simplement — Ajoutez quelques widgets d'abord, puis développez. Ne surchargez pas votre premier fichier de configuration.
  2. Utilisez le paramètre cache — Mettez cache: 5m pour les widgets sensibles au temps comme les marchés, cache: 1h pour les flux.
  3. Créez plusieurs pages — Utilisez le tableau pages pour créer des onglets séparés pour différentes catégories (Actus Tech, Finance, Social).
  4. CSS personnalisé — Créez un fichier assets/user.css pour personnaliser les couleurs, polices et la disposition au-delà des thèmes intégrés.
  5. Utilisateurs Pi-Hole — Si les requêtes expirent, augmentez la limite de débit dans votre service DNS anti-pub, qui a par défaut un seuil bas.
  6. Token GitHub — Ajoutez un token en lecture seule pour le widget releases afin d'éviter la limite de 60 req/h non authentifiée.
# Dans glance.yml, sous le widget releases :
- type: releases
  token: ghp_votre_token_lecture_seule
  repositories:
    - glanceapp/glance

Dépannage

Le tableau de bord se charge mais les widgets sont vides → Vérifiez les logs : docker compose logs. La plupart des problèmes sont liés au DNS ou à une source externe inaccessible.

Erreur "cannot unmarshal !!map into []glance.page" → Vous avez une clé pages en haut d'un fichier de page inclus. Supprimez-la — les pages incluses ne doivent contenir que des définitions de colonnes.

Disposition cassée avec l'extension Dark Reader → Ajoutez dashboard.votredomaine.com à la liste d'ignorance de Dark Reader, ou désactivez-le pour le site.

Requêtes qui expirent → Frequent avec Pi-Hole/AdGuard Home. Augmentez la limite de débit dans ces services, ou ajoutez networks: podman: external: true si vous utilisez Podman.

Ressources