@theartharrisonThrough 16 Sep
The data libraryThrough Sep 16, 2026

Everything this site shows is in the file — all 4,027 rows.

One SQLite file, refreshed daily: real titles, real video ids, every daily reading, every traffic source, every recorded edit.

This database was last built on Sep 17, 2026 at 6:09 AM UTC.

The file

The dataset

Download the .db

4,027

rows across 102 tables & views

Download .db.gz
Four CSVs, and a live sheet

Live in a sheet

Paste this into an empty cell of a Google Sheet. Sheets fetches video_daily.csv from this address itself, with no sign-in, every time the sheet opens — so it carries the new days as they are reported. A private channel’s file is owner-only, and a sheet pointed at one comes back empty.

=IMPORTDATA("https://openchannelstats.com/@theartharrison/data/video_daily.csv")
File
theartharrison-stats.db
Size
2.2 MB unzipped
Built
Sep 17, 2026 at 6:09 AM UTC
Schema
v85
Refreshed
Daily
License
CC0 1.0 + YouTube API Terms

SQLite, with titles + ids — everything the site shows. The .db button unzips the file here in the browser; the .db.gz beside it hands over the compressed form for a gunzip of your own. Open it in any SQL client — DB Browser for SQLite, DBeaver, or the sqlite3 CLI. The AI prompts further down the page are an alternative path, not the only one.

Largest tables, by row count

  • _column_catalog1,339
  • app_pool_cell_stat1,058
  • app_wisdom_verdict_daily300
  • _table_catalog102
  • channel_timeline_event100

Two files, two jobs

Analyst-mode .db

Same channel, same dates, same raw numbers as the file beside it. What is stripped: timeline headlines, dashboard verdicts, wisdom labels, and per-row interpretive columns (lifecycle tags, the click-vs-watch grouping, change verdicts). What stays: every raw, summary, cohort and event table, plus all forecast tables and the calibration log. A model loading this file has no stored conclusions to parrot — it reasons from the numbers.

theartharrison-stats.db
The dashboard file — the raw rows plus the prose this site renders.
theartharrison-analysis.db
The analyst file — the raw rows on their own.

First step from here

Open it however you read SQL.

  1. Open it locally. Any SQLite client reads it — DB Browser for SQLite, DBeaver, or the sqlite3 CLI.
  2. Browse it in the browser. The SQL Playground runs queries against the same file without any install.
  3. Hand it to a model. Upload the .db and start with the primed first prompt below.

Hand it to a model

15 prompts

Optional, and never the only path — every prompt names the tables it expects, so the same questions open in a SQL client. Paste the record, or upload the file and paste a prompt.

No upload needed

brief.md

This copies the whole record and its opening line to the clipboard as plain text. It fits a free chat tier, so the questions below open without an upload and without an account.

Start here

Paste alongside your upload of theartharrison-stats.db

Start with the daily read

Ask what changed, what carried the channel, and what is still too thin to read.

Show the full prompt

Analyst prompt

Paste alongside your upload of theartharrison-analysis.db

Independent analyst over the analysis DB

Frames the chat as an analyst reasoning from the data. Sets the voice rules — hedged forecasts, calibration honesty, observation over advice — that the dashboard itself follows.

Show the full prompt
14 more prompts

Diagnose growth

Is the channel growing, flat, or declining?

View velocity, spikes, and drops across the channel over time.

Show the full prompt

Is day-1 performance a predictor of lifetime views?

Whether early signals reliably forecast long-term outcomes.

Show the full prompt

Understand the audience

Where are viewers actually finding these videos?

Browse-driven vs Suggested-driven vs Search — by video.

Show the full prompt

How does CTR behave over a video's lifetime?

Whether CTR holds steady or moves as a video ages.

Show the full prompt

Inspect individual videos

Which videos got clicked at a high rate but few views?

Videos with above-average CTR but below-average views.

Show the full prompt

Which videos keep getting views — and which flashed and died?

Flash pattern vs evergreen across the catalog.

Show the full prompt

Which videos convert impressions into watch time most efficiently?

How much viewing time each thumbnail impression generates.

Show the full prompt

Which videos turn viewers into subscribers?

Subscriber conversion rate across the catalog.

Show the full prompt

Synthesis reads

Do videos do better depending on the week they launched?

Launch-week cohorts vs the channel's own baseline — a read Studio doesn't group.

Show the full prompt

How does where views come from change as a video ages?

Source mix normalized by video age across the whole catalog.

Show the full prompt

Have this channel's own forecasts actually held up?

Calibration record by forecast type and horizon, plus tested creator beliefs.

