Bygga
Type the product name from the box. Bygga shows every assembly step in 3D, with the parts, screws and tools for each one, and reads it out loud.
A calm, self-hosted home dashboard for a wall-mounted color e-paper frame.
Translation pending
LifestyleC# · SvelteGitHub @lrv1668-gifOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Calm, self-hosted home dashboard for a wall-mounted e-paper frame.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A calm, self-hosted home dashboard for a wall-mounted e-paper frame and any browser in the house.
Project site: hearth.lucas-vertrees.me — a tour of the frame, the dashboard and how to build one (source in site/).
/ dashboard, /calendar month grid, /ambient photo slideshow, /settings, /frame e-paper render target, and an optional /logs (Dozzle).One host runs everything behind Caddy. The Display service has the renderer screenshot /frame on a schedule, and the frame pulls the finished, dithered picture.
flowchart LR
browser["Phone / browser<br/>dashboard · settings"]
frame["E-paper frame<br/>Pi Zero 2 W + Inky 13.3″<br/>runs inkypull"]
apis["Upstream APIs<br/>Open-Meteo · Unsplash · Google Calendar<br/>Spotify · eBird · Transitland · ESPN · ZenQuotes<br/>Wikipedia · RSS"]
subgraph host["Host — Docker Compose"]
caddy["Caddy<br/>one origin"]
web["SvelteKit app<br/>dashboard + /frame page"]
services["13 .NET services<br/>Tasks · Calendar · Weather · Photos<br/>Almanac · Birds · Quote · History · RSS<br/>Trains · Sports · Spotify · Display<br/>(own SQLite each)"]
renderer["Renderer<br/>headless Chromium → 6-ink dither"]
end
browser -->|HTTPS| caddy
frame -->|"GET /display/frame (PNG)"| caddy
caddy -->|pages| web
caddy -->|"/tasks, /weather, …"| services
services -->|fetch + cache| apis
services -->|"Display, on a schedule"| renderer
renderer -->|"loads /frame"| caddy
You need Docker Engine 25+ and Compose v2.22+. Compose expects each service's .env file to exist, even if it's empty:
touch apps/services/{Almanac,Birds,Calendar,Photos,Spotify,Trains,Weather}/.env
cd infra && docker compose up --build
Open http://localhost and set the home location and time zone in Settings → Home. Tasks, quotes and news work with no keys.
Add keys only for the integrations you want. Each file is read by one service:
| Integration | File | Keys | Get a key |
|---|---|---|---|
| Unsplash photos | apps/services/Photos/.env | UNSPLASH_ACCESS_KEY | Unsplash developers |
| Spotify | apps/services/Spotify/.env | SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, SPOTIFY_REDIRECT_URI | Spotify dashboard |
| Google Calendar | apps/services/Calendar/.env | GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI | Google Cloud console |
| eBird | apps/services/Birds/.env | EBIRD_API_KEY | eBird API key |
| Transitland | apps/services/Trains/.env | TRANSITLAND_API_KEY | Transitland |
| Frost dates (optional) | apps/services/Almanac/.env | FIRST_FROST, LAST_FROST (MM-DD) | — |
LATITUDE, LONGITUDE and TZ in these files are only fallbacks until a home location is saved in Settings → Home. Every variable, including the redirect URIs to register, is listed per service in docs/SOFTWARE-DESIGN.md: Photos, Spotify, Calendar, Birds, Trains, Almanac, Weather.
docker compose watch (from infra/) runs the stack with hot reload. To run pieces natively instead (needs the .NET 10 SDK and Node.js 20+), start any service with dotnet run --project apps/services/<Service> and the frontend with cd apps/frontend && npm run dev. The ports Vite proxies to are in apps/frontend/vite.config.ts.
Before a PR, run dotnet build Hearth.slnx && dotnet test Hearth.slnx, and npm run check && npm run test in apps/frontend/. More in Development workflow.
CI publishes amd64 and arm64 images to GHCR on every green push to main. A host pulls them with infra/deploy/update.sh, run by a systemd timer. See Deploying to a host.
To build the frame itself, see docs/HARDWARE.md and the companion client inky-pull.
docs/PRODUCT.md — what Hearth is for and what's planneddocs/SOFTWARE-DESIGN.md — architecture, services, endpoints and environment variablesdocs/HARDWARE.md — the e-paper frame buildHearth is built on these open-source projects and data providers:
@lucide/svelte (ISC), DOMPurify (MPL-2.0 or Apache-2.0), svelte-dnd-action (MIT), Vitest (MIT), Prettier (MIT)AGPL-3.0 — see LICENSE.