{"id":32385115,"url":"https://github.com/charleswiltgen/pwascore","last_synced_at":"2026-07-10T04:31:01.305Z","repository":{"id":318399332,"uuid":"1071041540","full_name":"CharlesWiltgen/PWAscore","owner":"CharlesWiltgen","description":"PWA Browser Scorecards","archived":false,"fork":false,"pushed_at":"2026-06-14T23:00:00.000Z","size":7936,"stargazers_count":47,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-15T00:14:16.864Z","etag":null,"topics":["browsers","compatibility","pwa","webapp"],"latest_commit_sha":null,"homepage":"https://pwascore.com/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CharlesWiltgen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-10-06T19:32:45.000Z","updated_at":"2026-06-14T23:00:03.000Z","dependencies_parsed_at":"2025-10-07T01:24:07.755Z","dependency_job_id":null,"html_url":"https://github.com/CharlesWiltgen/PWAscore","commit_stats":null,"previous_names":["charleswiltgen/pwascore"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/CharlesWiltgen/PWAscore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CharlesWiltgen%2FPWAscore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CharlesWiltgen%2FPWAscore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CharlesWiltgen%2FPWAscore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CharlesWiltgen%2FPWAscore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CharlesWiltgen","download_url":"https://codeload.github.com/CharlesWiltgen/PWAscore/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CharlesWiltgen%2FPWAscore/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35321224,"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-07-10T02:00:06.465Z","response_time":60,"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":["browsers","compatibility","pwa","webapp"],"created_at":"2025-10-25T02:49:17.827Z","updated_at":"2026-07-10T04:31:01.286Z","avatar_url":"https://github.com/CharlesWiltgen.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PWAscore\n\n[PWAscore](https://pwascore.com/) gives popular browsers a score based on their support for [Progressive web apps](https://en.wikipedia.org/wiki/Progressive_web_app) features.\n\n## Architecture\n\n### Tech Stack\n\n- **Nuxt 4** – Latest Nuxt framework\n- **Vue 3** – Composition API with TypeScript\n- **Nuxt UI** – Tailwind-based component library\n- **Cloudflare Workers** – Edge-optimized deployment\n- **CanIUse Data** – Real browser compatibility data\n\n### Key Files\n\n```\napp/\n├── components/\n│   └── PWAFeatureBrowser.vue    # Main 3-column browser view\n├── composables/\n│   ├── useBrowserSupport.ts     # Browser support data fetching\n│   └── useBrowserScore.ts       # Score calculation logic\n├── data/\n│   └── pwa-features.ts          # 200+ PWA features catalog\n├── pages/\n│   └── index.vue                # Homepage\n└── utils/\n    └── canIUseLoader.ts         # CanIUse data loader with edge caching\n```\n\n### Browser Support System\n\n**Data Flow:**\n\n1. PWA features defined in `app/data/pwa-features.ts`\n2. CanIUse IDs mapped to each feature\n3. Data fetched from GitHub and cached at Cloudflare edge\n4. `useBrowserSupport` composable manages caching and lookup\n5. `useBrowserScore` calculates weighted scores\n\n**Caching Strategy:**\n\n- Cloudflare Cache API for production (1-day TTL)\n- In-memory cache for development\n- Version-based cache invalidation\n\n### Scoring System\n\n**Dual Score Approach:**\n\nPWAscore uses two scoring systems to provide accurate, production-focused metrics:\n\n**Primary Score (Displayed):**\n\n- Excludes experimental features (`status.experimental === true`)\n- Excludes non-standard features (`status.standard_track === false`)\n- Excludes deprecated features (`status.deprecated === true`)\n- Reflects production-ready PWA support\n- Weighted by feature importance (core features count more)\n\n**Full Score (Tooltip):**\n\n- Includes all features regardless of status\n- Shows complete browser PWA capabilities\n- Includes both weighted and unweighted percentages\n\n**Design Philosophy:**\n\nThe weighting system ensures scores reflect production-ready PWA capabilities rather than raw feature counts. Not all web platform capabilities are equally important for building legitimate PWA alternatives to native apps.\n\n**Weight Tiers:**\n\n- **3.0** — Core PWA features (Web App Manifest, Service Workers)\n- **2.0** — Important features (Push Notifications, Background Sync, Add to Home Screen)\n- **1.0** — Standard features (default weight)\n- **0.5** — Nice-to-have/experimental features (WebXR/AR/VR, experimental APIs)\n\nThis prevents browsers from inflating scores with niche capabilities while lacking fundamentals. For example, a browser supporting AR/VR (0.5 weight) but missing Service Workers (3.0 weight) will score appropriately low, reflecting the reality that it cannot support most production PWAs.\n\n**Example:**\n\n```\nPrimary display: 85\nTooltip:\n  Stable features: 85 raw\n  With experimental/non-standard:\n    90 weighted, 87 raw\n```\n\n**Status Indicators:**\n\n- 🧪 Flask icon: Experimental feature\n- ⚠️ Triangle icon: Non-standard feature\n- ❌ X-circle icon: Deprecated feature\n\nStatus data sourced from [MDN Browser Compatibility Data](https://github.com/mdn/browser-compat-data).\n\n### Current Browser Versions\n\n**Dynamically derived from CanIUse data** in `app/utils/canIUseLoader.ts`\n\n- Chrome for Android: Uses `agents.and_chr.current_version`\n- Firefox for Android: Uses `agents.and_ff.current_version`\n- Safari for iOS: Finds highest iOS version from `agents.ios_saf.version_list`\n\nVersions automatically stay current with CanIUse data (no manual updates needed).\n\n## Features\n\n### Expand all\n\nMeta-click (⌘ on Mac, Windows key on Windows) on any feature group to see all sub-categories and their features.\n\n## Deployment\n\nDeploys to Cloudflare Workers via Wrangler:\n\n```bash\npnpm deploy\n```\n\n## Performance\n\n- Bundle size: ~855 KB gzipped\n- Worker startup: ~39ms\n- Edge caching: 1-day TTL\n- Global CDN distribution via Cloudflare\n\n## Development\n\n```bash\n# Install dependencies\npnpm install\n\n# Start dev server (localhost:3000)\npnpm dev\n\n# Type check\npnpm typecheck\n\n# Lint code\npnpm lint\n\n# Format code\npnpm prettier:fix\n\n# Build for production\npnpm build\n\n# Deploy to Cloudflare Workers\npnpm deploy\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcharleswiltgen%2Fpwascore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcharleswiltgen%2Fpwascore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcharleswiltgen%2Fpwascore/lists"}