Show the full prompt

How concentrated has the catalog been over time?

Busiest-video share, quiet-catalog share, and source spread, day by day.

Show the full prompt

Go deep

Complete channel audit

Comprehensive read across every table — what's moving, what's stable, what's too thin.

Show the full prompt

How uneven is this channel, really?

One-channel mirror: which videos carried, how long quiet uploads lasted, and whether later videos got picked up.

Show the full prompt

These work best with a model that accepts file uploads and long context — Claude, ChatGPT Plus, or Gemini Advanced. Free tiers often fail quietly on the larger queries.

Sample SQL queries (for SQL writers)Open SQL Playground →

What's in the file

102 datasets · 1,339 columns

Every table and view the file carries, described by the file itself. Open one for its grain, its columns, what to read it with in mind, and the datasets it sits beside.

Every column's definition, unit and example value is in the file's own _column_catalog — readable in any SQL client, or in the Playground below.

Videos

14 datasets

One row per video, and one row per video per day — titles, ids, views, watch time, retention, and the shape of each video's own run.

  • cohort_video_launch_age_window11 rowsPer-(video, age-window) launch-context metrics: views, CTR, retention bucketed by days since publish.

    Loading this dataset's detail…

  • event_video_phase_transition1 rowOne row per detected lifecycle-phase transition (consecutive days where stage[d] != stage[d-1] in summary_video_stage_daily).

    Loading this dataset's detail…

  • summary_channel_cohort2 rowsPer-ISO-week cohort rollup of videos published that week.

    Loading this dataset's detail…

  • summary_videoStart here11 rowsOne row per public video.

    Loading this dataset's detail…

  • summary_video_daily_rank16 rowsPer-(video, day) channel-internal rank by daily views.

    Loading this dataset's detail…

  • summary_video_launch_context11 rowsPer-video launch-context snapshot: channel-wide state at publish (subscriber count, recent average daily views, publish gap, last era swap).

    Loading this dataset's detail…

  • summary_video_nearest_peersno rows yetTop-5 nearest peers per video by trajectory similarity (cosine distance over the cumulative-views vector during the first 30 post-publish days).

    Loading this dataset's detail…

  • summary_video_retention_curveno rows yetThe audience-retention curve per video: one point per (video, elapsed-time ratio) showing how much of the audience was still watching at that fraction of the video.

    Loading this dataset's detail…

  • summary_video_stage_daily16 rowsPer-(video, day) lifecycle-stage classification (e.g. ramp, plateau, decay) based on the video's own velocity curve.

    Loading this dataset's detail…

  • v_video_stateStart here11 rowsPer-video state convenience view joining video, summary_video, and video_current_state.

    Loading this dataset's detail…

  • videoStart here11 rowsOne row per public video on the channel.

    Loading this dataset's detail…

  • video_current_state36 rowsPer-video snapshot of the most recent lifecycle / decay state flags.

    Loading this dataset's detail…

  • video_daily22 rowsPer-(video, day) metrics from the YouTube Analytics + Reporting APIs: views, watch time, impressions, click rate, average view duration, average view percentage, subscribers gained/lost, likes, comments, shares.

    Loading this dataset's detail…

  • video_daily_cleanStart here16 rowsStub-clean view over video_dailyWHERE pre_publish_stub = 0.

    Loading this dataset's detail…

Traffic and audience

31 datasets

