Commit Graph
100 Commits
Author SHA1 Message Date
4grayandClaude Fable 5.1 6cfdaf5900 feat(website): add the Stalker portal setup guide with mock-backed screenshots
Publish "How to Connect a Stalker or Ministra Portal to IPTVnator": the
portal URL shapes discovery accepts, MAC normalization, the optional
serial/device-ID/signature fields and the pinning rules behind the
"generate device IDs" toggle, what endpoint discovery does on Add, the
sections a portal source gets, Account info, and a troubleshooting list
built from the app's own refusal messages, plus a seven-question FAQ.
The guide is cross-linked from the download pages and llms.txt.

Guide screenshots come from the capture script. Shots that walk into a
Stalker portal start the stalker-mock-server and seed its marketing-demo
portal for that run only, so release shots never gain a third source
card. The frame guard allowlists exactly that scenario's MAC and keeps
rejecting every other MAC-shaped string.

To keep the live-TV frame free of third-party images, the fictional live
channel list and the channel-logo SVG renderer move into
@iptvnator/shared/marketing-fixtures; both mocks now serve
/assets/marketing/logo/<slug>.svg, the Stalker marketing-demo scenario
builds its ITV categories, channels and schedule from those fixtures
instead of faker names with picsum logos, and the mock resolves asset
URLs on get_all_channels too, which is the response the app renders
the channel list from.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-04 07:20:56 +02:00
4grayandClaude Fable 5.1 70fff19977 fix(website): inject the fallback version instead of importing package.json
`website:lint` failed on master since the per-OS download pages landed:
`src/lib/downloads.ts` imported the workspace root `package.json` through a
relative path, which `@nx/enforce-module-boundaries` rejects ("external
resources cannot be imported using a relative or absolute path").

The value is only needed as a build-time constant for the offline fallback,
so `astro.config.mjs` now reads the root manifest through the file system
and injects `__IPTVNATOR_VERSION__` via Vite `define`; `downloads.ts` uses
that constant and `src/env.d.ts` declares its type. Verified with
`WEBSITE_SKIP_RELEASE_FETCH=1`: the built download pages link the
`iptvnator-<version>` assets and no define literal leaks into the output.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:47:01 +02:00
4grayandClaude Fable 5.1 90d26d499f feat(website): add the Xtream Codes setup guide with FAQ and guide screenshots
Publish "How to Add an Xtream Codes Account to IPTVnator" as the first
evergreen guide: what the server URL, username and password are, the
Add playlist flow with the connection test and its four verdicts, the
Auto-detect method for pasted provider messages, what the import syncs,
Account info, refresh, troubleshooting and a seven-question FAQ. The
guide is cross-linked from the three download pages and llms.txt.

Blog posts gain an optional `faq` frontmatter list: BlogPost.astro
renders it as an accordion after the body and emits FAQPage JSON-LD
next to the BlogPosting entry. LinkCards and PostButton keep internal
links in the same tab.

Guide screenshots come from the release capture script: manifest shots
may carry a `group`, `--group guides` captures only those into
apps/website/public/blog/guides/screenshots/, and a release run skips
them. New setup actions open the Add playlist dialog with the mock's
fictional Xtream credentials (connection test shown), the Auto-detect
method with a labeled hand-out, and the Xtream Live TV view. Dialog
helpers and fixture identities move into shared modules so the driver
and the navigation actions cannot import each other cyclically.

tools/testing/website-guides.test.mjs checks the FAQPage schema, the
download-hub link and the shipped screenshots of every guide;
screenshot-guards.test.mjs covers group validation and output routing.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:14:59 +02:00
4grayandClaude Fable 5.1 81ce8e8c90 feat(release): scaffold the blog post in its published shape
`release:notes:blog` used to emit the notes as a type-grouped inventory with
area prefixes and the highlight sections buried after the feature list; the
v0.23 post shipped in exactly that form and had to be restructured after
publication. The scaffold now starts from the shape the posts end up in:
a "What changed" table with one row per highlight, one `##` section per
highlight ahead of everything else, breaking changes on their own, the
remaining features folded into reader-facing themed sections instead of
conventional-commit scopes, Performance, every remaining fix under a Spoiler
grouped by theme, and the before-updating alert, Thanks and Download cards
(including the compare link to the previous version). Only the components a
post uses are imported.

The blog renderer moves to `release-notes-blog.mjs`; `release-notes-render.mjs`
keeps the GitHub/CHANGELOG renderers and exports the shared text helpers.
Editorial work stays editorial and is marked with TODOs: which fixes deserve
promotion out of the spoiler, one-line bullets, lead-ins, intro and thanks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 20:57:15 +02:00
4grayandClaude Fable 5.1 078bd07d94 feat(website): add per-OS download landing pages
Add /download/ with Windows, macOS and Linux landing pages: OS-specific
install steps, requirements, feature list, FAQ, related posts and a
platform switcher, plus SoftwareApplication / FAQPage / BreadcrumbList
JSON-LD on every page.

Direct asset links resolve the latest published release from the GitHub
Releases API at build time (asset names, sizes, publish date) and fall
back to the root package.json version when the API is unreachable;
WEBSITE_SKIP_RELEASE_FETCH=1 forces the fallback. The deploy workflow
passes GITHUB_TOKEN to the build. The homepage download cards and the
header Download link now point at the new pages, the homepage schema
reads the resolved version instead of a hard-coded 0.20.0, and the
locale count is corrected to 19.

tools/testing/website-download-pages.test.mjs checks titles, canonicals,
direct asset links, structured data, cross-links and sitemap entries of
the built output; nx test website runs it beside the Giscus test.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 13:08:53 +02:00
4grayandClaude Fable 5.1 fd963bb0c5 docs(website): restructure the v0.23 release post around highlights
The published post was the raw release-notes scaffold: 42 feature and 76 fix
bullets in area-prefixed inventory form, with the four highlight sections
buried after the feature list. Rework it into the v0.22 shape: a "What
changed" table, the four highlights first and expanded, themed
improved/fixed sections with one-line entries, and the long tail of fixes
under a Spoiler. Every PR/issue reference from the original is preserved;
open text drops from 6.7k to 3.4k words.

Spoiler.astro sits inside `not-prose`, so lists rendered without markers
and links in body colour; give its content list, link, strong and code
styling so grouped lists inside it read like the rest of the post.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 13:08:09 +02:00
4gray dac0dfdb6c docs(website): add unofficial sites post cover 2026-08-02 12:10:02 +02:00
4gray 347e3cd2f8 docs(website): define unofficial sites cover design 2026-08-02 12:10:02 +02:00
4gray d8b07ecd5b fix(website): refresh landing screenshots 2026-08-02 11:44:19 +02:00
4gray 2fda6cea07 fix(perf): reject incomplete renderer RSS samples 2026-07-27 02:27:57 +02:00
4gray 554eecfee0 fix(perf): finalize exact worker capture safely 2026-07-27 02:15:59 +02:00
4gray d3fdbaa2ef fix(perf): aggregate every worker isolate 2026-07-27 02:15:59 +02:00
4gray b7ddb5e90a chore(perf): add database worker heap probe transport 2026-07-27 02:15:59 +02:00
4gray 1fe6f30e64 chore(perf): prepare database post-GC capture 2026-07-27 02:15:59 +02:00
4gray 918c8f2ded fix(perf): scope renderer RSS to exact window 2026-07-27 02:15:59 +02:00
4gray 5aab81e2cb refactor(perf): expose serializable renderer RSS capture 2026-07-27 02:15:58 +02:00
4gray e27685dc5d fix(perf): model exact renderer RSS capture 2026-07-27 02:15:58 +02:00
4gray 2455165043 chore(electron): route the worker heap probe 2026-07-27 02:15:58 +02:00
4gray d1e268f1dd chore(electron): add perf-only worker heap probe 2026-07-27 02:15:58 +02:00
4gray 5533ac0fc1 fix(perf): preflight profile artifact capacity 2026-07-27 02:15:58 +02:00
4gray a3a8f6e90c fix(perf): optimize benchmark worker builds 2026-07-26 23:25:09 +02:00
4gray df7eee7e52 fix(perf): exclude profiler flush from cancel latency 2026-07-26 23:14:57 +02:00
4gray 8bafd62932 fix(perf): benchmark the performance build 2026-07-26 22:49:36 +02:00
4gray da3b657277 fix(perf): make worker profiling request scoped 2026-07-26 22:37:52 +02:00
4gray 0579d253c4 fix(electron): fail closed on unknown performance completions 2026-07-26 22:37:52 +02:00
4gray f9e71a6d8d fix(electron): isolate refresh performance correlation 2026-07-26 22:37:52 +02:00
4gray e3ce60a35e chore(electron): add preload performance markers 2026-07-26 22:37:52 +02:00
4gray 2cc7d0acb1 fix(perf): declare renderer cache output path 2026-07-26 22:37:52 +02:00
4gray 28ed38906d test(perf): add production renderer benchmark build 2026-07-26 22:37:52 +02:00
4grayandClaude Fable 5 59c15493a7 docs: sync CLAUDE.md, AGENTS.md and architecture docs with actual code
Full audit of CLAUDE.md, AGENTS.md, README.md and docs/architecture/
against the codebase; every fix is backed by current code:

- remove documented-but-unimplemented IPTVNATOR_DISABLE_HARDWARE_ACCELERATION
  flag (no reads anywhere in apps/, libs/, tools/)
- CLAUDE.md: add epg_channel_mappings to the schema table list
- m3u-playlist-module: *-tab dirs -> *-view (+recent-view), selectActivePlaylist,
  real PlaylistState shape, ChannelEpgMetadata instead of removed EnrichedChannel,
  actual /workspace/playlists routes, per-view outputs, live-epg-panel-state key
- workspace-dashboard: per-rail Settings.dashboardRails toggles, three missing
  rails in the diagram, split live-favorites/recent-live rails,
  welcome-dashboard empty-state type, RECENTLY_WATCHED_LIVE_TV title key
- stalker-portal: CategoryContentViewComponent for vod/series, collection-route
  components for favorites/recent, corrected series-view/favorites-button paths,
  actor/:personId route, epg panel selectors
- category-management: reloadCategories lives in with-content.feature.ts,
  workspace-context-panel owns the dialog, XtreamPendingRestoreService flow
- stalker-mock-server (+app README): scenario-seeded faker, resetAll() clears
  content cache too, ordinal season episode ids, handlers/ dir location
- sqlite-db-worker: cancellation shipped (drop from out-of-scope), full
  operations module list
- portal-detail-navigation: replace three removed component paths
- tmdb-metadata-enrichment: details cache keys are id:<tmdbId>|v2
- electron-security: CSP frame-src youtube-nocookie exception,
  sandbox: !frameCopyExperiment nuance
- download-manager: libs/portal/xtream instead of xtream-electron folder,
  data-driven downloads nav, drop removed app-search-result-item note
- playlist-backup-restore: settings-backup facade owns the import handoff
- workspace-shell: functional workspaceEntryRedirect, playlists route children
- iptvnator-ui-guidelines: EPG card radius 11px, detail-view mixin is `base`
- embedded-mpv-native, player-controls-contract: minor precision fixes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 08:16:33 +02:00
4gray eb1bfaa474 chore(package): update version to 0.23.0 2026-07-13 21:35:48 +02:00
4grayandClaude Opus 4.8 df01b738c0 feat(website): use full app screenshot for hero, drop mock window chrome
Swap the hero image to screenshots/screenshot-player.webp (channel list,
live player, EPG). The screenshot already includes the app's own window
controls, so remove the decorative title bar (traffic lights + label);
keep the rounded frame, glow, and scanline. Delete the now-unused
hero-dark.png.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 23:13:06 +02:00
4grayandClaude Opus 4.8 baad440602 docs(readme): keep Codecov badge in for-the-badge style (shields), pin master
Revert to the shields Codecov badge for visual consistency with the
other for-the-badge badges (native badge has no matching style). Pin
branch=master, add the Codecov logo, and keep the canonical
app.codecov.io link. Note: the shields Codecov proxy is occasionally
slow and may briefly render 'unknown'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 23:05:59 +02:00
4grayandClaude Opus 4.8 c7683479a2 docs(readme): use native Codecov badge and canonical link
The shields.io Codecov proxy intermittently rendered 'unknown' (extra
API hop, cached by GitHub's camo). Switch to Codecov's native master
branch badge and point the link at app.codecov.io directly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:57:35 +02:00
4grayandClaude Opus 4.8 0acb29d244 docs(readme): add Ko-fi to the donations buttons, fix Sponsors label
The single donation button used a 'Buy Me A Coffee' image that actually
linked to GitHub Sponsors. Split it into two correctly labeled badges:
GitHub Sponsors and Ko-fi (ko-fi.com/4gray, same as the blog).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:53:33 +02:00
4grayandClaude Opus 4.8 f7ba68dc13 docs(readme): fix stale CI badge (build-and-test.yaml -> ci.yml)
The workflow status badge pointed at a non-existent build-and-test.yaml.
Point it at the actual CI workflow, link it to the workflow page, and
label it CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:50:16 +02:00
4grayandClaude Opus 4.8 e75aad44c8 docs(readme): regroup features by theme, add TMDB/embedded MPV/downloads/global search
Replace the flat feature list with seven themed groups, drop granular
release-note-level items, and surface recent capabilities (TMDB
enrichment, embedded MPV, download manager, global search, dashboard,
auto-updater, remote control) with desktop-only markers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:48:53 +02:00
4grayandClaude Opus 4.8 73b7905668 docs(website): warn about unofficial IPTVnator sites; tidy README languages
- Add blog post warning about scam sites misusing the IPTVnator name to
  sell IPTV services or push suspicious downloads (official sources + safety)
- Add "official sources only" callout to README linking to the post
- Replace enumerated language list with a count (18) linking to i18n files

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:36:47 +02:00
4grayandClaude Fable 5 6a867667ca docs(website): note Linux embedded MPV package support in v0.22 post
Clarify that embedded MPV on Linux is x64-only, needs system mpv on PATH
under X11/Xwayland, works on .deb/pacman/RPM/AppImage, and is not offered
on Flatpak/Snap sandboxes. Links to the README support matrix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 17:03:54 +02:00
4grayandClaude Fable 5 9e62d9163c docs(website): add v0.22 release notes blog post
Announce the v0.22 release: opt-in TMDB metadata enrichment, redesigned
two-state VOD/series detail pages, embedded MPV on Windows and Linux, a
built-in desktop auto-updater, global search, and the reworked live EPG
timeline. Includes compressed hero/slider imagery and a disclaimer that
IPTVnator ships no content and is a pure player.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 16:59:05 +02:00
4grayandClaude Fable 5 f015ec1ca9 docs(agents): rewrite stale CLAUDE.md architecture sections, add self-maintenance rule
Rewrite architecture sections against the current filesystem: post-reorg
lib paths (libs/portal/*, libs/playlist/*, libs/workspace/*), /workspace
route tree, canonical libs/shared/database schema (10 tables,
better-sqlite3), renamed channel-list views, EPG timeline ribbon,
18 i18n locales, import flows in libs/playlist/import/feature, and drop
the unused @ngrx/component-store recommendation.

Add a rule to Documentation After Changes (mirrored in AGENTS.md):
agents must keep CLAUDE.md/AGENTS.md up to date when changes touch
anything they describe, and fix stale claims they notice in passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 00:31:25 +02:00
4gray d7e7a8abda fix(workspace): defer embedded mpv palette support check 2026-06-28 02:01:38 +02:00
4gray 007ae7028d fix(xtream): key catchup probes by output formats 2026-06-27 13:00:03 +02:00
4gray ca81bc552f fix(electron): pin private probe redirect hosts 2026-06-27 12:56:16 +02:00
4gray 16a93bcaaf fix(electron): block private xtream probe redirects 2026-06-27 12:49:33 +02:00
4gray 1679373bb2 feat(xtream): auto-select stream output format 2026-06-27 12:42:53 +02:00
4gray d9999d1e7f feat(epg): show active catchup playback state 2026-06-27 12:27:10 +02:00
4gray d43bc83531 feat(epg): improve catchup row playback handling 2026-06-27 12:02:00 +02:00
4gray 12f3f1fc05 fix(xtream): resolve catchup timeshift variants 2026-06-27 11:51:40 +02:00
4gray f3b87f53c8 test(web-e2e): stabilize xtream playlist edit inputs 2026-06-20 23:49:46 +02:00
4gray 3d4550f6c5 Merge remote-tracking branch 'origin/master' into agent/dashboard-rail-performance
# Conflicts:
#	apps/electron-backend/src/app/database/operations/content.operations.spec.ts
#	libs/shared/interfaces/src/lib/electron-api.interface.ts
2026-06-20 23:43:04 +02:00
4gray dbc90bed06 fix(dashboard): address rail review feedback 2026-06-20 23:10:18 +02:00
4gray b6c5367d63 fix(dashboard): speed up startup rails 2026-06-20 21:46:42 +02:00
4gray c276d48bb7 Show sources playlist scrollbar 2026-06-20 12:52:16 +02:00
4gray e3388de989 Address sources header review feedback 2026-06-20 12:39:00 +02:00
4gray 4e732d3e51 Align sources header with panel style 2026-06-20 12:30:24 +02:00
4gray 2edc430935 feat(xtream): add live all-items grid 2026-06-20 09:36:34 +02:00
4gray bfa865c55c test(xtream): cover live auto-open state reset 2026-06-19 21:00:22 +02:00
4gray 6ad5f5e207 fix(xtream): address live recents review feedback 2026-06-19 20:50:14 +02:00
4gray 210f0ebabc feat(xtream): show recently added live channels 2026-06-19 19:59:42 +02:00
4gray 1073ce5350 ci(electron): require embedded mpv in windows artifacts 2026-06-14 22:09:31 +02:00
4gray ce78669c17 fix(electron): disable service worker in desktop runtime 2026-06-14 15:59:03 +02:00
4gray 20d0f01428 fix(xtream): address portal review feedback 2026-06-14 13:47:42 +02:00
4gray 254879f92b fix(xtream): improve portal compatibility 2026-06-14 13:21:56 +02:00
4gray bc639cd36d chore(nx): add analytics configuration to nx.json 2026-06-14 09:25:36 +02:00
4gray a2bda8fd36 test(pwa): guard static stylesheet regression spec 2026-05-24 15:35:28 +03:00
4gray bb4e386c6c fix(pwa): avoid CSP-blocked stylesheet deferral 2026-05-24 14:59:08 +03:00
4gray 003a8774a1 fix(electron): tighten navigation review feedback
Restrict packaged file navigation to the app renderer, guard redirects, and handle fire-and-forget header override IPC failures.
2026-05-23 19:05:38 +03:00
4gray c36d404a72 test(electron): cover broad playlist header override 2026-05-23 15:59:02 +03:00
4gray 3c5f7ab92e fix(electron): preserve playlist header defaults
Keep playlist-level request header overrides active when channel-scoped headers are cleared, and cover layered override behavior.
2026-05-23 15:57:29 +03:00
4gray fc449ca73e feat(electron): harden renderer security
Scope playback request header overrides to active stream origins and document the Electron runtime security contract.
2026-05-22 23:31:41 +03:00
4gray 189daea3fa test(electron): align xtream epg schedule expectation 2026-05-22 14:59:10 +03:00
4gray 0fb4c7d13e fix(settings): gate external player choices by launch support 2026-05-22 14:39:20 +03:00
4gray 959f6061f0 fix(runtime): address greptile capability feedback 2026-05-22 14:37:06 +03:00
4gray cf0b06312b test(xtream): mock remote control runtime support 2026-05-22 14:32:12 +03:00
4gray ed8680116c fix(runtime): address consolidated review feedback 2026-05-22 14:02:56 +03:00
4gray 582422c512 refactor(runtime): gate settings backup file save by capability 2026-05-22 13:41:24 +03:00
4gray c9a0d5210e refactor(runtime): gate settings sections by capability 2026-05-22 13:41:24 +03:00
4gray 09e2e08fc1 refactor(runtime): gate settings external players by capability 2026-05-22 13:40:14 +03:00
4gray b4fd93354e refactor(runtime): enable pwa xtream section navigation 2026-05-22 13:38:53 +03:00
4gray 676e8bb5da refactor(runtime): gate downloads navigation by capability 2026-05-22 13:38:20 +03:00
4gray f626e176d2 refactor(runtime): require playlist storage bridge 2026-05-22 13:37:36 +03:00
4gray 4603bd83d5 refactor(runtime): gate playlist refresh by capability 2026-05-22 13:36:39 +03:00
4gray 9a5620bf95 refactor(runtime): require downloads bridge surface 2026-05-22 13:35:03 +03:00
4gray 109aea0794 refactor(runtime): require external player bridge methods 2026-05-22 13:35:03 +03:00
4gray 3e398f1d1a refactor(remote-control): gate live bridge by capability 2026-05-22 13:35:03 +03:00
4gray 8cfc40f59b refactor(xtream): gate data source by sqlite capability 2026-05-22 13:35:03 +03:00
4gray 5cf7ab9358 refactor(xtream): use epg runtime capability only 2026-05-22 13:34:37 +03:00
4gray 465b1b5559 refactor(stalker): gate portal sqlite sync by runtime capability 2026-05-22 13:34:16 +03:00
4gray 790dbb7062 refactor(portal): gate activity storage by runtime capability 2026-05-22 13:34:16 +03:00
4gray 03586d934a refactor(channels): gate list epg by runtime capability 2026-05-22 13:33:31 +03:00
4gray 54d29f2239 refactor(epg): gate multi epg queries by runtime capability 2026-05-22 13:33:31 +03:00
4gray 030c6ef89d refactor(epg): gate source freshness by runtime capability 2026-05-22 13:33:31 +03:00
4gray f974297634 refactor(epg): gate progress bridge by runtime capability 2026-05-22 13:33:31 +03:00
4gray 096a8bb803 refactor(epg): use runtime capability for desktop guards 2026-05-22 13:33:31 +03:00
4gray 78a5a7af74 refactor(settings): use runtime capabilities for platform state 2026-05-22 13:33:31 +03:00
4gray 619bcf627a fix(docker): build app on native build platform 2026-05-22 13:18:35 +03:00
4gray b51cbcae15 refactor(app): use runtime capabilities for shell gates 2026-05-22 13:08:00 +03:00
4gray 5ae8c5bedd test(services): avoid angular testing entrypoint 2026-05-22 13:01:28 +03:00
4gray f9e95466e8 refactor(downloads): use runtime availability capability 2026-05-22 12:57:46 +03:00