Tech Digest

Dashboards

Glance

One Go binary and one YAML file that turns RSS, Reddit, weather and Docker into a start page

DashboardsAGPL-3.0Youngarm64 builds
Last reviewed Profile maintained against the project's own documentation
Operational load
1 / 5
Set and forget
Idle memory
25 MB
typical use ~60 MB
Moving parts
1
containers in a normal deployment
Backup shape
File copy
live file copy safe

A single-binary dashboard that reads one YAML file and renders columns of feed widgets: RSS, Hacker News, Reddit, YouTube, markets, weather, server stats and Docker container health. It replaces a browser start page and the habit of opening eight news tabs every morning.

Our verdict on Glance#

Glance is deliberately not an app. It is a Go binary that reads glance.yml and renders it, and at v0.8.6 (September 2026) it is still pre-1.0 after two and a half years, which tells you how firmly the author is resisting scope. It idles around 20 to 30 MB, which is roughly a tenth of what Homepage or Homarr want, so it is the right answer on a Pi or a crowded VPS. What it deliberately does not do: no database, no per-user state, no drag-and-drop editor, no OIDC, no widget marketplace, no writing anything back to the services it displays. Auth is local usernames with bcrypt hashes and an IP block after five failed attempts in five minutes, and that is the whole security model. The real tradeoff is fragility at the edges: Reddit and other scraped sources break when upstream changes, and you fix that by upgrading, not by configuring.

Who Glance is for#

Choose it if

  • A Raspberry Pi or a 1 GB VPS where a 200 MB Node dashboard is not a reasonable use of the box
  • Someone who wants a morning-read page (HN, Lobsters, subreddits, RSS, markets) more than a service launcher
  • Operators who want the whole dashboard reviewable in a pull request, with $include splitting pages into separate files
  • People who want to add data from anything with an HTTP API using the custom-api widget instead of waiting for an official integration

Look elsewhere if

  • You need multiple users with different dashboards; multiple accounts exist but they all see the same pages
  • You need OIDC or LDAP login without putting a separate auth proxy in front
  • You want a mature, feature-frozen tool; it is pre-1.0, the config format has already changed once (!include to $include), and it will change again

What running it actually looks like#

Either a single container on port 8080 with glance.yml bind-mounted, or drop the binary on the host and run it under systemd. Nothing has to exist first except the config file, and a missing or malformed file is a hard startup failure with a line number, not a silent default. Secrets go in via ${VAR} substitution, ${secret:name} for Docker secrets, or ${readFileFromEnv:PATH}, so no API keys need to sit in the YAML itself. Behind a reverse proxy set server.proxied: true and base-url if you are not at the root. Config changes hot-reload, including files pulled in with $include, but environment variable changes need a restart. Upgrades are a new binary or image; there is no migration step because there is no state to migrate.

Resource profile#

Memory
25 MB idle, around 60 MB in ordinary use. A ~20 MB static Go binary with no database. All caching is in process, so memory scales with how many feed items you keep on screen rather than with uptime.
CPU and acceleration
Effectively zero except at fetch time. Widgets refresh on page load and on their own intervals, and a config file change triggers a reload that refetches everything at once, which is the only moment it looks busy.
Storage growth
The binary plus one YAML file, under 25 MB total. Nothing accumulates: there is no database, no article archive and no image cache on disk.
Operational load
1 of 5, Set and forget. Single process, no database, no migrations, and the entire state is one text file you can copy while it runs. The only recurring work is that scraper-backed widgets like Reddit break when the upstream changes, and you upgrade to fix them.

Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.

Data and backup surface#

There is exactly one file to keep: glance.yml, plus any files it pulls in with $include and anything in your assets-path. Copy them live, with the process running, with cp or git commit; there is no database, no WAL file and no lock to worry about. Everything else Glance holds is an in-process cache of feed items that is rebuilt on the next fetch, so a restore is: put the file back, start the binary, wait for the widgets to populate. If you used environment substitution for API keys, those live in your compose file or secrets store and need backing up separately, because the YAML alone will not start.

Derived backup shape

File copy. Copy the config and data directories. Safe while running for anything that writes atomically.

Traps and surprises#

Editing the config clears every cache

Reloading the configuration file drops all cached widget data, so every widget refetches at once. If you are iterating on a page with a dozen feeds, several rate-limited APIs (Reddit, GitHub, weather) get hammered in a burst and can start returning errors that look like broken config. Make your edits in one pass rather than saving after each line.

Reddit and other scraped widgets break upstream

The Reddit widget has repeatedly stopped working when Reddit changed its bot challenge and API behavior, and the fixes shipped in v0.8.5 and again in v0.8.6. The maintainer's own note on the v0.8.5 workaround was that he was unsure how long it would last. If a scraped widget matters to you, pin nothing and expect to upgrade when it dies.

X-Forwarded-For spoofing bypassed the auth rate limit

v0.8.6 fixed a bug where a spoofed X-Forwarded-For header let an attacker sidestep the five-failures-in-five-minutes IP block on login. If you are exposing Glance with auth enabled, run at least v0.8.6, set server.proxied: true only when a proxy you control is actually in front, and make that proxy overwrite rather than append the header.

It is pre-1.0 and the config syntax has moved

v0.8.0 replaced the old !include directive with $include because the old form was not valid YAML, and the same release reworked auth, themes and head widgets. Config written against a 0.7 tutorial will not load cleanly. Read the release notes on every minor bump rather than treating 0.x.y as a patch series.

Specifications#

Category
Dashboards and automation glue
Licence
AGPL-3.0 (Copyleft)
Written in
Go
First release
2024
Maturity
Young
Datastore
None (YAML config plus an in-memory cache)
Default ports
8080
Ships as
docker, native binary, nixos module
arm64 builds
Yes
Identity
Local accounts only. Local users only, defined in the `auth` block of the config with bcrypt hashes; there is no OIDC, no LDAP and no header trust, so put an auth proxy in front if you need real identity.
Replaces
Netvibes, Start.me, igHome, Feedly
Project site
github.com/glanceapp/glance
Source
github.com/glanceapp/glance
Documentation
github.com/glanceapp/glance/blob/main/docs/configuration.md

Alternatives to Glance#

Everything else in dashboards and automation glue, closest in operational weight first.

ToolOps loadIdle RAMLicence
Homarr2, Light500 MBApache-2.0
Homepage2, Light110 MBGPL-3.0
n8n4, Heavy400 MBSustainable Use License 1.0 (plus n8n Enterprise License for .ee files)

Where Glance comes up elsewhere#

Migration guides

Sources#

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.