Where the views came from — Browse, Suggested, Search, External — plus impressions, click rate, and the countries watching.

  • cohort_video_geography_age_window4 rowsPer-(video, country, age-window) view counts.

    Loading this dataset's detail…

  • cohort_video_traffic_age_window17 rowsPer-(video, source, age-window) view counts.

    Loading this dataset's detail…

  • event_country_first_view4 rowsOne row per country marking the date the channel received its first view from there.

    Loading this dataset's detail…

  • event_source_first_view6 rowsFirst date each (video, traffic source) recorded any views.

    Loading this dataset's detail…

  • source_age_pattern_daily43 rowsPer-source age-curve template: median view share at each days_since_publish.

    Loading this dataset's detail…

  • summary_channel_country_cohort_stability5 rowsPer-country cohort stability: how much the country's relative share has drifted over rolling windows.

    Loading this dataset's detail…

  • summary_channel_country_daily5 rowsPer-(country, day) channel-wide views, watch time, and subscribers gained.

    Loading this dataset's detail…

  • summary_channel_country_trailing301 rowPer-country trailing-30-day channel-wide rollup: views, watch hours, share of total.

    Loading this dataset's detail…

  • summary_channel_device_daily4 rowsPer-day views, watch time and average view duration by the kind of device the view happened on, with the trailing-28-day view sum and that device's share of it.

    Loading this dataset's detail…

  • summary_channel_embed_hostno rows yetThe sites that embed this channel's videos, top 20 by lifetime views, with each site's views over the trailing 28 reported days.

    Loading this dataset's detail…

  • summary_channel_playback_daily2 rowsPer-day views, watch time and average view duration by where the video was played — the YouTube watch page, an embedded player on another site, a channel page, and so on — with the trailing-28-day view sum and that location's share of it.

    Loading this dataset's detail…

  • summary_channel_source_geo_daily6 rowsJoint (source × country) channel-wide daily view counts.

    Loading this dataset's detail…

  • summary_channel_source_leading_indicator6 rowsPer-source leading-indicator score: how reliably this source's daily movement predicts the next-week channel-wide trend.

    Loading this dataset's detail…

  • summary_channel_source_share_dailyno rows yetLong-format trailing-7-day per-source view share.

    Loading this dataset's detail…

  • summary_channel_source_subscribed1 rowViews by traffic source and subscription state, lifetime and over the trailing 28 reported days.

    Loading this dataset's detail…

  • summary_channel_subscribed_daily3 rowsThe channel's per-day views, watch time and average view duration split by whether the viewer was already subscribed when the view happened.

    Loading this dataset's detail…

  • summary_channel_threshold_impression_pattern1 rowChannel-pattern memory for the "does a click-rate or watch-duration jump on one of this channel's older videos tend to be followed by a step-up in YouTube's impressions to that video?" question.

    Loading this dataset's detail…

  • summary_channel_traffic4 rowsLifetime per-source channel-wide rollup: views, watch hours, average view percentage, subscribers gained, weighted CTR.

    Loading this dataset's detail…

  • summary_traffic_source_daily6 rowsChannel-wide per-source daily aggregates: views, watch hours, average view percentage, weighted CTR, subscribers gained.

    Loading this dataset's detail…

  • summary_traffic_source_daily_history6 rowsLongitudinal store of summary_traffic_source_daily, kept across rebuilds so detectors needing historical context can read it without re-aggregating raw traffic_daily on every read.

    Loading this dataset's detail…

  • summary_traffic_source_detail9 rowsWhat YouTube attributed each traffic source's views to: the search term for YouTube Search, the referring video for Suggested and End screens, the referring channel for channel pages, the referring site for External.

    Loading this dataset's detail…

  • summary_traffic_top_videos_by_source12 rowsTop videos per traffic source by lifetime views.

    Loading this dataset's detail…

  • summary_video_audience3 rowsPer video, the device and the playback location that brought most of its views, and each leader's share of that video's views.

    Loading this dataset's detail…

  • summary_video_country_daily5 rowsPer-(video, country, day) view counts.

    Loading this dataset's detail…

  • summary_video_country_lifetimeno rows yetPer-(video, country) lifetime views, watch hours, retention, and subscribers gained.

    Loading this dataset's detail…

  • summary_video_subscribed1 rowEach video's lifetime views, watch time and average view duration split by subscription state, plus the views that state brought on the video's publish date.

    Loading this dataset's detail…

  • summary_video_traffic12 rowsPer-(video, source) lifetime view share, CTR, retention.

    Loading this dataset's detail…

  • traffic_daily17 rowsPer-(video, source, day) view and click-rate share.

    Loading this dataset's detail…

  • traffic_daily_cleanStart here17 rowsStub-clean view over traffic_dailyWHERE pre_publish_stub = 0.

    Loading this dataset's detail…

  • traffic_sourceStart here24 rowsLookup table mapping YouTube's numeric traffic_source_id to a stable display name and human-readable description (e.g.

    Loading this dataset's detail…

  • v_traffic_daily_labeledStart here17 rowstraffic_daily_clean joined to traffic_source so the source display name appears alongside the numeric source_id.

    Loading this dataset's detail…

The channel, day by day

11 datasets

