Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/build-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ jobs:
node ../netlify-arvio-tv-site/scripts/validate-localized-guides.mjs
node --test ../netlify-arvio-tv-site/scripts/seo-guides.test.cjs
node --test ../netlify-arvio-tv-site/scripts/premium-membership.test.cjs
node --test ../netlify-arvio-tv-site/scripts/premium-journey.test.cjs
node --test ../netlify-arvio-tv-site/collection-studio/starters.test.mjs
- name: Check web types
if: matrix.directory == 'web'
run: npx tsc --noEmit
Expand Down
92 changes: 92 additions & 0 deletions docs/discovery-growth-2026-10-08.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# ARVIO discovery growth — 8 October 2026

## Scope
Incremental marketing-site and first-party report changes only. No Android or webapp runtime changes, prices, subscriptions, paid advertising, bought backlinks or automatic public posting. Reviewer messages below are drafts, not sent messages. Do not resubmit listings without checking for an existing listing/application first.

## Evidence and priorities
Google Search Console's 28-day report covers 8 September–5 October: approximately 4,360 clicks and 19,700 impressions. A query filter excluding `arvio` shows 79 clicks / 1,191 impressions / average position 17.4, but includes misspellings and omits anonymized queries. It is not an exact non-brand share, keyword search-volume estimate or post-change evaluation.

Small discovery signals: `android tv open source` (25 impressions, one click, position 7.8), `cinemeta alternative` (13 impressions, no clicks, position 8.0), and `servidor jellyfin android` (10 impressions, no clicks, position 10.9). The last query concerns a server, while ARVIO is a client: do not target it with a misleading server claim.

