{"id":50387034,"url":"https://github.com/caugner/mdn-flawless","last_synced_at":"2026-05-30T15:30:49.869Z","repository":{"id":357368668,"uuid":"1232339057","full_name":"caugner/mdn-flawless","owner":"caugner","description":"MDN content issues viewer","archived":false,"fork":false,"pushed_at":"2026-05-21T15:00:55.000Z","size":270,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T00:02:17.350Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://caugner.github.io/mdn-flawless/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/caugner.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-05-07T20:42:27.000Z","updated_at":"2026-05-21T15:11:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/caugner/mdn-flawless","commit_stats":null,"previous_names":["caugner/mdn-flawless"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/caugner/mdn-flawless","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caugner%2Fmdn-flawless","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caugner%2Fmdn-flawless/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caugner%2Fmdn-flawless/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caugner%2Fmdn-flawless/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/caugner","download_url":"https://codeload.github.com/caugner/mdn-flawless/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caugner%2Fmdn-flawless/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33698654,"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-05-30T02:00:06.278Z","response_time":92,"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":[],"created_at":"2026-05-30T15:30:49.798Z","updated_at":"2026-05-30T15:30:49.852Z","avatar_url":"https://github.com/caugner.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MDN Flawless\n\nA single-file static viewer for `issues.json` build output from [Rari](https://github.com/mdn/rari) (when run with `--issues`). No build step — open `index.html` from a local HTTP server and browse, filter, group, and export the issue set.\n\nThe deployment at \u003chttps://caugner.github.io/mdn-flawless/\u003e shows the `issues.json` from the last production build of \u003chttps://developer.mozilla.org/\u003e.\n\n## Running\n\n```sh\npython3 -m http.server\n# or\nnpx http-server .\n```\n\nThen open \u003chttp://localhost:8000/\u003e (or \u003chttp://localhost:8080/\u003e). The page streams `issues.json` with a live progress bar and flattens it into a searchable table.\n\n## Features\n\n### Filtering\n\n- Full-text search across message, file, URL, redirect, source, slug, basepath, macro, and sidebar (space-separated tokens, AND semantics).\n- Faceted dropdowns with live counts: **Category**, **Repository**, **Locale**, **Macro (templ)**, **Sidebar**, **Source position** (with/without line info).\n- The **Category** filter groups options into **Sources** (entries where the linter `source` itself is the category, e.g. `broken-link`) and **Messages** (parsed from the error text, e.g. `Parse error`). Selecting a group header filters by the whole kind (URL hash: `category=__sources__` / `__messages__`).\n- The **Macro** filter groups macros by type (Link, Sidebar, List, Component, Banner, Badge, Embed, Other / Unclassified). Each type heading is a bold divider with the total issue count, and selecting its \"(all …)\" option filters by the whole type (reflected in the URL hash as e.g. `templ=__link__`).\n- \"File path contains\" substring filter.\n- Click any pill (repo, locale, macro, sidebar, category) in a row to filter by that value.\n- **Reset** clears all filters; the button highlights whenever any filter is active.\n\n### Grouping\n\n- Group by **Category**, **URL**, **Slug**, or **File path**.\n- Group rows are sortable by key or count, and expand inline to reveal their issues.\n\n### Table\n\n- Sortable columns (File, Category, Message); keyboard-accessible headers.\n- Search-term highlighting via `\u003cmark\u003e`.\n- File cell links to the GitHub blob with `?plain=1` and precise `L#C#-L#C#` anchors (1-based, derived from the 0-based source spans).\n- Slug links to the live MDN page using normalized locale casing (e.g. `pt-br` → `pt-BR`).\n- Pagination (50 / 200 / 500 / 2000 per page) with prev/next and a page indicator.\n\n### Export\n\n- **Copy MD** — Markdown table of the filtered list (or grouped summary), with an active-filter list and a link back to the live view. The Category column is omitted when a specific category filter is active.\n- **Copy CSV** — same data as CSV (grouped or flat).\n- **Copy JSON** — same data as a pretty-printed JSON array, one object per issue.\n- **Row selection** — tick the checkbox column to copy only the chosen rows; the label switches between \"Copy all N …\" and \"Copy N selected … as\". Shift-click extends a range; the header checkbox toggles all (with a tri-state indicator). Selection clears on filter, sort, or grouping changes.\n\n### UX\n\n- Sticky header, dark mode via `prefers-color-scheme`.\n- Gradient MDN-M favicon ([favicon.svg](favicon.svg)).\n- URL hash mirrors all filters — links are shareable, and back/forward updates the view.\n- `aria-live` stats line shows filtered/total issue count plus file and slug counts.\n\n## Fields\n\nEach row in `issues.json` is flattened into a single record with the following fields. See `flatten()` in [index.html](index.html).\n\n### Location\n\n| Field | Description |\n|---|---|\n| `repo` | Derived from the path: `content`, `translated-content`, `translated-content-de` (when locale is `de`), or `curriculum`. |\n| `filePath` | Path to the source `.md` file, normalized to start at `content/`, `translated-content/`, or `curriculum/curriculum/` (absolute prefix from the linter run is stripped). |\n| `file` | The file the linter actually parsed. Usually equal to `filePath`. |\n| `line` / `col` / `endLine` / `endCol` | 0-based source position. Converted to 1-based GitHub anchors (`L11C96-L11C155`) for blob links. |\n\n### Issue content\n\n| Field | Description |\n|---|---|\n| `source` | The linter check that produced the issue (e.g. `templ-broken-link`, `templ-redirected-link`, `broken-link`). |\n| `message` | Human-readable error text. May be empty for some sources (e.g. `broken-link`), in which case `source` acts as the category. |\n| `category` | Coarse bucket extracted from the start of `message`: longest matching known prefix, else the part before `:`, else the first 4 words. |\n| `sourceCategory` | What the Category filter uses: `source: category` when both exist, otherwise whichever is present. Keeps e.g. `templ-broken-link` and `broken-link` distinguishable even when their messages categorize the same. |\n\n### Document context (from `spans`)\n\n| Field | Description |\n|---|---|\n| `locale` | MDN locale (`en-US`, `de`, `pt-BR`, …). Normalized to MDN URL casing when linking out. |\n| `slug` | Document slug, e.g. `Glossary/Leading`. Linked to `developer.mozilla.org/{locale}/docs/{slug}`. |\n| `basepath` | Base path span reported by the linter. Searchable, not displayed as a column. |\n| `templ` | Rari template (macro) being expanded when the issue was found (e.g. `glossary`, `cssxref`). |\n| `sidebar` | Sidebar context, if any. Filterable via the **Sidebar** dropdown and displayed as a pill in the row. |\n\n### Issue payload (from `fields`)\n\n| Field | Description |\n|---|---|\n| `url` | The URL the linter was checking (e.g. the target of a broken link). |\n| `redirect` | For redirect issues, the URL it actually redirects to. |\n\n## License\n\nSee [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaugner%2Fmdn-flawless","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcaugner%2Fmdn-flawless","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaugner%2Fmdn-flawless/lists"}