Channel-level totals and daily snapshots: views, subscribers, publishing cadence, and how concentrated the catalog has been.

  • channel_cadence_dailyno rows yetPer-day publish-cadence state: rolling average gap between publishes, classifier output (steady, cadence_break, etc.), and per-day-of-week trend evidence.

    Loading this dataset's detail…

  • channel_phase_logno rows yetLog of channel-wide maturity-phase transitions.

    Loading this dataset's detail…

  • channel_signal_daily6 rowsLong-format per-(date, signal) feed of channel-wide signal values that don't fit the wide summary_channel_metrics_daily schema.

    Loading this dataset's detail…

  • summary_channelStart here1 rowSingle-row channel-wide lifetime summary: video count, total views, total watch hours, subscriber count, channel-internal medians (CTR, retention, impression-to-view ratio), library half-mass video count, maturity stage, funnel pcts.

    Loading this dataset's detail…

  • summary_channel_catalog_pressure_daily6 rowsDaily catalog-shape signals: count of videos receiving views, Gini-style concentration metrics, and pressure indicators describing how evenly attention is distributed across the catalog.

    Loading this dataset's detail…

  • summary_channel_metrics_dailyStart here6 rowsChannel-wide daily aggregates: views, impressions, weighted CTR, subscriber net change, plus rolling 7d / 28d windows, source-mix diversity, top-video share, quiet-inventory share, and per-stage video counts.

    Loading this dataset's detail…

  • summary_channel_narrative_arc1 rowMacro-structure of the channel's life as a small set of contiguous multi-week windows ("arcs" / movements) that the /story scroll choreographs against — pacing and motion shift at arc boundaries.

    Loading this dataset's detail…

  • summary_channel_snapshot_daily7 rowsDaily snapshot of subscriber count and lifetime view count from the YouTube Data API.

    Loading this dataset's detail…

  • summary_channel_stage_snapshot6 rowsSix rows — one per fixed channel-maturity stage (seedling → established).

    Loading this dataset's detail…

  • summary_subscriber_event_dailyno rows yetPer-(date, video, kind) subscriber-loss and surge events.

    Loading this dataset's detail…

  • v_latest_channel_stateStart here1 rowSingle-row view of the most recent summary_channel_metrics_daily row joined with summary_channel_snapshot_daily for the same date.

    Loading this dataset's detail…

Changes and events

14 datasets

Title and thumbnail edits, the eras between them, milestones, owner notes, and every dated event on the record.

  • channel_timeline_eventStart here100 rowsUnified event ledger: publish, milestone, insight, stat_snapshot, rank_change, first_external, note, subscriber_loss_event, stage_transition, era_start, audience_expansion, source_quiet, creator_event.

    Loading this dataset's detail…

  • cohort_channel_change_verdictno rows yetChannel-scope mirror of cohort_video_change_verdict.

    Loading this dataset's detail…

  • cohort_video_change_verdict16 rowsBefore/after rollup per video pivot (era boundary, subscriber-loss event, or hand-authored note).

    Loading this dataset's detail…

  • event_channel_annotationno rows yetOwner-authored timeline annotations — the channel's own notes (written in the account console, stored per channel) and, on a local build, pipeline/creator-events.yaml.

    Loading this dataset's detail…

  • event_channel_state_change6 rowsChannel-wide state transitions (CUSUM step-change detections).

    Loading this dataset's detail…

  • event_creator_edit9 rowsOne row per field-level edit detected by diffing successive YouTube Data API snapshots.

    Loading this dataset's detail…

  • summary_creator_edits_daily3 rowsDaily count of creator edits across all videos plus field-level breakdowns (title, thumbnail, description, tags).

    Loading this dataset's detail…

  • summary_creator_edits_monthly1 rowMonthly rollup of creator edits.

    Loading this dataset's detail…

  • summary_creator_edits_weekly2 rowsWeekly rollup of creator edits with field-level breakdowns.

    Loading this dataset's detail…

  • summary_edit_view_position6 rowsPer-edit context: cumulative view percentage and lifecycle phase at the moment the edit happened.

    Loading this dataset's detail…

  • summary_era22 rowsOne row per (video, era) with weighted CTR, total impressions, average retention, and view share.

    Loading this dataset's detail…

  • summary_field_co_changeno rows yetPairwise co-occurrence of edit field combinations: how often title + thumbnail are swapped together, etc.

    Loading this dataset's detail…

  • v_event_ledgerStart here125 rowsUnified event view spanning channel_timeline_event plus the typed event_* tables (event_creator_edit, event_channel_annotation, etc.).

    Loading this dataset's detail…

  • video_era22 rowsTitle/thumbnail eras per video.

    Loading this dataset's detail…

What's next

10 datasets

