{"id":50514343,"url":"https://github.com/olafkfreund/gnome-quick-web-apps","last_synced_at":"2026-06-02T23:00:36.176Z","repository":{"id":361848316,"uuid":"1256087474","full_name":"olafkfreund/gnome-quick-web-apps","owner":"olafkfreund","description":"Turn any website into a first-class GNOME desktop app — GTK4/libadwaita web-app manager with PWA manifest autofill, auto icons, scope confinement and CEF rendering","archived":false,"fork":false,"pushed_at":"2026-06-01T15:03:44.000Z","size":62,"stargazers_count":0,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T15:18:57.489Z","etag":null,"topics":["cef","gnome","gtk4","libadwaita","linux-desktop","pwa","rust","webapp"],"latest_commit_sha":null,"homepage":"https://olafkfreund.github.io/gnome-quick-web-apps/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/olafkfreund.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T12:57:49.000Z","updated_at":"2026-06-01T14:51:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/olafkfreund/gnome-quick-web-apps","commit_stats":null,"previous_names":["olafkfreund/gnome-quick-web-apps"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/olafkfreund/gnome-quick-web-apps","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olafkfreund%2Fgnome-quick-web-apps","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olafkfreund%2Fgnome-quick-web-apps/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olafkfreund%2Fgnome-quick-web-apps/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olafkfreund%2Fgnome-quick-web-apps/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/olafkfreund","download_url":"https://codeload.github.com/olafkfreund/gnome-quick-web-apps/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olafkfreund%2Fgnome-quick-web-apps/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33840214,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cef","gnome","gtk4","libadwaita","linux-desktop","pwa","rust","webapp"],"created_at":"2026-06-02T23:00:23.166Z","updated_at":"2026-06-02T23:00:36.171Z","avatar_url":"https://github.com/olafkfreund.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eGNOME Quick Web Apps\u003c/h1\u003e\n  \u003cp\u003e\u003cb\u003eTurn any website into a first-class GNOME desktop app.\u003c/b\u003e\u003c/p\u003e\n  \u003cp\u003eA GTK4 / libadwaita web-app manager with PWA manifest auto-detection,\n     automatic icons, true URL-scope confinement, and bundled Chromium (CEF)\n     rendering for broad site and codec compatibility.\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://olafkfreund.github.io/gnome-quick-web-apps/\"\u003eWebsite\u003c/a\u003e ·\n    \u003ca href=\"https://github.com/olafkfreund/gnome-quick-web-apps/issues\"\u003eIssues\u003c/a\u003e ·\n    \u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cbr\u003e\n\n  \u003cimg alt=\"Multiple web apps running as native GNOME windows\" src=\"resources/screenshots/running-apps.png\" width=\"860\"\u003e\u003cbr\u003e\n  \u003cem\u003eYour web apps run as real, separate GNOME windows — tile them, Alt-Tab between them, each with its own icon and session.\u003c/em\u003e\n\n  \u003cbr\u003e\u003cbr\u003e\n\n  \u003cimg alt=\"A web app rendering natively\" src=\"resources/screenshots/app-window.png\" width=\"860\"\u003e\u003cbr\u003e\n  \u003cem\u003eCrisp native rendering with a proper window — Google Docs here, indistinguishable from a desktop app.\u003c/em\u003e\n\n  \u003cbr\u003e\u003cbr\u003e\n\n  \u003cimg alt=\"Manage your web apps\" src=\"resources/screenshots/manager.png\" width=\"720\"\u003e\u003cbr\u003e\n  \u003cem\u003eManage all your web apps in one place — each with its own icon, profile and dock identity.\u003c/em\u003e\n\n  \u003cbr\u003e\u003cbr\u003e\n\n  \u003ctable\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" width=\"50%\"\u003e\n        \u003cimg alt=\"Add from a curated template catalog\" src=\"resources/screenshots/templates.png\"\u003e\u003cbr\u003e\n        \u003cem\u003eOne-click templates for 50+ popular apps.\u003c/em\u003e\n      \u003c/td\u003e\n      \u003ctd align=\"center\" width=\"50%\"\u003e\n        \u003cimg alt=\"Editor with profiles and default-handler toggles\" src=\"resources/screenshots/editor.png\"\u003e\u003cbr\u003e\n        \u003cem\u003ePer-app profiles, icons, and dynamic “default for…” toggles.\u003c/em\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e\n\n  \u003cbr\u003e\n\n  \u003cimg alt=\"Microsoft Teams running as a native window on a Work profile\" src=\"resources/screenshots/teams.png\" width=\"860\"\u003e\u003cbr\u003e\n  \u003cem\u003eMicrosoft Teams on a shared “Work” profile — note the profile indicator in the title bar. Apps sharing a profile run side by side with one shared login.\u003c/em\u003e\n\n  \u003cbr\u003e\u003cbr\u003e\n\n  \u003ctable\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" width=\"50%\"\u003e\n        \u003cimg alt=\"YouTube Music playing in its own window\" src=\"resources/screenshots/youtube-music.png\"\u003e\u003cbr\u003e\n        \u003cem\u003eYouTube Music with full audio — a real media app, not a tab.\u003c/em\u003e\n      \u003c/td\u003e\n      \u003ctd align=\"center\" width=\"50%\"\u003e\n        \u003cimg alt=\"YouTube video playing with full codec support\" src=\"resources/screenshots/youtube-video.png\"\u003e\u003cbr\u003e\n        \u003cem\u003eVideo plays out of the box — Chromium (CEF) brings the full codec set.\u003c/em\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e\n\u003c/div\u003e\n\n---\n\n\u003e [!NOTE]\n\u003e **Built with AI assistance.** This project was developed using\n\u003e [Claude Code](https://claude.com/claude-code) (Anthropic) under continuous\n\u003e human review and supervision. Every change was reviewed, tested, and approved\n\u003e by a human maintainer.\n\n## What is this?\n\nA native GNOME alternative to [`cosmic-utils/web-apps`](https://github.com/cosmic-utils/web-apps)\n(Quick Web Apps for the COSMIC desktop). You paste a URL, the app detects the\nsite's Web App Manifest, fills in the name/icon/theme for you, and installs a\nlauncher into your GNOME app grid. Each web app runs in its own isolated\nwindow with its own profile and its own dock identity.\n\n### Why it's better than the original\n\n| | Quick Web Apps (COSMIC) | **GNOME Quick Web Apps** |\n| --- | --- | --- |\n| UI toolkit | libcosmic (iced) | **GTK4 + libadwaita** — native GNOME |\n| Setup | type everything manually | **paste a URL → form autofills** from the PWA manifest |\n| Icons | pick from Papirus / lettered | **auto-downloaded** best manifest/apple-touch icon, lettered fallback |\n| Navigation | open browser window | **scope confinement** — off-scope links open in your system browser |\n| Per-app | basic | **profiles, link mode, light/dark, adblock, zoom, custom CSS, UA, permissions, background mode** |\n| Identity | one window | **colored profile indicator** + SSO/CAPTCHA-aware link handling |\n| Discovery | app grid only | app grid **+ GNOME Shell search provider** (planned) |\n\nRendering uses **CEF (Chromium Embedded Framework)** for broad site\ncompatibility (full codec set, Chrome-only sites), the same engine choice as\nupstream's v3.\n\n\u003e **DRM streaming (Netflix, Apple Music, Spotify Web) — known issue, work in\n\u003e progress.** These need the proprietary Widevine CDM, which can't be bundled.\n\u003e Quick Web Apps now reuses the CDM from a host Chromium-family browser (Chrome,\n\u003e Chromium, Edge, Brave, Vivaldi) when one is installed, and the CDM loads\n\u003e correctly — but some services still report a protected-content error\n\u003e (e.g. Netflix `M7701-1003`). We're actively working on fully enabling DRM\n\u003e playback; follow [#36](https://github.com/olafkfreund/gnome-quick-web-apps/issues/36)\n\u003e for progress. Non-DRM video and the full codec set work today.\n\n## Features\n\nEach web app is a real GNOME window with its own icon, profile and dock\nidentity — and a set of per-app controls you won't find in a plain \"install as\napp\" button:\n\n- **One-click templates** — 50+ curated apps (Gmail, Teams, Spotify, WhatsApp,\n  Notion, Figma, the major AI tools…) added with the right icon in a click.\n- **Shared or isolated logins** — group apps onto a named profile to sign in\n  once, or keep each app private. Apps sharing a profile **run side by side**\n  (one process, one shared session). A **colored profile indicator** in the\n  manager and window shows which identity an app uses (e.g. Work vs Private).\n- **Spoof the browser OS** — an \"Identify as\" option (Windows / macOS / Mobile /\n  custom user agent) for services that gate features by operating system.\n- **Smart link handling** — a tri-state per app: keep everything in-window, or\n  send other sites to your browser by registrable domain or by exact host. A\n  built-in **identity/SSO/CAPTCHA allowlist** keeps multi-domain sign-in\n  (Microsoft, Google, Okta, Cloudflare) working in-window, and we never eject a\n  POST navigation (no broken `AADSTS900561`-style logins).\n- **Default handlers** — make a web app your system default for email, calendar\n  or calls, including deep links with no Linux app (Teams `msteams:`, Zoom). It\n  degrades gracefully on declaratively-managed (NixOS/home-manager) systems.\n- **Sticky GNOME notifications** — desktop notifications carry the app's name +\n  icon and stay in the notification list, and **background-app mode** keeps an\n  app running (hidden) so notifications keep arriving after you close the window.\n- **Built-in ad/tracker blocker** — an optional per-app network blocklist.\n- **Appearance \u0026 comfort** — force **light/dark** per app (independent of the\n  system theme), inject **custom CSS**, set a per-app user agent / mobile mode,\n  and **page zoom** (Ctrl+scroll / Ctrl+±/0) that — along with window size — is\n  **remembered between sessions**.\n- **Permission policy** — notifications/clipboard are granted; camera/mic and\n  location are denied unless you opt in per app.\n- **Crisp on HiDPI** — renders at the display's true (fractional) scale, so it\n  stays sharp on scaled and fractional-scaling (e.g. Niri) setups.\n- **Downloads** — saved to your Downloads folder.\n- **Automatic icons** — best manifest/apple-touch icon, an online icon search,\n  your own file, or a generated lettered fallback.\n\n## Architecture\n\n```\ncrates/core      shared model, JSON storage, PWA manifest detection,\n                 icon pipeline, DynamicLauncher (.desktop) install\ncrates/manager   GTK4/libadwaita editor — create/edit/delete web apps\ncrates/runner    CEF binary launched by each .desktop (per-app window)\ndocs/            GitHub Pages showcase site\n```\n\nTwo upstream techniques are reused (and are why this project is GPL-3.0):\nthe **XDG DynamicLauncher portal** for sandbox-safe `.desktop` install, and\n`StartupWMClass` per app so each window gets its own dock/Alt-Tab identity.\n\n## Roadmap\n\n- [x] **Phase 1 — Core + Manager (parity):** data model, storage, launcher install, GTK4 manager listing/CRUD.\n- [x] **Phase 2 — Differentiators:** PWA manifest autofill, auto-icon download, scope confinement, per-app UA, adblock, default handlers, profiles.\n- [x] **Phase 3 — Native shell:** CEF off-screen rendering inside a libadwaita window with a real header bar, per-app zoom/CSS, light/dark, HiDPI.\n- [x] **Phase 4 — Polish:** background mode, downloads, permission policy, profile indicator, prebuilt release bundles (Nix + Flatpak).\n- [ ] **Later:** GNOME Shell search provider, import from COSMIC / Linux Mint webapp-manager.\n\nThe initial roadmap is complete (releases up to **v0.1.4**). New work is tracked\nas standalone [issues](https://github.com/olafkfreund/gnome-quick-web-apps/issues).\n\n## Installation\n\n### NixOS / Nix (flake)\n\n```sh\n# Try it without installing\nnix run github:olafkfreund/gnome-quick-web-apps\n\n# Install into your profile\nnix profile install github:olafkfreund/gnome-quick-web-apps\n```\n\nIn a NixOS or Home Manager config:\n\n```nix\n{\n  inputs.quick-web-apps.url = \"github:olafkfreund/gnome-quick-web-apps\";\n\n  # then, in your packages:\n  environment.systemPackages = [ inputs.quick-web-apps.packages.${pkgs.system}.default ];\n  # or home.packages = [ ... ];\n}\n```\n\nThe flake pins the matching CEF build and patches it for NixOS, so no manual\nsetup is needed.\n\n### Declarative web apps (the Nix way)\n\nBeyond installing the package, the flake ships a **Home Manager module** so you\ncan define your web apps declaratively — in your config, reproducible across\nmachines — instead of (or alongside) the GUI manager. Each declared app is\nwritten as the same `apps/\u003cid\u003e.json` the runner reads, plus a matching\n`.desktop` launcher, with no activation scripts or portal calls.\n\n```nix\n{\n  inputs.quick-web-apps.url = \"github:olafkfreund/gnome-quick-web-apps\";\n\n  # Import the module in your Home Manager configuration:\n  imports = [ inputs.quick-web-apps.homeManagerModules.default ];\n\n  programs.quick-web-apps = {\n    enable = true;                       # also installs the package\n\n    apps.youtube-music = {\n      name = \"YouTube Music\";\n      url = \"https://music.youtube.com\";\n      category = \"Audio\";\n      showBadge = false;\n    };\n\n    apps.teams = {\n      name = \"Microsoft Teams\";\n      url = \"https://teams.microsoft.com\";\n      category = \"Network\";\n      runInBackground = true;            # keep alive for notifications\n      autostart = true;                  # start on login\n      icon = ./icons/teams.png;          # optional; falls back to the app icon\n    };\n\n    apps.gmail = {\n      name = \"Gmail\";\n      url = \"https://mail.google.com\";\n      category = \"Network\";\n      profile = \"google\";                # share a login with other Google apps\n      linkScope = \"exact_host\";          # open off-site links in the browser\n      showBadge = true;\n    };\n  };\n}\n```\n\nThe attribute key (`youtube-music`, `teams`, …) is the stable app id — use a\nsimple `[a-z0-9-]` slug. Every editor option is exposed (`profile`, `adblock`,\n`colorScheme`, `customCss`, `userAgent`, `mobile`, `allowCameraMic`,\n`allowLocation`, `handlers`, window `width`/`height`, …); anything not yet\nsurfaced can be set verbatim via `extraConfig`. You can mix declarative apps and\nGUI-created ones freely — they live side by side.\n\n\u003e **DRM on NixOS (known issue, in progress):** the runner reuses the Widevine\n\u003e module from a host Chromium-family browser (e.g. `pkgs.chromium` or\n\u003e `pkgs.google-chrome`) — no sandbox, so no extra permissions needed. The CDM\n\u003e loads, but full DRM playback for some services (Netflix, Apple Music) is still\n\u003e being worked on — see [#36](https://github.com/olafkfreund/gnome-quick-web-apps/issues/36).\n\n### Everyone else — Flatpak\n\nThe easiest path is the prebuilt bundle: grab `gnome-quick-web-apps-x86_64.flatpak`\nfrom the [latest release](https://github.com/olafkfreund/gnome-quick-web-apps/releases)\nand `flatpak install --user gnome-quick-web-apps-x86_64.flatpak`.\n\nTo build it yourself, let `flatpak-builder` pull every dependency (the GNOME 50\nruntime/SDK and the `rust-stable` SDK extension) from Flathub automatically —\nno manual `flatpak install` step:\n\n```sh\nflatpak remote-add --user --if-not-exists flathub \\\n  https://flathub.org/repo/flathub.flatpakrepo\nflatpak-builder --user --install --force-clean --install-deps-from=flathub \\\n  build build-aux/flatpak/io.github.olafkfreund.QuickWebApps.yml\n```\n\nThe `--install-deps-from=flathub` flag is what installs the runtime/SDK for you.\nThe `rust-stable` extension version is **not** pinned in the manifest — flatpak\nresolves it to the branch matching the GNOME 50 SDK, so it never goes stale (an\nearlier README hint pinned `//25.08`, which you should ignore). The offline\ncargo sources (`cargo-sources.json`) are committed, and CI builds an installable\n`.flatpak` bundle on every push.\n\n## Building from source (dev)\n\n\u003e Requires the Rust toolchain, GTK4 ≥ 4.12 and libadwaita ≥ 1.5. On NixOS use\n\u003e the dev shell (it provides the CEF runtime libraries):\n\n```sh\nnix develop -c just build      # manager + runner + helper\nnix develop -c just run \u003cid\u003e   # launch a web app's CEF window\nnix develop -c just manager    # the editor\n```\n\n## License\n\n[GPL-3.0-only](LICENSE). Portions of the launcher logic are derived from\n`cosmic-utils/web-apps` (GPL-3.0).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folafkfreund%2Fgnome-quick-web-apps","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Folafkfreund%2Fgnome-quick-web-apps","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folafkfreund%2Fgnome-quick-web-apps/lists"}