← back to Sdcc Journalists Viewer
journalists viewer: move notes below each journalist + user-editable notes (persisted via /api/notes)
f532f9b2f73ed6a229a917757dff75767ad20e26 · 2026-07-23 10:56:49 -0700 · Steve
Files touched
M data/journalists.jsonA data/user-notes.jsonM public/index.htmlM server.js
Diff
commit f532f9b2f73ed6a229a917757dff75767ad20e26
Author: Steve <steve@designerwallcoverings.com>
Date: Thu Jul 23 10:56:49 2026 -0700
journalists viewer: move notes below each journalist + user-editable notes (persisted via /api/notes)
---
data/journalists.json | 2 +-
data/user-notes.json | 1 +
public/index.html | 73 ++++++++++++++++++++++++++++++++++++++++++++++-----
server.js | 29 ++++++++++++++++++++
4 files changed, 97 insertions(+), 8 deletions(-)
diff --git a/data/journalists.json b/data/journalists.json
index 584b5dc..f3e9495 100644
--- a/data/journalists.json
+++ b/data/journalists.json
@@ -1 +1 @@
-{"generated_at": "2026-07-23T10:45:37.196463-07:00", "drive_pull_ok": true, "source": "gdrive:SDCC/sdcc-journalists-media-contacts.xlsx", "count": 38, "rows": [{"name": "Jillian Berman", "outlet_on_file": "MarketWatch", "current_outlet_verified": "MarketWatch", "medium": "Print/Digital", "beat": "Student Debt", "email": "", "email_source": "not found", "phone": "", "twitter": "@jaborman", "location": "", "latest_article": "https://muckrack.com/jillian-berman/articles", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "69", "last_tracked_date": "2026-02-19", "first_contact": "2026-06-24", "initial_email": "Open in Gmail", "last_contact": "2026-06-24", "last_email": "Open in Gmail", "contact_source": "gmail correspondence (name match)", "notes": "Actively publishing July 2026 on OBBB student-loan caps; MarketWatch blocks crawlers \u2014 byline page given. Author of 'Sunk Cost' (2025).", "_links": {"latest_article": "https://muckrack.com/jillian-berman/articles", "initial_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19ef9d11379f7fd5", "last_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19ef9d11379f7fd5"}}, {"name": "Jessica Priest", "outlet_on_file": "The Texas Tribune", "current_outlet_verified": "The Texas Tribune (with Open Campus)", "medium": "Print/Digital", "beat": "Higher education", "email": "jessica.priest@texastribune.org", "email_source": "SDCC database", "phone": "512-716-8600", "twitter": "", "location": "TX", "latest_article": "Student success should mean more state money for universities, Texas agency suggests", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "2026-03-19", "initial_email": "Open in Gmail", "last_contact": "2026-06-03", "last_email": "Open in Gmail", "contact_source": "gmail correspondence (email match)", "notes": "Email on Tribune staff page.", "_links": {"latest_article": "https://www.texastribune.org/2026/07/22/texas-universities-performanced-based-funding-recommendation/", "initial_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19d093759a42a8d7", "last_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19e90f44246291fd"}}, {"name": "Michael Stratford", "outlet_on_file": "Politico", "current_outlet_verified": "Politico (moved to economy team \u2014 banking/financial regulation, Treasury, student debt)", "medium": "Print/Digital", "beat": "Education Policy", "email": "mstratford@politico.com", "email_source": "publicly listed (web-verified)", "phone": "", "twitter": "@maboratford", "location": "", "latest_article": "Trump administration explores selling off parts of the $1.6 trillion federal student loan portfolio", "article_date": "2025-10", "link_type": "author_page", "articles_tracked_10yr": "73", "last_tracked_date": "2026-01-19", "first_contact": "2026-04-06", "initial_email": "Open in Gmail", "last_contact": "2026-04-06", "last_email": "Open in Gmail", "contact_source": "gmail correspondence (email match)", "notes": "Email self-posted on X ('Add me to your press lists'). Politico direct URLs blocked; Oct 2025 loan-portfolio-sale scoop widely cited.", "_links": {"latest_article": "https://muckrack.com/mstratford/articles", "initial_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19d635ef313effc8", "last_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19d635ef313effc8"}}, {"name": "Katie Lobosco", "outlet_on_file": "CNN", "current_outlet_verified": "Tax Notes (LEFT CNN ~early 2025)", "medium": "TV", "beat": "Politics & Policy", "email": "", "email_source": "not found", "phone": "", "twitter": "@KaborLobosco", "location": "", "latest_article": "Latest Republican Tax Proposals Stall Ahead of Midterms", "article_date": "2026-07-13", "link_type": "article", "articles_tracked_10yr": "81", "last_tracked_date": "2026-02-27", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Now Capitol Hill tax-policy reporter \u2014 no longer student-loan beat.", "_links": {"latest_article": "https://www.taxnotes.com/featured-news/latest-republican-tax-proposals-stall-ahead-midterms/2026/07/13/7wdd3"}}, {"name": "Danielle Douglas-Gabriel", "outlet_on_file": "The Washington Post", "current_outlet_verified": "The Washington Post (education finance)", "medium": "Print/Digital", "beat": "Higher Education", "email": "", "email_source": "not found", "phone": "", "twitter": "@DaniDougGabriel", "location": "", "latest_article": "Americans say four-year colleges cost too much", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "80", "last_tracked_date": "2026-02-14", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Running a July 2026 paying-for-college reader series. Email not verifiable.", "_links": {"latest_article": "https://www.washingtonpost.com/education/2026/07/22/americans-say-four-year-colleges-cost-too-much/"}}, {"name": "Stacy Cowley", "outlet_on_file": "The New York Times", "current_outlet_verified": "The New York Times", "medium": "Print/Digital", "beat": "Consumer Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@staborwley", "location": "", "latest_article": "Trump Wants to Create More Banks. Many Firms Are Heeding His Call", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "80", "last_tracked_date": "2026-02-10", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "NYT URLs not retrievable \u2014 byline aggregator given. No public email.", "_links": {"latest_article": "https://muckrack.com/stacycowley/articles"}}, {"name": "Cory Turner", "outlet_on_file": "NPR", "current_outlet_verified": "NPR (Ed team correspondent/senior editor)", "medium": "Radio", "beat": "Education Policy", "email": "", "email_source": "not found", "phone": "", "twitter": "@caborturner", "location": "", "latest_article": "Under a new federal rule, colleges must leave grads better off or lose financial aid", "article_date": "2026-06-30", "link_type": "article", "articles_tracked_10yr": "75", "last_tracked_date": "2026-02-15", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "No public email.", "_links": {"latest_article": "https://www.npr.org/2026/06/30/nx-s1-5835631/turner-camhi-do-no-harm-college-loans"}}, {"name": "Tara Siegel Bernard", "outlet_on_file": "The New York Times", "current_outlet_verified": "The New York Times", "medium": "Print/Digital", "beat": "Personal Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@bernaborara", "location": "", "latest_article": "A Longer Life Can Lead to Financial Concerns, and More Questions", "article_date": "2026-04-29", "link_type": "author_page", "articles_tracked_10yr": "75", "last_tracked_date": "2026-02-16", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Direct NYT URL not retrievable \u2014 byline aggregator given. No public email.", "_links": {"latest_article": "https://muckrack.com/tarasbernard/articles"}}, {"name": "Zack Friedman", "outlet_on_file": "Forbes", "current_outlet_verified": "Mentor (mentormoney.com), founder/CEO \u2014 Forbes byline inactive since Aug 2022", "medium": "Print/Digital", "beat": "Student Loans", "email": "", "email_source": "not found", "phone": "", "twitter": "@zackfriedman", "location": "", "latest_article": "Biden Cancels Student Loans And Extends Student Loan Payment Pause", "article_date": "2022-08-24", "link_type": "article", "articles_tracked_10yr": "75", "last_tracked_date": "2026-02-23", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "CAUTION: no 2025-2026 bylines \u2014 consider deprioritizing; Forbes student-loan coverage now under Forbes Advisor staff.", "_links": {"latest_article": "https://www.forbes.com/sites/zackfriedman/2022/08/24/biden-cancels-student-loans-and-extends-student-loan-payment-pause/"}}, {"name": "Tariq Habash", "outlet_on_file": "The Century Foundation", "current_outlet_verified": "A New Policy (founder) / Student Borrower Protection Center senior fellow \u2014 no longer at The Century Foundation", "medium": "Print/Digital", "beat": "Education Equity", "email": "", "email_source": "not found", "phone": "", "twitter": "@TariqHabash", "location": "", "latest_article": "Banning Foreign Students Is the Opposite of 'Making America Great'", "article_date": "2025-06-18", "link_type": "article", "articles_tracked_10yr": "73", "last_tracked_date": "2026-02-17", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Op-ed in The Nation. TCF \u2192 SBPC \u2192 ED policy advisor (resigned Jan 2024) \u2192 A New Policy. No public email.", "_links": {"latest_article": "https://www.thenation.com/article/society/banning-foreign-students-is-the-opposite-of-making-america-great/"}}, {"name": "Chris Quintana", "outlet_on_file": "USA Today", "current_outlet_verified": "USA Today (investigative, higher ed)", "medium": "Print/Digital", "beat": "Higher Education", "email": "", "email_source": "not found", "phone": "", "twitter": "@ChrisQuintana", "location": "", "latest_article": "Next generation of nurses at risk with proposed student loan caps", "article_date": "2026-01-16", "link_type": "article", "articles_tracked_10yr": "69", "last_tracked_date": "2026-02-08", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "AOL syndication (USA Today blocks crawlers); has more recent Feb 2026 bylines without verifiable URLs.", "_links": {"latest_article": "https://www.aol.com/articles/next-generation-nurses-risk-proposed-213531292.html"}}, {"name": "Ryan Lane", "outlet_on_file": "NerdWallet", "current_outlet_verified": "NerdWallet (managing editor; moved toward small-business but retains student-loan bylines)", "medium": "Print/Digital", "beat": "Student Loans", "email": "", "email_source": "not found", "phone": "", "twitter": "@aborlane", "location": "", "latest_article": "3 Ways to Lower Your Student Loan Interest Rate", "article_date": "2026-06-18", "link_type": "article", "articles_tracked_10yr": "69", "last_tracked_date": "2026-02-12", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Date = last-updated (evergreen model). No public email.", "_links": {"latest_article": "https://www.nerdwallet.com/student-loans/learn/how-to-lower-student-loan-interest-rate"}}, {"name": "Aarthi Swaminathan", "outlet_on_file": "Yahoo Finance", "current_outlet_verified": "MarketWatch", "medium": "Print/Digital", "beat": "Economy & Policy", "email": "aarthi@marketwatch.com", "email_source": "publicly listed (web-verified)", "phone": "", "twitter": "@aaborwami", "location": "", "latest_article": "10 U.S. metro areas where builders are slashing prices on new homes", "article_date": "2026-07-17", "link_type": "article", "articles_tracked_10yr": "67", "last_tracked_date": "2025-12-22", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Moved from Yahoo Finance to MarketWatch (now housing/real-estate beat). URL is Yahoo syndication of her MarketWatch piece. Email self-published in her X post soliciting sources.", "_links": {"latest_article": "https://finance.yahoo.com/real-estate/articles/10-u-metro-areas-where-001000782.html"}}, {"name": "Adam Minsky", "outlet_on_file": "Forbes", "current_outlet_verified": "Forbes (senior contributor)", "medium": "Print/Digital", "beat": "Student Loan Law", "email": "", "email_source": "not found", "phone": "", "twitter": "@AdamSMinsky", "location": "", "latest_article": "Education Department Must Wipe Out Student Loans For 500,000 Borrowers Under Settlement, Says Court", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "67", "last_tracked_date": "2026-02-27", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Publishes multiple times weekly on student-loan law; no public email found.", "_links": {"latest_article": "https://www.forbes.com/sites/adamminsky/2026/07/21/education-department-must-wipe-out-student-loans-for-500000-borrowers-under-settlement-says-court/"}}, {"name": "Annie Nova", "outlet_on_file": "CNBC", "current_outlet_verified": "CNBC", "medium": "TV", "beat": "Personal Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@annianova", "location": "", "latest_article": "Student loan borrowers on new RAP plan can lose key benefits if they pay even one day late", "article_date": "2026-07-12", "link_type": "article", "articles_tracked_10yr": "67", "last_tracked_date": "2026-02-02", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Active on RAP/SAVE transition coverage. No public email found.", "_links": {"latest_article": "https://www.cnbc.com/2026/07/12/student-loans-rap-late-payment.html"}}, {"name": "Ayelet Sheffey", "outlet_on_file": "Business Insider", "current_outlet_verified": "Business Insider (senior economic policy reporter)", "medium": "Print/Digital", "beat": "Policy & Economy", "email": "", "email_source": "not found", "phone": "", "twitter": "@ayaborffey", "location": "", "latest_article": "Latest Trump administration email pushes SAVE student-loan borrowers to find a new repayment plan \u2014 now", "article_date": "2026-07", "link_type": "article", "articles_tracked_10yr": "65", "last_tracked_date": "2026-02-17", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "AOL syndication of her BI piece (BI blocks crawlers). No public email found.", "_links": {"latest_article": "https://www.aol.com/articles/latest-trump-administration-email-pushes-185705250.html"}}, {"name": "Jessica Dickler", "outlet_on_file": "CNBC", "current_outlet_verified": "CNBC", "medium": "TV", "beat": "Personal Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@jaborickler", "location": "", "latest_article": "BlackRock, Carhartt, Ford and Google launch skilled trades workforce initiative", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "62", "last_tracked_date": "2026-02-22", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "No public email found.", "_links": {"latest_article": "https://www.cnbc.com/2026/07/21/blackrock-carhartt-ford-google-skilled-trades.html"}}, {"name": "Laura Beamer", "outlet_on_file": "Jain Family Institute", "current_outlet_verified": "Jain Family Institute", "medium": "Print/Digital", "beat": "Student Debt Research", "email": "", "email_source": "not found", "phone": "", "twitter": "@laboramer", "location": "", "latest_article": "America's Student Loans Were Never Going to Be Repaid (NYT interactive, with Marshall Steinbaum)", "article_date": "2023-07-13", "link_type": "author_page", "articles_tracked_10yr": "62", "last_tracked_date": "2026-01-10", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Researcher, not reporter \u2014 no 2025-2026 bylines found; latest major byline July 2023.", "_links": {"latest_article": "https://jainfamilyinstitute.org/our-team/laura-beamer/"}}, {"name": "Charlie Eaton", "outlet_on_file": "UC Merced / Academic", "current_outlet_verified": "UC Merced (Assoc. Professor; co-founder HERE Lab)", "medium": "Print/Digital", "beat": "Higher Ed Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@CharlieDEaton", "location": "", "latest_article": "White Flight in Public Higher Education? Racial Avoidance of Hispanic-Serving Institutions (Sociology of Education)", "article_date": "2025", "link_type": "article", "articles_tracked_10yr": "57", "last_tracked_date": "2025-11-12", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Academic, not journalist \u2014 latest is a 2025 peer-reviewed article. Faculty-page email not verifiable.", "_links": {"latest_article": "https://journals.sagepub.com/doi/10.1177/00380407251352786"}}, {"name": "Adam Echelman", "outlet_on_file": "CalMatters", "current_outlet_verified": "CalMatters (with Open Campus)", "medium": "Print/Digital", "beat": "Higher education; workforce/job training; community colleges; student data privacy", "email": "aechelman@calmatters.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "CA", "latest_article": "A new law holds colleges accountable if their grads don't earn more than $36,000 a year", "article_date": "2026-07-16", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-16", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on CalMatters author page.", "_links": {"latest_article": "https://calmatters.org/education/higher-education/2026/07/college-graduate-earnings-california/"}}, {"name": "Aleksandra Appleton", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Indiana", "medium": "Print/Digital", "beat": "Indiana education policy; K-12 statewide", "email": "aappleton@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "IN", "latest_article": "IPEC chooses charter school policy leader to guide its work", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-02-02", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page.", "_links": {"latest_article": "https://www.chalkbeat.org/indiana/2026/07/22/karega-rausch-named-ipec-executive-director/"}}, {"name": "Carolyn Jones", "outlet_on_file": "CalMatters", "current_outlet_verified": "CalMatters", "medium": "Print/Digital", "beat": "K-12; special education; school funding; inequity/student achievement; policy", "email": "carolyn@calmatters.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "CA", "latest_article": "California reading scores are up, thanks to literacy investments. Can the state do more?", "article_date": "2026-07-20", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-11", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on CalMatters author page.", "_links": {"latest_article": "https://calmatters.org/education/k-12-education/2026/07/literacy-california/"}}, {"name": "Emma Epperly", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News", "medium": "Print/Digital", "beat": "Idaho K-12; North Idaho regional; special education", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "ID", "latest_article": "Idaho's average per-pupil spending edges up", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-24", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "No email displayed on author page.", "_links": {"latest_article": "https://www.idahoednews.org/top-news/average-idaho-per-pupil-spending-edges-up/"}}, {"name": "Hannah Dellinger", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Detroit", "medium": "Print/Digital", "beat": "Detroit schools; absenteeism; district operations", "email": "hdellinger@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "Detroit MI", "latest_article": "A crowded field: 35 are in the race for 5 seats on the Detroit school board", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-02-26", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page.", "_links": {"latest_article": "https://www.chalkbeat.org/detroit/2026/07/22/dpscd-candidates-running-for-the-detroit-school-board-in-nov-3-election/"}}, {"name": "Howard Blume", "outlet_on_file": "Los Angeles Times", "current_outlet_verified": "Los Angeles Times", "medium": "Print/Digital", "beat": "Education (K-12 and district policy)", "email": "howard.blume@latimes.com", "email_source": "publicly listed (web-verified)", "phone": "", "twitter": "", "location": "CA", "latest_article": "Falling enrollment. Budget uncertainty. LAUSD warns of layoffs and cuts", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-24", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "LAT blocks crawlers \u2014 byline page given. Email surfaced in public journalist listings.", "_links": {"latest_article": "https://muckrack.com/howard-blume/articles"}}, {"name": "Jaweed Kaleem", "outlet_on_file": "Los Angeles Times", "current_outlet_verified": "Los Angeles Times", "medium": "Print/Digital", "beat": "University of California; higher education; campus activism; free speech; religion; race; politics", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "CA", "latest_article": "UC asks California Supreme Court to block release of Trump's UCLA settlement offer", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-19", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "LAT blocks crawlers \u2014 byline page given. Covering UC/higher-ed incl. $1.2B DOJ-UCLA settlement fight.", "_links": {"latest_article": "https://muckrack.com/jaweedkaleem/articles"}}, {"name": "Kevin Richert", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News", "medium": "Print/Digital", "beat": "Education politics; education policy; higher education", "email": "krichert@idahoednews.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "ID", "latest_article": "How the feds' healthcare grants could affect Idaho education: Three examples", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-03", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Byline, date, email verified on article page.", "_links": {"latest_article": "https://www.idahoednews.org/top-news/how-the-feds-healthcare-grants-could-affect-idaho-education-three-examples/"}}, {"name": "Melanie Asmar", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Colorado (Bureau Chief)", "medium": "Print/Digital", "beat": "Denver Public Schools; school board governance; K-12 policy", "email": "masmar@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "CO", "latest_article": "Free school supplies, haircuts, vaccines, and more. Check out these 2026 back-to-school events", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-01-21", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page.", "_links": {"latest_article": "https://www.chalkbeat.org/colorado/2026/07/22/free-back-to-school-supplies-backpacks-haircuts-in-denver-metro-area/"}}, {"name": "Mikhail Zinshteyn", "outlet_on_file": "CalMatters", "current_outlet_verified": "CalMatters", "medium": "Print/Digital", "beat": "Higher education; state legislation; financial aid; labor issues; campus housing; college affordability", "email": "mikhail@calmatters.org", "email_source": "SDCC database", "phone": "", "twitter": "mzinshteyn", "location": "CA", "latest_article": "White House admits it used keywords to kill billions worth of California research grants", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-11", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on CalMatters author page.", "_links": {"latest_article": "https://calmatters.org/education/higher-education/2026/07/research-grants-california-2/"}}, {"name": "Ryan Suppe", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News (senior reporter, K-12 policy)", "medium": "Print/Digital", "beat": "Education policy; K-12 focus", "email": "ryan@idahoednews.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "ID", "latest_article": "Former Nampa school board chair resigns", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-02", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on IEN author page; LinkedIn confirms current role.", "_links": {"latest_article": "https://www.idahoednews.org/news/former-nampa-school-board-chairwoman-resigns/"}}, {"name": "Sean Dolan", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News", "medium": "Print/Digital", "beat": "Education state policy; local district governance", "email": "sean@idahoednews.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "ID", "latest_article": "Schools face soaring laptop costs as AI data centers squeeze supply", "article_date": "2026-07-20", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-25", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "BoiseDev syndication of his IEN piece. Email on IEN author page.", "_links": {"latest_article": "https://boisedev.com/news/2026/07/20/schools-face-soaring-laptop-costs-as-ai-data-centers-squeeze-supply/"}}, {"name": "Melissa Brown", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Tennessee (Bureau Chief)", "medium": "Print/Digital", "beat": "Tennessee education policy; school choice/vouchers; immigration impacts on schools", "email": "mbrown@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "TN", "latest_article": "Tennessee considers easing teacher licensure testing requirements", "article_date": "2026-07-08", "link_type": "article", "articles_tracked_10yr": "2", "last_tracked_date": "2026-03-10", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page. Leading Memphis-Shelby state-takeover coverage.", "_links": {"latest_article": "https://www.chalkbeat.org/tennessee/2026/07/08/will-tennessee-drop-edtpa-requirement-for-teacher-licensure/"}}, {"name": "Reema Amin", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Chicago", "medium": "Print/Digital", "beat": "Chicago Public Schools", "email": "ramin@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "Chicago IL", "latest_article": "Chicago Public Schools lays off 162 central and citywide employees", "article_date": "2026-07-13", "link_type": "article", "articles_tracked_10yr": "1", "last_tracked_date": "2026-03-20", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email publicly listed by Chalkbeat.", "_links": {"latest_article": "https://www.chalkbeat.org/chicago/2026/07/13/cps-lays-off-162-central-and-citywide-employees/"}}, {"name": "Jaden Edison", "outlet_on_file": "The Texas Tribune", "current_outlet_verified": "The Texas Tribune", "medium": "Print/Digital", "beat": "Public education", "email": "jaden.edison@texastribune.org", "email_source": "SDCC database", "phone": "512-716-8600", "twitter": "", "location": "TX", "latest_article": "Texas' longstanding 'Robin Hood' school finance system will face a new legal challenge", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Tribune staff page.", "_links": {"latest_article": "https://www.texastribune.org/2026/07/22/west-texas-midland-district-lawsuit-school-finance-robin-hood/"}}, {"name": "jillian", "outlet_on_file": "", "current_outlet_verified": "", "medium": "Print/Digital", "beat": "General", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "", "latest_article": "", "article_date": "", "link_type": "", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "DATA-ENTRY STUB \u2014 no outlet on file", "_links": {}}, {"name": "marka", "outlet_on_file": "", "current_outlet_verified": "", "medium": "Print/Digital", "beat": "General", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "", "latest_article": "", "article_date": "", "link_type": "", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "DATA-ENTRY STUB \u2014 no outlet on file", "_links": {}}, {"name": "news day", "outlet_on_file": "", "current_outlet_verified": "", "medium": "Print/Digital", "beat": "General", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "", "latest_article": "", "article_date": "", "link_type": "", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "DATA-ENTRY STUB \u2014 no outlet on file", "_links": {}}, {"name": "Sneha Dey", "outlet_on_file": "The Texas Tribune", "current_outlet_verified": "The Texas Tribune", "medium": "Print/Digital", "beat": "Public education", "email": "sneha.dey@texastribune.org", "email_source": "SDCC database", "phone": "512-716-8600", "twitter": "", "location": "Austin TX", "latest_article": "Higher education agency prepares to cut 3% of spending as ordered by Texas leaders", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Beat now education-to-employment pathways, community colleges, higher ed. Email on Tribune author page.", "_links": {"latest_article": "https://www.texastribune.org/2026/07/22/texas-higher-education-spending-cuts/"}}]}
\ No newline at end of file
+{"generated_at": "2026-07-23T10:55:58.921667-07:00", "drive_pull_ok": true, "source": "gdrive:SDCC/sdcc-journalists-media-contacts.xlsx", "count": 38, "rows": [{"name": "Jillian Berman", "outlet_on_file": "MarketWatch", "current_outlet_verified": "MarketWatch", "medium": "Print/Digital", "beat": "Student Debt", "email": "", "email_source": "not found", "phone": "", "twitter": "@jaborman", "location": "", "latest_article": "https://muckrack.com/jillian-berman/articles", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "69", "last_tracked_date": "2026-02-19", "first_contact": "2026-06-24", "initial_email": "Open in Gmail", "last_contact": "2026-06-24", "last_email": "Open in Gmail", "contact_source": "gmail correspondence (name match)", "notes": "Actively publishing July 2026 on OBBB student-loan caps; MarketWatch blocks crawlers \u2014 byline page given. Author of 'Sunk Cost' (2025).", "_links": {"latest_article": "https://muckrack.com/jillian-berman/articles", "initial_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19ef9d11379f7fd5", "last_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19ef9d11379f7fd5"}}, {"name": "Jessica Priest", "outlet_on_file": "The Texas Tribune", "current_outlet_verified": "The Texas Tribune (with Open Campus)", "medium": "Print/Digital", "beat": "Higher education", "email": "jessica.priest@texastribune.org", "email_source": "SDCC database", "phone": "512-716-8600", "twitter": "", "location": "TX", "latest_article": "Student success should mean more state money for universities, Texas agency suggests", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "2026-03-19", "initial_email": "Open in Gmail", "last_contact": "2026-06-03", "last_email": "Open in Gmail", "contact_source": "gmail correspondence (email match)", "notes": "Email on Tribune staff page.", "_links": {"latest_article": "https://www.texastribune.org/2026/07/22/texas-universities-performanced-based-funding-recommendation/", "initial_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19d093759a42a8d7", "last_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19e90f44246291fd"}}, {"name": "Michael Stratford", "outlet_on_file": "Politico", "current_outlet_verified": "Politico (moved to economy team \u2014 banking/financial regulation, Treasury, student debt)", "medium": "Print/Digital", "beat": "Education Policy", "email": "mstratford@politico.com", "email_source": "publicly listed (web-verified)", "phone": "", "twitter": "@maboratford", "location": "", "latest_article": "Trump administration explores selling off parts of the $1.6 trillion federal student loan portfolio", "article_date": "2025-10", "link_type": "author_page", "articles_tracked_10yr": "73", "last_tracked_date": "2026-01-19", "first_contact": "2026-04-06", "initial_email": "Open in Gmail", "last_contact": "2026-04-06", "last_email": "Open in Gmail", "contact_source": "gmail correspondence (email match)", "notes": "Email self-posted on X ('Add me to your press lists'). Politico direct URLs blocked; Oct 2025 loan-portfolio-sale scoop widely cited.", "_links": {"latest_article": "https://muckrack.com/mstratford/articles", "initial_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19d635ef313effc8", "last_email": "https://mail.google.com/mail/u/natalia@studentdebtcrisis.org/#all/19d635ef313effc8"}}, {"name": "Katie Lobosco", "outlet_on_file": "CNN", "current_outlet_verified": "Tax Notes (LEFT CNN ~early 2025)", "medium": "TV", "beat": "Politics & Policy", "email": "", "email_source": "not found", "phone": "", "twitter": "@KaborLobosco", "location": "", "latest_article": "Latest Republican Tax Proposals Stall Ahead of Midterms", "article_date": "2026-07-13", "link_type": "article", "articles_tracked_10yr": "81", "last_tracked_date": "2026-02-27", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Now Capitol Hill tax-policy reporter \u2014 no longer student-loan beat.", "_links": {"latest_article": "https://www.taxnotes.com/featured-news/latest-republican-tax-proposals-stall-ahead-midterms/2026/07/13/7wdd3"}}, {"name": "Danielle Douglas-Gabriel", "outlet_on_file": "The Washington Post", "current_outlet_verified": "The Washington Post (education finance)", "medium": "Print/Digital", "beat": "Higher Education", "email": "", "email_source": "not found", "phone": "", "twitter": "@DaniDougGabriel", "location": "", "latest_article": "Americans say four-year colleges cost too much", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "80", "last_tracked_date": "2026-02-14", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Running a July 2026 paying-for-college reader series. Email not verifiable.", "_links": {"latest_article": "https://www.washingtonpost.com/education/2026/07/22/americans-say-four-year-colleges-cost-too-much/"}}, {"name": "Stacy Cowley", "outlet_on_file": "The New York Times", "current_outlet_verified": "The New York Times", "medium": "Print/Digital", "beat": "Consumer Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@staborwley", "location": "", "latest_article": "Trump Wants to Create More Banks. Many Firms Are Heeding His Call", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "80", "last_tracked_date": "2026-02-10", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "NYT URLs not retrievable \u2014 byline aggregator given. No public email.", "_links": {"latest_article": "https://muckrack.com/stacycowley/articles"}}, {"name": "Cory Turner", "outlet_on_file": "NPR", "current_outlet_verified": "NPR (Ed team correspondent/senior editor)", "medium": "Radio", "beat": "Education Policy", "email": "", "email_source": "not found", "phone": "", "twitter": "@caborturner", "location": "", "latest_article": "Under a new federal rule, colleges must leave grads better off or lose financial aid", "article_date": "2026-06-30", "link_type": "article", "articles_tracked_10yr": "75", "last_tracked_date": "2026-02-15", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "No public email.", "_links": {"latest_article": "https://www.npr.org/2026/06/30/nx-s1-5835631/turner-camhi-do-no-harm-college-loans"}}, {"name": "Tara Siegel Bernard", "outlet_on_file": "The New York Times", "current_outlet_verified": "The New York Times", "medium": "Print/Digital", "beat": "Personal Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@bernaborara", "location": "", "latest_article": "A Longer Life Can Lead to Financial Concerns, and More Questions", "article_date": "2026-04-29", "link_type": "author_page", "articles_tracked_10yr": "75", "last_tracked_date": "2026-02-16", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Direct NYT URL not retrievable \u2014 byline aggregator given. No public email.", "_links": {"latest_article": "https://muckrack.com/tarasbernard/articles"}}, {"name": "Zack Friedman", "outlet_on_file": "Forbes", "current_outlet_verified": "Mentor (mentormoney.com), founder/CEO \u2014 Forbes byline inactive since Aug 2022", "medium": "Print/Digital", "beat": "Student Loans", "email": "", "email_source": "not found", "phone": "", "twitter": "@zackfriedman", "location": "", "latest_article": "Biden Cancels Student Loans And Extends Student Loan Payment Pause", "article_date": "2022-08-24", "link_type": "article", "articles_tracked_10yr": "75", "last_tracked_date": "2026-02-23", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "CAUTION: no 2025-2026 bylines \u2014 consider deprioritizing; Forbes student-loan coverage now under Forbes Advisor staff.", "_links": {"latest_article": "https://www.forbes.com/sites/zackfriedman/2022/08/24/biden-cancels-student-loans-and-extends-student-loan-payment-pause/"}}, {"name": "Tariq Habash", "outlet_on_file": "The Century Foundation", "current_outlet_verified": "A New Policy (founder) / Student Borrower Protection Center senior fellow \u2014 no longer at The Century Foundation", "medium": "Print/Digital", "beat": "Education Equity", "email": "", "email_source": "not found", "phone": "", "twitter": "@TariqHabash", "location": "", "latest_article": "Banning Foreign Students Is the Opposite of 'Making America Great'", "article_date": "2025-06-18", "link_type": "article", "articles_tracked_10yr": "73", "last_tracked_date": "2026-02-17", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Op-ed in The Nation. TCF \u2192 SBPC \u2192 ED policy advisor (resigned Jan 2024) \u2192 A New Policy. No public email.", "_links": {"latest_article": "https://www.thenation.com/article/society/banning-foreign-students-is-the-opposite-of-making-america-great/"}}, {"name": "Chris Quintana", "outlet_on_file": "USA Today", "current_outlet_verified": "USA Today (investigative, higher ed)", "medium": "Print/Digital", "beat": "Higher Education", "email": "", "email_source": "not found", "phone": "", "twitter": "@ChrisQuintana", "location": "", "latest_article": "Next generation of nurses at risk with proposed student loan caps", "article_date": "2026-01-16", "link_type": "article", "articles_tracked_10yr": "69", "last_tracked_date": "2026-02-08", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "AOL syndication (USA Today blocks crawlers); has more recent Feb 2026 bylines without verifiable URLs.", "_links": {"latest_article": "https://www.aol.com/articles/next-generation-nurses-risk-proposed-213531292.html"}}, {"name": "Ryan Lane", "outlet_on_file": "NerdWallet", "current_outlet_verified": "NerdWallet (managing editor; moved toward small-business but retains student-loan bylines)", "medium": "Print/Digital", "beat": "Student Loans", "email": "", "email_source": "not found", "phone": "", "twitter": "@aborlane", "location": "", "latest_article": "3 Ways to Lower Your Student Loan Interest Rate", "article_date": "2026-06-18", "link_type": "article", "articles_tracked_10yr": "69", "last_tracked_date": "2026-02-12", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Date = last-updated (evergreen model). No public email.", "_links": {"latest_article": "https://www.nerdwallet.com/student-loans/learn/how-to-lower-student-loan-interest-rate"}}, {"name": "Aarthi Swaminathan", "outlet_on_file": "Yahoo Finance", "current_outlet_verified": "MarketWatch", "medium": "Print/Digital", "beat": "Economy & Policy", "email": "aarthi@marketwatch.com", "email_source": "publicly listed (web-verified)", "phone": "", "twitter": "@aaborwami", "location": "", "latest_article": "10 U.S. metro areas where builders are slashing prices on new homes", "article_date": "2026-07-17", "link_type": "article", "articles_tracked_10yr": "67", "last_tracked_date": "2025-12-22", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Moved from Yahoo Finance to MarketWatch (now housing/real-estate beat). URL is Yahoo syndication of her MarketWatch piece. Email self-published in her X post soliciting sources.", "_links": {"latest_article": "https://finance.yahoo.com/real-estate/articles/10-u-metro-areas-where-001000782.html"}}, {"name": "Adam Minsky", "outlet_on_file": "Forbes", "current_outlet_verified": "Forbes (senior contributor)", "medium": "Print/Digital", "beat": "Student Loan Law", "email": "", "email_source": "not found", "phone": "", "twitter": "@AdamSMinsky", "location": "", "latest_article": "Education Department Must Wipe Out Student Loans For 500,000 Borrowers Under Settlement, Says Court", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "67", "last_tracked_date": "2026-02-27", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Publishes multiple times weekly on student-loan law; no public email found.", "_links": {"latest_article": "https://www.forbes.com/sites/adamminsky/2026/07/21/education-department-must-wipe-out-student-loans-for-500000-borrowers-under-settlement-says-court/"}}, {"name": "Annie Nova", "outlet_on_file": "CNBC", "current_outlet_verified": "CNBC", "medium": "TV", "beat": "Personal Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@annianova", "location": "", "latest_article": "Student loan borrowers on new RAP plan can lose key benefits if they pay even one day late", "article_date": "2026-07-12", "link_type": "article", "articles_tracked_10yr": "67", "last_tracked_date": "2026-02-02", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Active on RAP/SAVE transition coverage. No public email found.", "_links": {"latest_article": "https://www.cnbc.com/2026/07/12/student-loans-rap-late-payment.html"}}, {"name": "Ayelet Sheffey", "outlet_on_file": "Business Insider", "current_outlet_verified": "Business Insider (senior economic policy reporter)", "medium": "Print/Digital", "beat": "Policy & Economy", "email": "", "email_source": "not found", "phone": "", "twitter": "@ayaborffey", "location": "", "latest_article": "Latest Trump administration email pushes SAVE student-loan borrowers to find a new repayment plan \u2014 now", "article_date": "2026-07", "link_type": "article", "articles_tracked_10yr": "65", "last_tracked_date": "2026-02-17", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "AOL syndication of her BI piece (BI blocks crawlers). No public email found.", "_links": {"latest_article": "https://www.aol.com/articles/latest-trump-administration-email-pushes-185705250.html"}}, {"name": "Jessica Dickler", "outlet_on_file": "CNBC", "current_outlet_verified": "CNBC", "medium": "TV", "beat": "Personal Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@jaborickler", "location": "", "latest_article": "BlackRock, Carhartt, Ford and Google launch skilled trades workforce initiative", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "62", "last_tracked_date": "2026-02-22", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "No public email found.", "_links": {"latest_article": "https://www.cnbc.com/2026/07/21/blackrock-carhartt-ford-google-skilled-trades.html"}}, {"name": "Laura Beamer", "outlet_on_file": "Jain Family Institute", "current_outlet_verified": "Jain Family Institute", "medium": "Print/Digital", "beat": "Student Debt Research", "email": "", "email_source": "not found", "phone": "", "twitter": "@laboramer", "location": "", "latest_article": "America's Student Loans Were Never Going to Be Repaid (NYT interactive, with Marshall Steinbaum)", "article_date": "2023-07-13", "link_type": "author_page", "articles_tracked_10yr": "62", "last_tracked_date": "2026-01-10", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Researcher, not reporter \u2014 no 2025-2026 bylines found; latest major byline July 2023.", "_links": {"latest_article": "https://jainfamilyinstitute.org/our-team/laura-beamer/"}}, {"name": "Charlie Eaton", "outlet_on_file": "UC Merced / Academic", "current_outlet_verified": "UC Merced (Assoc. Professor; co-founder HERE Lab)", "medium": "Print/Digital", "beat": "Higher Ed Finance", "email": "", "email_source": "not found", "phone": "", "twitter": "@CharlieDEaton", "location": "", "latest_article": "White Flight in Public Higher Education? Racial Avoidance of Hispanic-Serving Institutions (Sociology of Education)", "article_date": "2025", "link_type": "article", "articles_tracked_10yr": "57", "last_tracked_date": "2025-11-12", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Academic, not journalist \u2014 latest is a 2025 peer-reviewed article. Faculty-page email not verifiable.", "_links": {"latest_article": "https://journals.sagepub.com/doi/10.1177/00380407251352786"}}, {"name": "Adam Echelman", "outlet_on_file": "CalMatters", "current_outlet_verified": "CalMatters (with Open Campus)", "medium": "Print/Digital", "beat": "Higher education; workforce/job training; community colleges; student data privacy", "email": "aechelman@calmatters.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "CA", "latest_article": "A new law holds colleges accountable if their grads don't earn more than $36,000 a year", "article_date": "2026-07-16", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-16", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on CalMatters author page.", "_links": {"latest_article": "https://calmatters.org/education/higher-education/2026/07/college-graduate-earnings-california/"}}, {"name": "Aleksandra Appleton", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Indiana", "medium": "Print/Digital", "beat": "Indiana education policy; K-12 statewide", "email": "aappleton@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "IN", "latest_article": "IPEC chooses charter school policy leader to guide its work", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-02-02", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page.", "_links": {"latest_article": "https://www.chalkbeat.org/indiana/2026/07/22/karega-rausch-named-ipec-executive-director/"}}, {"name": "Carolyn Jones", "outlet_on_file": "CalMatters", "current_outlet_verified": "CalMatters", "medium": "Print/Digital", "beat": "K-12; special education; school funding; inequity/student achievement; policy", "email": "carolyn@calmatters.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "CA", "latest_article": "California reading scores are up, thanks to literacy investments. Can the state do more?", "article_date": "2026-07-20", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-11", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on CalMatters author page.", "_links": {"latest_article": "https://calmatters.org/education/k-12-education/2026/07/literacy-california/"}}, {"name": "Emma Epperly", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News", "medium": "Print/Digital", "beat": "Idaho K-12; North Idaho regional; special education", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "ID", "latest_article": "Idaho's average per-pupil spending edges up", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-24", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "No email displayed on author page.", "_links": {"latest_article": "https://www.idahoednews.org/top-news/average-idaho-per-pupil-spending-edges-up/"}}, {"name": "Hannah Dellinger", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Detroit", "medium": "Print/Digital", "beat": "Detroit schools; absenteeism; district operations", "email": "hdellinger@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "Detroit MI", "latest_article": "A crowded field: 35 are in the race for 5 seats on the Detroit school board", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-02-26", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page.", "_links": {"latest_article": "https://www.chalkbeat.org/detroit/2026/07/22/dpscd-candidates-running-for-the-detroit-school-board-in-nov-3-election/"}}, {"name": "Howard Blume", "outlet_on_file": "Los Angeles Times", "current_outlet_verified": "Los Angeles Times", "medium": "Print/Digital", "beat": "Education (K-12 and district policy)", "email": "howard.blume@latimes.com", "email_source": "publicly listed (web-verified)", "phone": "", "twitter": "", "location": "CA", "latest_article": "Falling enrollment. Budget uncertainty. LAUSD warns of layoffs and cuts", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-24", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "LAT blocks crawlers \u2014 byline page given. Email surfaced in public journalist listings.", "_links": {"latest_article": "https://muckrack.com/howard-blume/articles"}}, {"name": "Jaweed Kaleem", "outlet_on_file": "Los Angeles Times", "current_outlet_verified": "Los Angeles Times", "medium": "Print/Digital", "beat": "University of California; higher education; campus activism; free speech; religion; race; politics", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "CA", "latest_article": "UC asks California Supreme Court to block release of Trump's UCLA settlement offer", "article_date": "2026-07", "link_type": "author_page", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-19", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "LAT blocks crawlers \u2014 byline page given. Covering UC/higher-ed incl. $1.2B DOJ-UCLA settlement fight.", "_links": {"latest_article": "https://muckrack.com/jaweedkaleem/articles"}}, {"name": "Kevin Richert", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News", "medium": "Print/Digital", "beat": "Education politics; education policy; higher education", "email": "krichert@idahoednews.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "ID", "latest_article": "How the feds' healthcare grants could affect Idaho education: Three examples", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-03", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Byline, date, email verified on article page.", "_links": {"latest_article": "https://www.idahoednews.org/top-news/how-the-feds-healthcare-grants-could-affect-idaho-education-three-examples/"}}, {"name": "Melanie Asmar", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Colorado (Bureau Chief)", "medium": "Print/Digital", "beat": "Denver Public Schools; school board governance; K-12 policy", "email": "masmar@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "CO", "latest_article": "Free school supplies, haircuts, vaccines, and more. Check out these 2026 back-to-school events", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-01-21", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page.", "_links": {"latest_article": "https://www.chalkbeat.org/colorado/2026/07/22/free-back-to-school-supplies-backpacks-haircuts-in-denver-metro-area/"}}, {"name": "Mikhail Zinshteyn", "outlet_on_file": "CalMatters", "current_outlet_verified": "CalMatters", "medium": "Print/Digital", "beat": "Higher education; state legislation; financial aid; labor issues; campus housing; college affordability", "email": "mikhail@calmatters.org", "email_source": "SDCC database", "phone": "", "twitter": "mzinshteyn", "location": "CA", "latest_article": "White House admits it used keywords to kill billions worth of California research grants", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-11", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on CalMatters author page.", "_links": {"latest_article": "https://calmatters.org/education/higher-education/2026/07/research-grants-california-2/"}}, {"name": "Ryan Suppe", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News (senior reporter, K-12 policy)", "medium": "Print/Digital", "beat": "Education policy; K-12 focus", "email": "ryan@idahoednews.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "ID", "latest_article": "Former Nampa school board chair resigns", "article_date": "2026-07-21", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-02", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on IEN author page; LinkedIn confirms current role.", "_links": {"latest_article": "https://www.idahoednews.org/news/former-nampa-school-board-chairwoman-resigns/"}}, {"name": "Sean Dolan", "outlet_on_file": "Idaho Education News", "current_outlet_verified": "Idaho Education News", "medium": "Print/Digital", "beat": "Education state policy; local district governance", "email": "sean@idahoednews.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "ID", "latest_article": "Schools face soaring laptop costs as AI data centers squeeze supply", "article_date": "2026-07-20", "link_type": "article", "articles_tracked_10yr": "3", "last_tracked_date": "2026-03-25", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "BoiseDev syndication of his IEN piece. Email on IEN author page.", "_links": {"latest_article": "https://boisedev.com/news/2026/07/20/schools-face-soaring-laptop-costs-as-ai-data-centers-squeeze-supply/"}}, {"name": "Melissa Brown", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Tennessee (Bureau Chief)", "medium": "Print/Digital", "beat": "Tennessee education policy; school choice/vouchers; immigration impacts on schools", "email": "mbrown@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "TN", "latest_article": "Tennessee considers easing teacher licensure testing requirements", "article_date": "2026-07-08", "link_type": "article", "articles_tracked_10yr": "2", "last_tracked_date": "2026-03-10", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Chalkbeat author page. Leading Memphis-Shelby state-takeover coverage.", "_links": {"latest_article": "https://www.chalkbeat.org/tennessee/2026/07/08/will-tennessee-drop-edtpa-requirement-for-teacher-licensure/"}}, {"name": "Reema Amin", "outlet_on_file": "Chalkbeat", "current_outlet_verified": "Chalkbeat Chicago", "medium": "Print/Digital", "beat": "Chicago Public Schools", "email": "ramin@chalkbeat.org", "email_source": "SDCC database", "phone": "", "twitter": "", "location": "Chicago IL", "latest_article": "Chicago Public Schools lays off 162 central and citywide employees", "article_date": "2026-07-13", "link_type": "article", "articles_tracked_10yr": "1", "last_tracked_date": "2026-03-20", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email publicly listed by Chalkbeat.", "_links": {"latest_article": "https://www.chalkbeat.org/chicago/2026/07/13/cps-lays-off-162-central-and-citywide-employees/"}}, {"name": "Jaden Edison", "outlet_on_file": "The Texas Tribune", "current_outlet_verified": "The Texas Tribune", "medium": "Print/Digital", "beat": "Public education", "email": "jaden.edison@texastribune.org", "email_source": "SDCC database", "phone": "512-716-8600", "twitter": "", "location": "TX", "latest_article": "Texas' longstanding 'Robin Hood' school finance system will face a new legal challenge", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Email on Tribune staff page.", "_links": {"latest_article": "https://www.texastribune.org/2026/07/22/west-texas-midland-district-lawsuit-school-finance-robin-hood/"}}, {"name": "jillian", "outlet_on_file": "", "current_outlet_verified": "", "medium": "Print/Digital", "beat": "General", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "", "latest_article": "", "article_date": "", "link_type": "", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "DATA-ENTRY STUB \u2014 no outlet on file", "_links": {}}, {"name": "marka", "outlet_on_file": "", "current_outlet_verified": "", "medium": "Print/Digital", "beat": "General", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "", "latest_article": "", "article_date": "", "link_type": "", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "DATA-ENTRY STUB \u2014 no outlet on file", "_links": {}}, {"name": "news day", "outlet_on_file": "", "current_outlet_verified": "", "medium": "Print/Digital", "beat": "General", "email": "", "email_source": "not found", "phone": "", "twitter": "", "location": "", "latest_article": "", "article_date": "", "link_type": "", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "DATA-ENTRY STUB \u2014 no outlet on file", "_links": {}}, {"name": "Sneha Dey", "outlet_on_file": "The Texas Tribune", "current_outlet_verified": "The Texas Tribune", "medium": "Print/Digital", "beat": "Public education", "email": "sneha.dey@texastribune.org", "email_source": "SDCC database", "phone": "512-716-8600", "twitter": "", "location": "Austin TX", "latest_article": "Higher education agency prepares to cut 3% of spending as ordered by Texas leaders", "article_date": "2026-07-22", "link_type": "article", "articles_tracked_10yr": "0", "last_tracked_date": "", "first_contact": "", "initial_email": "", "last_contact": "", "last_email": "", "contact_source": "no contact on record", "notes": "Beat now education-to-employment pathways, community colleges, higher ed. Email on Tribune author page.", "_links": {"latest_article": "https://www.texastribune.org/2026/07/22/texas-higher-education-spending-cuts/"}}]}
\ No newline at end of file
diff --git a/data/user-notes.json b/data/user-notes.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/data/user-notes.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index c225040..419ce6e 100644
--- a/public/index.html
+++ b/public/index.html
@@ -60,6 +60,19 @@ table.list thead th .arr { font-size:10px; margin-left:3px; }
table.list tbody tr:hover { background:var(--surface); }
table.list td.notes-cell { white-space:normal; max-width:340px; color:var(--muted); font-style:italic; }
table.list td.num { text-align:right; font-variant-numeric:tabular-nums; }
+table.list tr.row-main td { border-bottom:0; }
+table.list tr.notes-row td { padding-top:2px; }
+/* Notes-below-user + editable note (shared by list + cards) */
+.note-block { display:flex; flex-direction:column; gap:6px; padding:2px 0 4px; white-space:normal; max-width:920px; }
+.sheet-note { color:var(--muted); font-style:italic; font-size:calc(12px*var(--scale)); }
+.sheet-note b { color:var(--sub); font-style:normal; }
+.user-note { display:flex; align-items:flex-start; gap:8px; flex-wrap:wrap; }
+.user-note .un-text { color:var(--text); font-size:calc(12.5px*var(--scale)); white-space:pre-wrap; }
+.user-note .un-text.empty { color:var(--muted); font-style:italic; }
+.user-note .un-tag { font-size:10px; color:var(--pri); border:1px solid var(--pri); border-radius:99px; padding:0 6px; align-self:center; }
+.user-note textarea { flex:1 1 260px; background:var(--el); border:1px solid var(--border); border-radius:8px; color:var(--text); padding:6px 9px; font:inherit; font-size:calc(12.5px*var(--scale)); resize:vertical; min-height:52px; }
+.un-edit, .un-save, .un-cancel { padding:2px 9px; font-size:11.5px; }
+.un-save { border-color:var(--pri); color:var(--pri); }
@media (max-width:900px){ .layout{flex-direction:column} aside{width:100%;position:static;max-height:none;flex:auto} :root{--cols:1!important} }
</style>
</head>
@@ -129,10 +142,10 @@ const COLUMNS = [
["articles_tracked_10yr","Tracked","num"],
["date_of_last_contact","Last contact","date"],
["date_of_first_contact","First contact","date"],
- ["notes","Notes","text"],
];
let VIEW = LS("view")||"cards";
let TSORT = { col: LS("tcol")||"name", dir: +(LS("tdir")||1) };
+let UNOTES = {}; // Steve-added notes, name → text (from /api/notes)
const vis = {};
FIELDS.forEach(([k,,def])=>{ const s=LS("f_"+k); vis[k] = s===null?def:s==="1"; });
@@ -192,7 +205,7 @@ function card(r){
const t = esc(r.latest_article||"latest article");
parts.push(`<div class="article">${L.latest_article?`<a href="${esc(L.latest_article)}" target="_blank" rel="noopener noreferrer">${t} ↗</a>`:t}${r.article_date?`<div>${esc(r.article_date)}${r.link_type==="author_page"?" · byline page":""}</div>`:""}</div>`);
}
- if(vis.notes&&r.notes) parts.push(`<div class="notes">${esc(r.notes)}</div>`);
+ parts.push(noteBlockHTML(r, vis.notes)); // sheet note (toggle-gated) + your editable note
return el(`<div class="card">${parts.join("")}</div>`);
}
@@ -218,6 +231,7 @@ function renderCards(rows){
if(s==="contact") rows.sort((a,b)=>((b.date_of_last_contact||"")+(+b.articles_tracked_10yr||0)).localeCompare((a.date_of_last_contact||"")+(+a.articles_tracked_10yr||0)));
const grid=document.getElementById("grid"); grid.innerHTML="";
rows.forEach(r=>grid.appendChild(card(r)));
+ wireNotes(grid);
}
// One cell of the list view — key cells become clickable (email, phone, X, article, gmail threads).
@@ -234,6 +248,49 @@ function cellHTML(r,col){
return esc(v||"");
}
+// Notes-below-user block: the Drive/sheet note (read-only) + Steve's own editable note.
+function noteBlockHTML(r, showSheet){
+ const sheet = (showSheet && r.notes) ? `<div class="sheet-note"><b>Sheet:</b> ${esc(r.notes)}</div>` : "";
+ const un = UNOTES[r.name] || "";
+ return `<div class="note-block" data-name="${esc(r.name)}">${sheet}`
+ + `<div class="user-note">${userNoteInner(un)}</div></div>`;
+}
+function userNoteInner(un){
+ return `<span class="un-tag">my note</span>`
+ + `<span class="${un?"un-text":"un-text empty"}">${un?esc(un):"add a note…"}</span>`
+ + `<button type="button" class="un-edit" title="Add or edit your note">✎</button>`;
+}
+function wireNotes(root){
+ root.querySelectorAll(".note-block").forEach(nb=>{
+ const btn = nb.querySelector(".un-edit");
+ if(btn) btn.onclick = () => openNoteEditor(nb, nb.getAttribute("data-name"));
+ });
+}
+function openNoteEditor(nb, name){
+ const wrap = nb.querySelector(".user-note");
+ const cur = UNOTES[name] || "";
+ wrap.innerHTML = `<textarea class="un-ta" placeholder="Your note about ${esc(name)}…">${esc(cur)}</textarea>`
+ + `<button type="button" class="un-save">Save</button><button type="button" class="un-cancel">Cancel</button>`;
+ const ta = wrap.querySelector(".un-ta"); ta.focus(); ta.setSelectionRange(ta.value.length, ta.value.length);
+ wrap.querySelector(".un-cancel").onclick = () => restoreNote(wrap, name);
+ wrap.querySelector(".un-save").onclick = async (e) => {
+ const val = ta.value; e.target.disabled = true; e.target.textContent = "Saving…";
+ const ok = await saveNote(name, val);
+ if(ok){ const t=val.trim(); if(t) UNOTES[name]=t; else delete UNOTES[name]; }
+ else { e.target.disabled=false; e.target.textContent="Save"; alert("Couldn't save the note — try again."); return; }
+ restoreNote(wrap, name);
+ };
+}
+function restoreNote(wrap, name){
+ wrap.innerHTML = userNoteInner(UNOTES[name] || "");
+ const nb = wrap.closest(".note-block");
+ wrap.querySelector(".un-edit").onclick = () => openNoteEditor(nb, name);
+}
+async function saveNote(name, note){
+ try { const r = await fetch("/api/notes", { method:"POST", headers:{"Content-Type":"application/json"}, body:JSON.stringify({name, note}) }); return r.ok; }
+ catch { return false; }
+}
+
function renderTable(rows){
const col = COLUMNS.find(c=>c[0]===TSORT.col) || COLUMNS[0];
const isEmpty = r => col[2]==="num" ? false : !((r[col[0]]||"").toString().trim());
@@ -249,11 +306,11 @@ function renderTable(rows){
const active=c[0]===col[0];
return `<th data-col="${c[0]}" class="${active?"sorted":""}" title="Sort by ${esc(c[1])}">${esc(c[1])}${active?`<span class="arr">${TSORT.dir>0?"▲":"▼"}</span>`:""}</th>`;
}).join("");
- const body = rows.map(r=>"<tr>"+COLUMNS.map(c=>{
- const cls=c[0]==="notes"?"notes-cell":(c[2]==="num"?"num":"");
- const title=c[0]==="notes"?` title="${esc(r.notes||"")}"`:"";
- return `<td class="${cls}"${title}>${cellHTML(r,c)}</td>`;
- }).join("")+"</tr>").join("");
+ const body = rows.map(r=>{
+ const cells = COLUMNS.map(c=>`<td class="${c[2]==="num"?"num":""}">${cellHTML(r,c)}</td>`).join("");
+ // notes moved to a full-width row right below the journalist's row
+ return `<tr class="row-main">${cells}</tr><tr class="notes-row"><td colspan="${COLUMNS.length}">${noteBlockHTML(r,true)}</td></tr>`;
+ }).join("");
const wrap=document.getElementById("tablewrap");
wrap.innerHTML=`<table class="list"><thead><tr>${head}</tr></thead><tbody>${body}</tbody></table>`;
wrap.querySelectorAll("thead th").forEach(h=>h.onclick=()=>{
@@ -262,6 +319,7 @@ function renderTable(rows){
else { TSORT.col=c; const t=(COLUMNS.find(x=>x[0]===c)||[])[2]; TSORT.dir=(t==="num"||t==="date")?-1:1; } // num/date default desc
LS("tcol",TSORT.col); LS("tdir",TSORT.dir); render();
});
+ wireNotes(wrap);
}
function render(){
@@ -286,6 +344,7 @@ async function load(){
date_of_last_contact:x.last_contact||x.date_of_last_contact, contact_source:x.contact_source, notes:x.notes, _links:x._links||{}
}));
META=j;
+ try { const nr = await fetch("/api/notes"); UNOTES = nr.ok ? await nr.json() : {}; } catch { UNOTES = {}; }
const t = j.generated_at ? new Date(j.generated_at) : null;
document.getElementById("syncinfo").textContent =
(j.drive_pull_ok?"synced from Drive ":"⚠ Drive unreachable, cached ") + (t?t.toLocaleString(undefined,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"}):"");
diff --git a/server.js b/server.js
index a73456b..a8d5216 100644
--- a/server.js
+++ b/server.js
@@ -34,6 +34,9 @@ const ALLOWED_EMAILS = (process.env.ALLOWED_EMAILS || 'steveabramsdesigns@gmail.
const DATA_JSON = path.join(__dirname, 'data', 'journalists.json');
const REFRESH = path.join(__dirname, 'scripts', 'refresh.py');
+// Steve-added notes — kept OUT of journalists.json so the 5-min Drive re-pull can't clobber them.
+const USER_NOTES_JSON = path.join(__dirname, 'data', 'user-notes.json');
+function readUserNotes() { try { return JSON.parse(fs.readFileSync(USER_NOTES_JSON, 'utf8')); } catch { return {}; } }
/* ─── Drive refresh loop ─────────────────────────────────────────────── */
let refreshing = false;
@@ -208,6 +211,32 @@ const server = http.createServer(async (req, res) => {
}
}
+ if (url === '/api/notes' && req.method === 'GET') {
+ res.writeHead(200, { 'Content-Type': 'application/json' });
+ return res.end(JSON.stringify(readUserNotes()));
+ }
+
+ if (url === '/api/notes' && req.method === 'POST') {
+ let body = '';
+ req.on('data', c => { body += c; if (body.length > 20000) req.destroy(); });
+ req.on('end', () => {
+ try {
+ const { name, note } = JSON.parse(body || '{}');
+ if (!name || typeof name !== 'string') { res.writeHead(400, { 'Content-Type': 'application/json' }); return res.end('{"error":"name required"}'); }
+ const notes = readUserNotes();
+ const clean = String(note == null ? '' : note).slice(0, 4000);
+ if (clean.trim() === '') delete notes[name]; else notes[name] = clean; // empty note = delete
+ fs.writeFileSync(USER_NOTES_JSON, JSON.stringify(notes, null, 2));
+ res.writeHead(200, { 'Content-Type': 'application/json' });
+ res.end(JSON.stringify({ ok: true, name, note: clean }));
+ } catch (e) {
+ res.writeHead(400, { 'Content-Type': 'application/json' });
+ res.end(JSON.stringify({ ok: false, error: e.message }));
+ }
+ });
+ return;
+ }
+
if (url === '/api/refresh' && req.method === 'POST') {
return refresh((err) => {
res.writeHead(err ? 500 : 200, { 'Content-Type': 'application/json' });
← 924abb5 auto-save: 2026-07-23T10:50:25 (1 files) — data/journalists.
·
back to Sdcc Journalists Viewer
·
auto-save: 2026-07-23T11:20:37 (1 files) — data/journalists. 179ec37 →