Projections, decay curves, and the calibration logs that record how earlier projections actually turned out.

  • app_decay_curve_library56 rowsThe two decay shapes a catalogue actually carries, learned from the data rather than assumed.

    Loading this dataset's detail…

  • app_video_forecast_prior16 rowsThe video-grain "what's likely next" empirical-Bayes prior, per snapshot: one row per this channel's own videos whose own (noisy, short-history) per-day-views decay rate is shrunk toward the cross-channel cohort's typical decay rate.

    Loading this dataset's detail…

  • forecast_calibration_log33 rowsAppend-only credibility ledger for BOTH forecast layers.

    Loading this dataset's detail…

  • forecast_decay_history18 rowsAppend-only per-(snapshot_date, video_id) snapshots of summary_video_decay_model.

    Loading this dataset's detail…

  • forecast_video_calibration_log21 rowsAppend-only credibility ledger for the per-video forecast layer — the video-grain mirror of forecast_calibration_log.

    Loading this dataset's detail…

  • summary_channel_forecast8 rowsHorizon-banded channel-level forecast.

    Loading this dataset's detail…

  • summary_channel_regime_forecast1 rowJoint-trajectory regime-transition forecast — one row per as_of_date carrying the channel's currently-classified surface state, the projected next state, and the expected transition window with uncertainty bands.

    Loading this dataset's detail…

  • summary_threshold_projection3 rowsForward-looking projection of when the channel reaches the next round threshold (subscribers / cumulative views / video count).

    Loading this dataset's detail…

  • summary_video_decay_model11 rowsPer-video decay model parameters: exponential / power-law fit coefficients, fit quality, and projected forward views over the next 30 / 90 days.

    Loading this dataset's detail…

  • summary_video_trajectory_cone44 rowsPer-(video, age_days) percentile-band trajectory cone (p10/p25/median/p75/p90 + mean + peer_count) over the channel's OTHER videos at the same age.

    Loading this dataset's detail…

The shared pool

2 datasets

The cross-channel context this channel is read against — cohort cells and the named side-by-side rows.

  • app_pool_cell_stat1,058 rowsStage-3 shared-pool aggregate slot, per snapshot: this channel's deciding cohort cell for each pool metric (views_28d, subs_28d, uploads_28d, video_day7_views, ctr_28d, the five traffic_*_share_28d mix shares (browse / suggested / search / external / Shorts feed), video_retention_half) — exactly one row per (metric, snapshot_date).

    Loading this dataset's detail…

  • app_pool_named_peer16 rowsThe open pool's named side-by-side rows, per snapshot: one row per channel that is currently BOTH public and pool-consented (this channel included when eligible).

    Loading this dataset's detail…

About this file

9 datasets