Official competitor pages confirm that multi-source clients already exist (https://plezy.app/ and https://spectati.com/plex-jellyfin). This validates a product category, not keyword volume or ARVIO superiority. Improve existing pages before publishing additional keyword pages. Three candidates to evaluate next in Search Console: Jellyfin alternative client Android TV, Plex/Emby/Jellyfin one-app workflow, and compatible addon manifest setup. No commercial keyword-volume tool was used; no high-volume claim is made.

Search guidance: https://developers.google.com/search/docs/fundamentals/creating-helpful-content and https://developers.google.com/search/docs/crawling-indexing/links-crawlable. Publish substantive help with accurate first-hand screenshots, not near-duplicate comparison pages or keyword stuffing.

## Implementation
- Extend three existing English guides with decision/checklist sections and honest feature limits. Preserve their URLs, existing screenshots, FAQs, translated counterparts and navigation.
- Add three generated, public-safe Studio starter documents and read-only preview links. Separate discovery metadata from playable media, preserve edits in the original tab, and keep Studio network-free.
- Improve guide/tool links and browser/free-self-hosting/Premium choices. Do not imply an Android user needs to subscribe.
- Add bounded `guide_page_view` measurements and a `byLandingPage` report to the existing first-party funnel. No arbitrary path, collection fragment, email, cookie or browser storage is collected. Existing DNT/GPC opt-outs, deduplication and write ceilings stay in place.
- Keep Ko-fi subscription confirmation server-side. A direct purchase without a matched authenticated journey can remain unattributed; do not call it a tracked conversion merely because a visitor clicked Ko-fi.

Studio visits and JSON downloads can be examined separately with Netlify analytics; Studio does not send marketing events. A visit/download alone does not prove import into the app.

The guide counter is the number of measured transient journeys with a guide event, not unique visitors or a complete page-view total. The landing label belongs to the earliest observed event in the reporting window, not necessarily the visitor's original lifetime landing. Existing global and per-network write ceilings may undercount fast multi-step journeys; keep that limitation visible when comparing counts.

## Crawl state observed
The aggregate indexing report was updated 4 October and must not be treated as real-time. Direct URL Inspection on 8 October: Stremio guide and clean media-kit URL indexed; Collection Studio, collections guide and self-hosting guide discovered but not indexed; browser-playback guide unknown. Check after production publishing; request indexing where eligible. A request does not guarantee indexing or ranking.

## Distribution shortlist and draft messages
Verified contacts below come from the publisher's own pages. No audience-size, response, partnership or coverage guarantee is made.

### AFTVnews — contact@aftvnews.com
Verified at https://www.aftvnews.com/contact/ on 8 October. Relevant Fire TV / Android TV / TV app audience. Use a Fire OS device; do not claim compatibility with Vega OS. No existing-message check was possible: Gmail search returned RATE_LIMIT_EXCEEDED, although the connected profile is arvio.app@gmail.com. Check sent mail before sending this draft.

Subject: ARVIO: free Android TV media hub and a shareable collection builder

Hi Elias,

I'm the developer behind ARVIO, an independent media hub for Android TV and Android. It connects users' own Jellyfin, Plex and Emby libraries, with supported live TV sources and custom Home collections.

A possible angle for your readers is Collection Studio: a free, no-account browser tool that turns TMDB discovery presets or public lists into an importable Home row. We've added three ready-to-use examples. No media or streaming subscriptions are included.

Website and device-specific setup: https://arvio.tv/fire-tv-media-player/?utm_source=aftvnews&utm_medium=outreach&utm_campaign=discovery-oct2026
Collection examples: https://arvio.tv/collection-studio/#examples
Screenshots: https://arvio.tv/media-kit/
Short testing/recording outline: https://arvio.tv/media-kit/reviewer-brief.txt
Official APK/source: https://github.com/ProdigyV21/ARVIO

The Android app and self-hosted web version are free; optional managed browser hosting is $2.99/month. I'd welcome independent feedback if you think it's a fit. There's no payment or required positive coverage attached to this invitation.

Best,
ARVIO
arvio.app@gmail.com

### AndroidTVNews — contact form
Verified at https://androidtvnews.com/contact/ on 8 October. Do not invent an email address. Draft not submitted.

Subject: A free Android TV client for existing Jellyfin, Plex and Emby libraries

Hi AndroidTVNews team,

I develop ARVIO, an independent Android TV media hub. If you cover alternative media-server clients, one useful angle is keeping Jellyfin, Plex and Emby connections in one interface without migrating the server libraries. Connections remain separate; ARVIO does not promise a merged or automatically deduplicated database.

The Android app is free and users bring their own media. Our setup guide includes the actual app screenshot, a first-session checklist and limitations: https://arvio.tv/plex-emby-jellyfin/?utm_source=androidtvnews&utm_medium=outreach&utm_campaign=discovery-oct2026

Screenshots and source: https://arvio.tv/media-kit/ and https://github.com/ProdigyV21/ARVIO
Testing outline: https://arvio.tv/media-kit/reviewer-brief.txt

Would this be useful for an independent review or setup tutorial? No paid placement or positive review is requested.

Best,
ARVIO
arvio.app@gmail.com

### selfh.st — newsletter submission candidate, not a duplicate directory submission
Official form: https://selfh.st/submit/. Directory rules: https://selfh.st/apps-about/. Previous directory submission was authorized in this chat, but no current acceptance or rejection was verified. Do not claim it is listed or send a duplicate. The new collection examples could be pitched as a companion-tool update only if the newsletter form's current criteria permit it.

Draft: ARVIO's free Collection Studio builds a personal Home row from authored TMDB discovery queries or public MDBList / numeric Trakt list references. Three starter templates can be previewed, customized and exported to JSON without an account. The tool makes no source requests or uploads; share links encode public-safe collection definitions. It complements the free Android client and self-hostable web version; no media is included. https://arvio.tv/collection-studio/#examples — source: https://github.com/ProdigyV21/ARVIO

### Existing listing confirmed
AlternativeTo is already live: https://alternativeto.net/software/arvio/about/ (added 3 October). Its body correctly describes free Android / free self-hosting versus optional hosting. Its pricing summary describes the free tier as having limited functionality: worth clarifying with the directory rather than resubmitting or asking for fake reviews. No external edit made in this task.

## Measurement and evaluation
- First complete 28-day baseline above is pre-change; keep it separate from the post-release window.
- Review discovery impressions and clicks after 7 complete days for crawl/measurement issues; 28 complete days for an initial traffic comparison. More time may be needed for rankings.
- Compare the same complete-day lengths, separate brand/misspellings from discovery terms, and inspect device/country mix. Do not infer causality from a before/after total alone.
- Compare guide landings, Premium views, membership clicks, connected trials, confirmed NEW subscriptions and observed paid access. Renewals are not new conversions.
- Do not calculate a Ko-fi conversion rate by dividing memberships by all site visits: attribution coverage, blockers and direct purchases differ.
- Add no automation/reminders unless the user asks. No broad ads until subscriber lifetime value and actual acquisition costs can be evaluated.

## Release and verification
Fill in production/PR references only after tests, publication and live verification succeed. Backend must be deployed before the site starts emitting guide events. Deploy neither secrets nor local research artifacts. Google and reviewer outcomes remain outside ARVIO's control.
28 changes: 26 additions & 2 deletions netlify-arvio-tv-site/assets/premium-journey.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,36 @@
const clean = value => /^[a-z0-9._-]{1,80}$/i.test(value || '') ? value.toLowerCase() : '';
let referrer = '';
try { referrer = clean(new URL(document.referrer).hostname); } catch {}
const organicReferrer = /^(?:www\.)?google\.(?:com|[a-z]{2}|com\.[a-z]{2}|co\.[a-z]{2})$/.test(referrer) ||
['www.bing.com', 'bing.com', 'duckduckgo.com', 'www.duckduckgo.com'].includes(referrer);
const campaign = {
source: clean(here.searchParams.get('utm_source')) || referrer || 'direct',
medium: clean(here.searchParams.get('utm_medium')) || (referrer ? 'referral' : 'direct'),
medium: clean(here.searchParams.get('utm_medium')) || (organicReferrer ? 'organic' : referrer ? 'referral' : 'direct'),
campaign: clean(here.searchParams.get('utm_campaign')) || 'premium',
content: clean(here.searchParams.get('utm_content')) || '',
};
const page = /\/premium\/?$/.test(here.pathname) ? 'premium' : 'home';
// Bounded editorial route labels only, never arbitrary paths, queries or hashes.
// Studio intentionally keeps its network-free CSP and is not instrumented.
const guides = {
'/guides/': 'guides', '/android-tv-media-hub/': 'android',
'/jellyfin-android-tv/': 'jellyfin', '/plex-emby-jellyfin/': 'servers',
'/stremio-addons-android-tv/': 'addons', '/debrid-usenet-android-tv/': 'debrid',
'/trakt-simkl-sync/': 'tracking', '/live-tv-epg/': 'live',
'/ai-subtitles-android-tv/': 'subtitles', '/fire-tv-media-player/': 'firetv',
'/arvio-web/': 'browser', '/collections-catalogs/': 'collections',
'/self-host-arvio-web/': 'selfhost', '/browser-playback-guide/': 'playback',
'/pt-br/guias/': 'guides', '/es/guias/': 'guides',
'/pt-br/jellyfin-android-tv/': 'jellyfin', '/es/jellyfin-android-tv/': 'jellyfin',
'/pt-br/plex-emby-jellyfin/': 'servers', '/es/plex-emby-jellyfin/': 'servers',
'/pt-br/central-midia-android-tv/': 'android', '/es/centro-multimedia-android-tv/': 'android',
'/pt-br/arvio-web/': 'browser', '/es/arvio-web/': 'browser',
'/pt-br/arvio-fire-tv/': 'firetv', '/es/arvio-fire-tv/': 'firetv',
'/pt-br/debrid-usenet-android-tv/': 'debrid', '/es/debrid-usenet-android-tv/': 'debrid',
'/pt-br/sincronizacao-trakt-simkl/': 'tracking', '/es/sincronizacion-trakt-simkl/': 'tracking',
'/pt-br/tv-ao-vivo-epg/': 'live', '/es/tv-en-vivo-epg/': 'live',
'/pt-br/legendas-ia-android-tv/': 'subtitles', '/es/subtitulos-ia-android-tv/': 'subtitles',
};
const page = /\/premium\/?$/.test(here.pathname) ? 'premium' : guides[here.pathname] || 'home';
const sent = new Set();
function record(eventName, placement) {
if (sent.has(eventName)) return;
Expand Down Expand Up @@ -73,4 +96,5 @@
document.addEventListener('click', clicked, { capture: true });
document.addEventListener('auxclick', clicked, { capture: true });
if (page === 'premium') record('premium_page_view');
else if (guides[here.pathname]) record('guide_page_view');
})();
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
[
{
"id": "studio-row",
"title": "Animation and sci-fi",
"folders": [
{
"id": "animation",
"title": "Animated movies",
"description": "Animated movies with at least 100 votes. Not age-filtered.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "MOVIE",
"sortBy": "popularity.desc",
"filters": {
"withGenres": "16",
"voteCountGte": 100
}
}
]
},
{
"id": "scifi",
"title": "Science fiction",
"description": "Science fiction rated 6+ with at least 100 votes.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "MOVIE",
"sortBy": "popularity.desc",
"filters": {
"withGenres": "878",
"voteCountGte": 100,
"voteAverageGte": 6
}
}
]
}
]
}
]
44 changes: 44 additions & 0 deletions netlify-arvio-tv-site/collection-studio/examples/highly-rated.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
[
{
"id": "studio-row",
"title": "Highly rated picks",
"folders": [
{
"id": "movies",
"title": "Highly rated movies",
"description": "Rating 7+ and at least 1,000 votes, sorted by rating.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "MOVIE",
"sortBy": "vote_average.desc",
"filters": {
"voteCountGte": 1000,
"voteAverageGte": 7
}
}
]
},
{
"id": "shows",
"title": "Highly rated shows",
"description": "Rating 7+ and at least 500 votes, sorted by rating.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "TV",
"sortBy": "vote_average.desc",
"filters": {
"voteCountGte": 500,
"voteAverageGte": 7
}
}
]
}
]
}
]
62 changes: 62 additions & 0 deletions netlify-arvio-tv-site/collection-studio/examples/weekend.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
[
{
"id": "studio-row",
"title": "Weekend discoveries",
"folders": [
{
"id": "cinema",
"title": "Cinema night",
"description": "Highly rated movies with at least 1,000 votes.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "MOVIE",
"sortBy": "vote_average.desc",
"filters": {
"voteCountGte": 1000,
"voteAverageGte": 7
}
}
]
},
{
"id": "episodes",
"title": "One more episode",
"description": "Popular shows with at least 100 votes.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "TV",
"sortBy": "popularity.desc",
"filters": {
"voteCountGte": 100
}
}
]
},
{
"id": "scifi",
"title": "Beyond the ordinary",
"description": "Science fiction rated 6+ with at least 100 votes.",
"tileShape": "LANDSCAPE",
"sources": [
{
"provider": "tmdb",
"tmdbSourceType": "DISCOVER",
"mediaType": "MOVIE",
"sortBy": "popularity.desc",
"filters": {
"withGenres": "878",
"voteCountGte": 100,
"voteAverageGte": 6
}
}
]
}
]
}
]
Loading
Loading