Restructures the Reports tab into a CSS Grid layout (Core Message + Campaign Roadmap stacked, spanning Follower Growth below, alongside All Posts; Audience Composition + Follower Study + Monthly Notes as a second row), each card carrying a short abstract with a link to its full detail. Adds three new "insights" sub-pages (Roadmap, Core Message, Monthly Notes) reachable via a shared hero-banner nav so hopping between them doesn't require detouring through the main Reports page each time. Also fixes two content-type misclassifications (23/07, 30/07 should be Carousel) and trims chart chrome (legend, axis labels/padding) to reclaim vertical space without shrinking bar height. PDF (report.py) and static export (build_static_export.py) intentionally not yet updated to mirror these Reports tab changes — deferred until layout iteration is done.
78 lines
4.6 KiB
Python
78 lines
4.6 KiB
Python
"""Curated, hand-written narrative for each month of the 3-month LinkedIn campaign
|
|
(July, August, September 2026, plus an end-of-campaign report). Growth numbers are
|
|
computed live from the exports elsewhere (see report.compute_period_stats), this file
|
|
only holds the "why", which lives in git history and project context, not in any
|
|
dataframe. Keyed by the same "YYYY-MM" strings report.report_month_options() produces.
|
|
|
|
Add August's and September's entries here as those months are written up, no other
|
|
code changes are needed for the Reports tab or PDF to pick them up.
|
|
"""
|
|
|
|
NOTES = {
|
|
"2026-07": {
|
|
"core_message_abstract": [
|
|
("\"We reveal the processes inside your materials,\"", True),
|
|
("", "br"),
|
|
(" This defines TXproducts' central value proposition. It's the foundation "
|
|
"of all outreach and content.", False),
|
|
],
|
|
"roadmap_abstract": [
|
|
("Find the Voice.", True),
|
|
(" Establish a consistent brand voice and discover the tone that resonates. "
|
|
"Identify which posts and formats drove the most engagement.", False),
|
|
],
|
|
"features_shipped": [
|
|
"Initial dashboard build (Jul 21): Overview, Content, Followers, Visitors, "
|
|
"Competitors, and Growth tabs, weekly-pace tracking, PDF report generation, "
|
|
"data upload with live refresh, and a static HTML export builder for sharing "
|
|
"via NextCloud.",
|
|
"Posts table made scrollable instead of growing indefinitely, and the file "
|
|
"finder hardened to ignore non-export files sitting in the same folder (Jul 22).",
|
|
"Follower Directory and Follower Study linked directly from the Followers tab "
|
|
"hero banner (Jul 31).",
|
|
"Followers by Country map expanded from 14 hardcoded country centroids to a "
|
|
"near-complete world table, with a console warning for any country still "
|
|
"missing one (Jul 31).",
|
|
"Calendar month drill-down tiles, a follower-breakdown expand toggle, a CTR "
|
|
"explainer, and manual post title overrides added across the Followers and "
|
|
"Content tabs (Jul 31).",
|
|
],
|
|
"data_quality": [
|
|
"File finder no longer crashes when a stray non-export file, a manual roster "
|
|
"or an Office lock file, sits in the same folder as the real LinkedIn exports.",
|
|
"Country map no longer silently drops a country if it is missing a centroid, "
|
|
"it now warns in the console instead, and the on-screen country count is "
|
|
"computed from the same rollup as the map so the two can never disagree.",
|
|
"Visitors category breakdown (Location, Seniority, Company size) is no longer "
|
|
"lost month to month. LinkedIn only reports a category once it clears a "
|
|
"per-export minimum-visits threshold, so a single-snapshot approach was "
|
|
"silently losing real categories that dipped below the threshold one week and "
|
|
"reappeared the next. Replaced with an append-only running-total log "
|
|
"(visitor_history.py).",
|
|
"Conversion Rate chart no longer silently drops days with zero tracked "
|
|
"visitors but a real follower change (LinkedIn lets people follow a Page "
|
|
"directly from a feed post, with no page visit at all). Every day now shows, "
|
|
"with those days flagged instead of hidden.",
|
|
],
|
|
"follower_study": [
|
|
"Grew and was actively reclassified throughout July as new followers were "
|
|
"screenshotted and profiled by hand.",
|
|
"A seniority and sector classification fix landed Jul 31 (backup preserved as "
|
|
"follower_directory_BACKUP-before-student-sector-fix.html), plus several "
|
|
"individual profile confirmations (Dominique Elser, Anna Bujak, Emma Xia, "
|
|
"Marten Edwards, Mudabar Ahmad Mubashar, Martin Schroter) that corrected "
|
|
"taglines into real titles and employers.",
|
|
"Not yet brought under git version control during July itself, that happened "
|
|
"Aug 3 and falls outside this report.",
|
|
],
|
|
"outstanding": [
|
|
"The end-of-week report explaining every dashboard chart to the bosses was "
|
|
"due Fri Jul 31, status needs confirming with the user before marking this "
|
|
"done.",
|
|
"The conversion-rate weekly-bucket and 3 to 7 day match-window widening "
|
|
"discussed Jul 28, to make the follow-attribution pattern more convincing "
|
|
"across multiple weeks, is still conceptual, not implemented.",
|
|
],
|
|
},
|
|
}
|