The file's own documentation: what each table and column means, worked query examples, the schema revision, and what data was available when.

  • _aboutStart here24 rowsSingle-row product orientation.

    Loading this dataset's detail…

  • _column_catalogStart here1,339 rowsOne row per column in every table and view.

    Loading this dataset's detail…

  • _json_schema48 rowsShape documentation for columns that store JSON text.

    Loading this dataset's detail…

  • _query_examplesStart here41 rowsGolden-path SQL examples.

    Loading this dataset's detail…

  • _table_catalogStart here102 rowsIndex of every table and view in the public DB.

    Loading this dataset's detail…

  • data_status6 rowsOne row per data domain (views, impressions, traffic_sources, channel_snapshots, reporting_timezone) with available_from / available_to date range and a human note.

    Loading this dataset's detail…

  • engagement_weights1 rowConfigurable weights table used by composite scores.

    Loading this dataset's detail…

  • metric_metadata30 rowsSemantic-metric definitions: each row carries a metric_id (e.g.

    Loading this dataset's detail…

  • schema_version81 rowsAppend-only log of schema versions with applied_at timestamps and a short note per version.

    Loading this dataset's detail…

The app's own working tables

11 datasets

Tables that exist to render this site rather than to describe the channel. Useful for reproducing a surface; skip them when analysing the channel itself.

  • app_ctr_prior6 rowsWhat a click rate is compared against, at three levels.

    Loading this dataset's detail…

  • app_dashboard_briefing_daily6 rowsOne row per day with the dashboard's "today vs yesterday" briefing copy precomputed.

    Loading this dataset's detail…

  • app_detector_activity3 rowsPer-detector activity rollup over app_insight_snapshot: total_fires, first/last fired date, highest significance score and date.

    Loading this dataset's detail…

  • app_detector_lifetime9 rowsPer-detector LIFETIME accumulator. app_detector_activity is a window rollup over the retained ~90-day app_insight_snapshot tail; this table survives the prune by folding each new snapshot date's fires forward, so total_fires / first_fired_date are lifetime- accurate. scope='slot' mirrors the raw prose-routing-slot aggregation; scope='logical' is the recovered logical-detector aggregation.

    Loading this dataset's detail…

  • app_insight_snapshot26 rowsDaily snapshot of insight engine output.

    Loading this dataset's detail…

  • app_metric_zscore_dailyno rows yetPer-(metric, day) comparison of a trailing-7 value against the 28 days before it, in two readings: zscore in natural units (how many baseline standard deviations away) and surprise as a rank percentile bounded to [-1, 1].

    Loading this dataset's detail…

  • app_wisdom_canon50 rowsCanonical list of YouTube growth beliefs the channel tests.

    Loading this dataset's detail…

  • app_wisdom_flip_lifetime50 rowsPer-belief LIFETIME accumulator for the wisdom-flip history. app_wisdom_verdict_daily is bounded to a ~90-day tail, so a whole-ledger aggregate would go window-relative; this table folds each new verdict date forward so flip_count, first_seen_date, last_changed_date and current_streak_days stay lifetime-accurate.

    Loading this dataset's detail…

  • app_wisdom_test50 rowsLatest verdict per wisdom test.

    Loading this dataset's detail…

  • app_wisdom_verdict_daily300 rowsVerdict history per wisdom test.

    Loading this dataset's detail…

  • owner_read_daily6 rowsOne consolidated "today's read" row per snapshot_date — the synthesis the home/digest surfaces lead with.

    Loading this dataset's detail…

How the record is made

The conditions every number on this site was drawn under — reporting lag, stub rows, unattributed impressions, snapshot reconciliation, and what is knowably missing. Read this before trusting a figure in the file.

Analyst-ready layer

The database carries the first read.

These tables turn the raw YouTube export into the same daily observations the site shows: what changed, what carried the channel, and what is still too small to read.

channel_signal_daily6 rows

The behind-the-scenes comparisons that decide what is worth surfacing.

app_dashboard_briefing_daily6 rows

The short daily read shown on the dashboard and historical snapshots.

video_current_state36 rows

Per-video state, one row per video per tracked day: launching, quiet, late pickup, current driver, or steady tail.

source_age_pattern_daily43 rows

How each traffic source behaves at launch, in week two, and later in the catalog.

Honesty

What this dataset doesn’t say

A page in an atlas marked “survey conducted under ice cover” is not weakened by the footnote — it’s strengthened. The columns below name the conditions under which every other chart in this dashboard was drawn.

Reporting lag

YouTube reports two to three days behind.

Data flows reliably through 2026-09-16. The dashboard never charts past that date — it would be zeros dressed as truth. Reporting time zone is America/Los_Angeles; a “day” here is a calendar day in PT, not your local time.

Impressions window

Impressions cover days from Sep 12, 2026 forward.

Views and watch time cover this channel’s full history. Impressions and click-through come from YouTube’s reports, which reach back about thirty days from when a channel connects — on this channel they cover days from 2026-09-12 forward. Earlier days show views without impressions; those impressions aren’t available via the APIs.

Stub rows

6 videos have pre-publish stub rows.

When a video is scheduled, YouTube sometimes records reporting rows for the day before it published — usually a row of zero views and null impressions. Every chart and aggregate filters these out (the pre_publish_stub = 0 guard in every summary CTE). These stubs stay in the database for provenance — they’re how we know YouTube did this on this channel.
Per-video pre-publish stub counts (top 5)
Why I Told 2,500 People I Was Failing1 stub day
Why I Risked a Good Job with Two Kids at Home1 stub day
How to Make a Big Decision Before Waiting Makes It for You1 stub day
The Sleep Disorder My Doctors Called Fear of Success1 stub day
You Can Start Over Without Starting from Zero1 stub day

Click-rate confidence

Where the click rate isn't yet trustworthy, the dashboard says so.

The database tags every click rate with a confidence tier from its impression sample. Fewer than 50 impressions reads as noise; 50 to 249 as low; 250 to 999 as medium; 1,000 or more as high. The four-segment dotted glyph after every click-rate cell encodes which tier — fewer dots means a thinner sample.

Watch-time confidence

The same tiering applies to average watch time.

Average view duration carries a confidence tier from its view sample. Below 10 views reads as noise; 10 to 29 as low; 30 to 99 as medium; 100 or more as high. The same four-segment glyph after every average-view-duration cell.

Source gaps

Almost every impression is attributed to a source.

YouTube’s per-source impression rows don’t always sum to the per-video impression total. The gap is real — some impressions come from sources YouTube doesn’t expose. We surface the gap rather than redistribute it.

0 unattributed of 64 total impressions.

Snapshot drift

Channel-level views match the sum of per-video views.

The channel snapshot (summary_channel_snapshot_daily in the database) sometimes shows totals slightly higher than the sum of per-video reporting rows. This is YouTube’s own attribution gap; we chart it instead of hiding it.

Fewer than two weeks of channel-snapshot history on record.

How is this computed?
The timezone YouTube reporting uses for per-day rollups.
All dates in the public DB are calendar days in YouTube's reporting timezone (America/Los_Angeles, PT), not the visitor's local timezone. A "day" here is a calendar day in PT — a video published at 22:00 PT on Apr 27 will accumulate that day's reporting under the date 2026-04-27, even for viewers in UTC+12.
Flag (0/1) on every per-video reporting row indicating whether the row sits before the video's published_at.
Set to 1 when the row's date is earlier than SUBSTR(published_at, 1, 10). Every summary_* CTE that aggregates over per-video reporting must include WHERE pre_publish_stub = 0 so the seven-row stub artifact (NULL impressions, 0 views) doesn't poison aggregations. The flag itself stays in the DB for downstream provenance.
Sample-size confidence tier for the row's click-through rate; one of noise / low / medium / high.
Derived from the row's impressions sample size. Noise tier when impressions < 50; low when < 250; medium when < 1000; high otherwise. The thresholds are calibrated so that a noise-tier CTR is statistically meaningless (one or two clicks against a tiny denominator).
Sample-size confidence tier for the row's average view duration; one of noise / low / medium / high.
Derived from the row's view sample size — the denominator AVD averages over. Noise tier when views < 10 (one or two viewers' watch time, statistically meaningless); low when views < 30; medium when views < 100; high otherwise. Mirrors the V10 ctr_confidence pattern but keyed on views instead of impressions.
Per-date drift between the channel-level views snapshot and the sum of per-video views.
MAX(0, summary_channel_snapshot_daily.total_views - SUM(video_daily.views WHERE pre_publish_stub = 0)) per date. Reads >0 when the channel-snapshot total exceeds the sum of attributed per-video reporting (e.g. deleted videos, late attribution). Floored at zero so reporting overcounts (per-video sum exceeds channel snapshot — also possible during transient lag) don't render as negative drift.
Where each metric comes from

