Commit Graph
158 Commits
Author SHA1 Message Date
4gray 3dbd522d70 fix(agents): validate srcdoc references and empty srcset 2026-09-21 02:56:53 +02:00
4gray a7150d1e72 fix(agents): reject empty media and ignore URL at-signs 2026-09-21 02:44:36 +02:00
4gray 6558245e12 fix(agents): normalize internal HTML URL whitespace 2026-09-21 02:32:59 +02:00
4gray 3f8b5be06d fix(agents): preserve block boundaries and validate embeds 2026-09-21 02:21:11 +02:00
4gray 6bc5688001 fix(agents): require files for media references 2026-09-21 02:09:24 +02:00
4gray 576e70fc05 fix(agents): cover document families and guidance basenames 2026-09-21 01:57:30 +02:00
4gray a2d1997e29 fix(agents): validate document formats and trim HTML URLs 2026-09-21 01:45:35 +02:00
4gray 8f76a2c456 fix(agents): handle wildcard versions and alternate documents 2026-09-21 01:33:29 +02:00
4gray 22b2d7a2ac fix(agents): unify Markdown suffix and encoded import guards 2026-09-21 01:21:42 +02:00
4gray 1dd0ec2285 fix(agents): inspect document suffix before URL fragments 2026-09-21 01:09:57 +02:00
4gray 5da10082e5 fix(agents): validate iframe document references 2026-09-21 00:58:25 +02:00
4gray 82d582bb74 fix(agents): preserve filenames across prose punctuation 2026-09-21 00:46:30 +02:00
4gray 4a73cf3828 fix(agents): normalize punctuation for extensionless imports 2026-09-21 00:34:28 +02:00
4gray d10bceab7b fix(agents): delimit package prose at Unicode punctuation 2026-09-21 00:22:37 +02:00
4gray bbbaebce83 fix(agents): count all Markdown line endings in budgets 2026-09-21 00:10:57 +02:00
4gray b863d8e4d4 fix(agents): validate image-map navigation targets 2026-09-20 23:59:28 +02:00
4gray 900050be2e fix(agents): retain visible backticks and explicit path punctuation 2026-09-20 23:47:48 +02:00
4gray 505fa356ab fix(agents): validate extensionless imports and version comparators 2026-09-20 23:35:50 +02:00
4gray cb42c74f43 fix(agents): recognize possessive package mentions 2026-09-20 23:23:11 +02:00
4gray 0ac3421594 fix(agents): decode full HTML entities and media assets 2026-09-20 23:03:17 +02:00
4gray a73538994a fix(agents): validate media and hyphenated literal paths 2026-09-20 22:51:15 +02:00
4gray b54dc4c405 fix(agents): validate visible headings and spaced paths 2026-09-20 22:39:02 +02:00
4gray b0cf310074 fix(agents): retain rendered context for Markdown references 2026-09-20 22:26:34 +02:00
4gray 221fe3d68a fix(agents): accept qualified package prose 2026-09-20 22:13:39 +02:00
4gray e1bc4dee60 fix(agents): support package versions and source fragments 2026-09-20 22:01:32 +02:00
4gray 795946d2a0 fix(agents): route source work and check extensionless files 2026-09-20 21:49:06 +02:00
4gray f2f7a94857 fix(agents): decode link entities and allow package subpaths 2026-09-20 21:35:52 +02:00
4gray 73e98bd00b fix(agents): parse JSONC and constrain package exemptions 2026-09-20 21:23:30 +02:00
4gray 231ec0a513 fix(agents): recognize package scopes and route source work 2026-09-20 21:11:28 +02:00
4gray d6a35cfa31 fix(agents): validate visible HTML and image source sets 2026-09-20 20:57:34 +02:00
4gray e028712e61 fix(agents): handle image fragments and quoted imports 2026-09-20 20:44:46 +02:00
4gray 87c3e466d2 fix(agents): exclude HTML-contained guidance imports 2026-09-20 20:32:23 +02:00
4gray 84596ecb41 fix(agents): require standalone top-level Claude import 2026-09-20 20:20:09 +02:00
4gray 98e6fd3983 fix(agents): use GitHub-compatible heading slugs 2026-09-20 20:08:22 +02:00
4gray 244b1e43ce fix(agents): validate rendered HTML navigation 2026-09-20 19:56:14 +02:00
4gray bdf7017a97 fix(agents): parse prose and rendered HTML anchors 2026-09-20 19:44:07 +02:00
4gray 1206f0d255 fix(agents): handle fenced imports and encoded paths 2026-09-20 19:30:55 +02:00
4gray 46d7f58a6c fix(agents): recognize SCSS filename literals 2026-09-20 19:19:05 +02:00
4gray 989ba24ecf fix(agents): distinguish code symbols and shortcut images 2026-09-20 19:07:24 +02:00
4gray a10045f0b2 fix(agents): validate generic literal repository paths 2026-09-20 18:54:43 +02:00
4gray 8467b9406a fix(agents): parse guidance navigation with Markdown tokens 2026-09-20 18:36:14 +02:00
4gray 3a2497476b docs(agents): compact root guidance and preserve task-specific knowledge 2026-09-20 18:18:51 +02:00
4grayandClaude Fable 5.1 5273e5fb55 test(website): wait for the copy button label before reading the clipboard (#1624)
The home-sections browser test clicked `.copy-btn` and immediately asserted
`textContent() === 'Copied'`. The button flips its label only after the
asynchronous `navigator.clipboard.writeText` promise resolves, which is after
Playwright's `click()` has already returned, so a loaded CI runner sometimes
still read "Copy" (PR #1619, run 35369544094).

Poll for the label with Playwright's `expect(locator).toHaveText` (bounded
5 s) before reading the clipboard. The import is dynamic and sits after
`launchBrowser()`, so the local no-Chromium skip path is unchanged.

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-19 09:23:12 +02:00
4gray 9a3aa63490 ci(nightly): set the electron-builder publish channel for nightly builds (#1611) 2026-09-16 07:50:50 +02:00
4gray d3dee05a84 ci(nightly): run the version step in bash on Windows (#1609) 2026-09-15 20:47:55 +02:00
4grayandClaude Fable 5.1 6f7973a9fb feat(updater): nightly builds and a stable/nightly update channel (#1608)
* feat(updater): nightly builds and a stable/nightly update channel

Every master push publishes its artifacts as a prerelease of
4gray/iptvnator-nightly instead of the rolling test-master draft, with a
version of <next patch>-nightly.<commit date>.<run number> applied in
every build job. Settings → About gains an Update channel switch;
AppUpdateService re-points electron-updater per check (feed repository,
allowPrerelease, channel name, allowDowngrade reset) and reads release
notes from the repository the requested version belongs to. Channel
switches are forward-only: a nightly build stays until a newer stable
release exists.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* fix(updater): compute the nightly version once and keep re-runs safe

Review follow-ups: the nightly version is resolved by a leading job and
handed to every build job, and the patch is bumped only when the base
tag already exists so the release-cut window stays below the imminent
release. A re-run never deletes a published nightly; only a draft left
by a failed run is replaced. Typed update-status literals in the
remaining specs carry the new channel fields.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* test(packaging): expect the nightly-version prerequisite in the build workflow graph

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-15 17:49:22 +02:00
4gray e9eca1c386 chore(deps): upgrade Angular to 22.1 and Nx to 23.2 (#1603)
* chore(deps): upgrade Angular to 22.1 and Nx to 23.2

* fix(deps): complete Angular migrations after rebasing on master

* fix(ci): use the Node pin for Windows runtime refresh

* docs(deps): synchronize the workspace-shell Node requirements
2026-09-14 19:02:40 +02:00
4grayandClaude Opus 5 61ac15372c perf(website): serve fonts and the avatar locally, load comments on demand
Every page pulled its three typefaces from fonts.googleapis.com and
fonts.gstatic.com, each blog post fetched the author avatar from
githubusercontent.com, and the giscus client script ran on page load. That is
four outside origins contacted before a reader does anything, each costing a
DNS lookup and a TLS handshake on the critical path.

Fonts now come from the @fontsource packages the app already uses and are
emitted as .woff2 beside the site; the avatar is a 3 KB file in public/; and
the giscus embed is created by a "Show comments" button that carries the
configuration as data attributes, so the script is only built when a reader
asks for it.

A delivered page now makes no third-party request at all, verified across the
whole build. The variable Bricolage package names itself "Bricolage Grotesque
Variable", so that exact name leads the display stack in the Tailwind config.
The giscus test now checks the button configuration and asserts the client
script is absent from the delivered HTML.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 17:19:04 +02:00
4grayandClaude Opus 5 0c531276a0 feat(website): name the Android TV players on the computer vs TV box page
"TiviMate for PC" is the query behind most of this page's traffic, so the
page now names the apps people mean instead of describing a category. What
it says about them is what could actually be verified: TiviMate's Google
Play listing (Android and Android TV, reads M3U, Xtream Codes and Stalker,
"a media player that provides no content"), and IPTV Smarters publishing
Windows and macOS builds — which is why the page does not claim TV apps
have no desktop version.

The useful half is the part no affiliate site writes: these names are
heavily abused, the stores carry copycat listings, and much of the search
result for any of them is someone selling "subscriptions" under the app's
brand. The developers are player authors who do not sell channels, which is
exactly what IPTVnator says about itself — the page links to our own
unofficial-websites post for the same reason.

Three FAQ entries answer the query directly, and the page joins the
NAMES_THIRD_PARTY_SOFTWARE set so the test requires its dated disclaimer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 21:42:55 +02:00
4grayandClaude Opus 5 f833e16cc4 feat(website): add the computer vs TV box comparison
Third page in the set, and the one that answers the question people ask
before installing anything: where should IPTV actually run. It compares the
two places rather than two products — everything that needs a keyboard
(adding a provider, attaching a guide, mapping a channel, working out why a
stream fails) against everything that needs a couch — and states plainly
that IPTVnator has no TV build, with the phone remote as the answer for a
laptop wired to the television.

No third-party software is named, so the page carries no ThirdPartyNote: the
rows describe the ordinary experience of each kind of device and say so in
the caption.

The compare hub's lead no longer claims every page is a choice inside the
app, and the three newest entries get distinct icons.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 21:34:13 +02:00