A Dashboard That Stays on Your Server
Glance is an open-source, self-hosted dashboard designed to pull live data from multiple sources into a single, clean interface. RSS feeds, server stats, weather, Reddit threads, GitHub activity, stock prices – Glance aggregates all of it through a configuration file, runs as a lightweight Go binary, and serves everything from your own hardware. No third-party accounts, no subscription tier, no data leaving your network unless you explicitly point it somewhere.
The appeal is straightforward: one browser tab replaces a dozen. Whether you are monitoring a homelab, tracking a few stocks alongside your morning news, or just tired of opening six different sites before your coffee is hot, Glance gives you a single configurable starting point. Setup takes under 30 minutes on most Linux systems, and the resource footprint is small enough to run on a Raspberry Pi without complaint.

What You Need Before You Start
Glance can be deployed as a Docker container, a bare binary, or behind a reverse proxy like Nginx or Caddy. This guide covers the Docker path, which is the most portable and easiest to update later. You will need Docker and Docker Compose installed on your host. A machine running Ubuntu 22.04 or Debian 12 works well, though any modern Linux distribution handles it without issues. A domain name pointed at your server is optional but recommended if you plan to access the dashboard remotely.
Port 8080 is the default Glance port. If something is already running there, pick a different host port in the Compose file – the container port stays 8080 internally. You do not need to open any inbound firewall rules for local-only access. For external access, put Glance behind a reverse proxy with HTTPS rather than exposing port 8080 directly to the internet.
Installing Glance with Docker Compose
Create a project directory and a subdirectory for your configuration file. A clean structure looks like /opt/glance/config/ on the host, with the glance.yml file living inside that config folder. Glance reads this file at startup and rebuilds the page layout from it – no database, no migration scripts, just a YAML file.
Your docker-compose.yml should mount that config directory into the container and map port 8080. A minimal working Compose file looks like this:
- image: glanceapp/glance:latest
- container_name: glance
- ports: “8080:8080”
- volumes: ./config:/app/assets/user (or check the current docs for the exact mount path, as it has shifted between versions)
- restart: unless-stopped
Pull the image and bring the container up with docker compose up -d. If Glance finds a valid configuration file, it starts immediately. If the config file is missing or malformed, the container exits with an error logged to stdout – check it with docker logs glance before assuming a networking issue.
Once the container is running, open a browser and navigate to http://your-server-ip:8080. You should see either the default Glance welcome screen or whatever layout you already defined in your config. From this point forward, every change is made in glance.yml, and the dashboard reloads automatically within a few seconds of detecting a file change – no container restart required for most edits.

Building Your Configuration File
The glance.yml file controls everything: page layout, widget selection, refresh intervals, and visual theming. Glance organizes content into pages and columns. Each page gets a name and a list of columns, and each column contains an ordered list of widgets. The indentation structure is standard YAML, so a linting tool or editor with YAML support saves time during initial setup.
Widgets are the building blocks. Glance ships with a solid set out of the box – RSS feeds, weather (using the Open-Meteo API, which requires no key), server stats, a clock, Hacker News, Reddit, Docker container status, and more. Each widget type has its own set of options. An RSS widget, for example, takes a list of feed URLs, an optional item limit, and a refresh interval. A weather widget needs latitude and longitude coordinates. None of this requires signing up for anything, with the exception of certain data sources like some stock price providers that have their own API key requirements.
A practical starting layout for a homelab user might put a clock and weather summary in a narrow left column, an RSS aggregator pulling from a few tech news feeds in a wide center column, and a Docker container status widget alongside server resource stats in a right column. This three-column grid is common in Glance setups and keeps information density high without feeling cluttered. The column width ratios are configurable, so nothing is locked to an equal split.
Theming options in Glance are limited but functional. You can set a color scheme through the config file, adjusting primary and background colors to fit your preference or match other tools in your stack. There is no drag-and-drop GUI – everything goes through the YAML file. That constraint is also what makes Glance fast: it generates a static HTML page from your config and serves it with no JavaScript framework overhead. Page loads are near-instant even on low-end hardware.

If you are already running other self-hosted services – a Git server like Forgejo, for instance – Glance can surface activity feeds or status checks for those services in the same dashboard, keeping your monitoring consolidated. The Docker status widget is particularly useful here: it polls the Docker socket and shows which containers are running, stopped, or restarting, giving you a quick health check without opening Portainer or running a terminal command.
One area worth planning for early is access control. Glance has no built-in authentication. Anyone who can reach port 8080 sees your dashboard. For a local network this may be acceptable, but for any public-facing deployment, add HTTP basic auth at the reverse proxy layer. Caddy handles this with a single directive. Nginx requires a password file and a location block update. Skipping this step and exposing Glance directly to the internet means your server stats, internal feed URLs, and whatever else you have configured are visible to anyone who finds the port.