Subscriber columns come from two independent YouTube APIs. subs_total_eod is a daily snapshot from the Data API. subs_gained and subs_lost are deltas from the Analytics API. Drift between them is expected — they sample at different times of day and use different rounding rules. Each column is authoritative for its own purpose.

FieldAPI source
views, watch_time_minutes, avg_view_duration_sec, avg_view_pct, subs_gained, subs_lost, likes, comments, sharesYouTube Reporting API + Analytics API (reconciled)
impressions, ctrYouTube Reporting API (reach reports)
engaged_views, dislikesYouTube Analytics API only
country_codeYouTube Reporting API (every view-carrying report)
subscribed_statusYouTube Reporting API — reported for some views, not all, so a split states what it is a share of
device_type, playback_location_typeYouTube Reporting API (two optional reports — a channel that has them switched off carries no rows)

Hidden data ledger

What is not in this file and why each absence persists — checked against the file itself.

In this file

  • Where views came from, by country15 rows

    Per-country views are in this file — channel-wide by day, per video by day, a trailing-30-day rollup, and the day each country first appeared.

  • Search terms9 rows

    Search terms are in this file — the terms YouTube attributed to Search, ranked by views, with a count of how many of that source's views carried one.

  • External referrer sites9 rows

    The sites that sent External traffic are in this file, as bare domains — paths and queries are dropped when the file is written, because they can carry tokens.

Structurally absent

  • Individual comments

    The text of viewer comments isn't in the data. Counts are recorded; the text itself never ships in the public dataset.

Size-gated by YouTube

  • Viewer age and gender

    No age or gender breakdown is in this file. No table in the public dataset carries one, so nothing demographic is published on a channel page.

  • Audience-retention curves

    No retention curve is in this file. YouTube reports a curve only for a video past 100 lifetime views, so a file carries none until at least one video clears that.

Partner Program only

  • Revenue and monetization

    Revenue, CPM, and ad-breakdown aren't in the data. This channel isn't yet in the YouTube Partner Program, and those figures only arrive for channels that are.

Pipeline not yet pulling it

  • Hour-of-day patterns

    Hour-of-day granularity isn't in the schema. Only daily aggregates are tracked; YouTube exposes hourly separately, and the pipeline doesn't pull it.

Inspection recipes

Each section below names the source tables and starter SQL for one route family. Provenance popovers throughout the dashboard link here. Open the public .db file in any SQLite client to run these directly.

Homepage — hero numeral and channel-state strip

Appears on: Dashboard

Tables
summary_channel, summary_channel_metrics_daily, event_channel_state_change
Columns
current_subscribers, total_views, total_days_tracked, total_impressions, weighted_ctr, subs_net, surface_state, reason_text
Window
Latest snapshot row per table; daily metrics anchored to the reporting cutoff date.
Sample
One channel row and one daily row per render.

Starter SQL

Show the SQL

Traffic — tenacity stats and source totals

Appears on: Traffic

Tables
summary_traffic_source_daily, summary_video_traffic, summary_channel_traffic
Columns
traffic_source_id, total_views, total_watch_minutes, weighted_ctr
Window
All tracked days up to the reporting cutoff for active_days; lifetime totals from summary_channel_traffic.
Sample
Active-day count is over rows where total_views > 0 in summary_traffic_source_daily; distinct-video count is from summary_video_traffic (one row per video, source).

Starter SQL

Show the SQL

Video summary cards — per-video lifetime figures

Appears on: Videos

Tables
summary_video
Columns
video_id, total_views, weighted_ctr, ctr_confidence, total_impressions
Window
Lifetime per video.
Sample
ctr_confidence tier reflects the total impression sample that feeds weighted_ctr.

Starter SQL

Show the SQL

Changes — title and thumbnail era comparisons

Appears on: Changes

Tables
summary_era
Columns
video_id, field, era_index, weighted_ctr, total_impressions
Window
All era pairs across all public videos.
Sample
Per-era CTR comes from impressions for that era only; pp_change is the delta to the next era for the same field on the same video.

Starter SQL

Show the SQL

Wisdom — belief verdicts

Appears on: Data

Tables
app_wisdom_canon, app_wisdom_test
Columns
test_id, belief_text, status, evidence_json, sample_size, confidence
Window
Per belief: latest snapshot row in app_wisdom_test.
Sample
Each verdict is one row per test_id at the latest snapshot_date.

Starter SQL

Show the SQL
Schema changelog (v5 – v85)

The same rows, drawn

What a few of these datasets look like when they are drawn instead of queried. Each one names the dataset it came from.

The full video table

Drawn from summary_video

The table draws in your browser when this section is open. Without JavaScript it stays in the file: summary_video carries the same rows.

Publishing cadence

The trailing 28-day publish strip plus the detected pattern.

Not enough tracked days yet to read a publishing pattern (28-day window).

Drawn from channel_cadence_daily

View distribution

How unevenly views and subscribers are spread across the catalog over time. A higher figure means a few videos carry most of the recent views or subscribers; a lower one means the spread is more even. Neither shape is the target — both are common at different stages.

Fewer than a week of trailing-28-day evenness readings on record.

Drawn from summary_channel_metrics_daily

Common advice, checked here

50 common creator beliefs, scored against this channel's tracked data. See the Research page for the full panel — one example channel's record, with expandable evidence.

Agree
1
Disagree
4
Still thin
35
Not yet testable
10

Go further

Two doors past the download: run SQL against this file without installing anything, or put a belief up for testing against every channel in the pool. Below them, the addresses a script reads this channel's files from.

Advanced

SQL Playground

The same file, loaded into your browser and queried there. Read-only, no upload, no account — the query never leaves the page. Worked starters are built in, and results export as CSV.

Have a YouTube belief you want tested? or email it directly. Useful submissions get added to the canon — credit appears in the card's source line.

The addresses a script reads this channel from

No key, no registration. A plain HTTP GET returns each file, and each has a checksum sidecar at the same address with .sha256 appended.

  • curl -sO https://openchannelstats.com/@theartharrison/data/videos.csv
  • curl -sO https://openchannelstats.com/@theartharrison/data/video_daily.csv
  • curl -sO https://openchannelstats.com/@theartharrison/data/traffic_daily.csv
  • curl -sO https://openchannelstats.com/@theartharrison/data/channel_daily.csv
  • curl -sO https://openchannelstats.com/@theartharrison/data/ytpool-analysis.db.gz
  • curl -sO https://openchannelstats.com/@theartharrison/data/brief.md
  • curl -sO https://openchannelstats.com/@theartharrison/data/README.md
  • curl -sO https://openchannelstats.com/@theartharrison/data/SCHEMA.md
  • curl -sO https://openchannelstats.com/@theartharrison/data/channel-stats.json
  • curl -sO https://openchannelstats.com/@theartharrison/data/ytpool-public.db.gz

A public channel’s files answer anyone; a private channel’s answer only its owner’s signed-in session, and everything else gets the same 404. Responses are not cached, so a channel that turns private goes dark at once — each one carries an ETag instead, which a script can send back as If-None-Match to get a 304 and skip a download that would change nothing.

The same set, described in full — and the terms every file states are at /terms#license.

A standing record, refreshed daily. Real titles, real ids, every daily row.