Correct Follower Directory scope: move engaged non-followers out

Mckinley checked LinkedIn directly and confirmed Arunangshu Debnath
does not follow the Page, despite being added to the Follower
Directory. Root cause: this session added 15 people to the Directory
straight from post-engagement audits (08/09, 15/09, 22/09) without
verifying follow status — the exact mistake outreach_contacts.py's
own docstring warns against ("assumed every remaining entry was a
real follower"). A separate session (Demographics, which owns the
Directory) picked up 5 of these placeholders this morning, enriched
them further, and recomputed Follower Study's charts against the
resulting inflated 147-record dataset.

Moves all 15 people (Arunangshu Debnath, Simon Sebold, Martin Uhlig,
Chen Shen, Philipp Brandt, Dr. Sonia Utermann, Dr. Jefferson do
Rosario Stelzer, Sani Harouna-Mayer, Shrouk Ehab, Harish
Purushothaman, Mallika K., Sebastian Sell, Azat Khadiev, Ali A.,
Maximilian Harr) from the Directory to outreach_contacts.py, where
engaged-non-follower records belong. Directory count: 156 -> 142
(140 baseline + 2 legitimate new followers the Demographics session
added this morning, Namrata Sharma and Renske M. van der Veen, not
yet reflected in the Sep 26 export). Follower Study's charts/prose
in assets/follower_study.html are now stale against the corrected
dataset — that file belongs to the Demographics session, flagging
rather than editing it here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
beantownbabeandClaude Sonnet 5 committed 2026-09-30 11:04:49 +02:00
1 parent 6ca84d1b84
commit a6770565f1
3 files changed
+668 -1

No files matched your search

+1 -1
View File
@@ -209,7 +209,7 @@ header.hero p.sub { color: var(--text-secondary); font-size: 0.95rem; line-heigh
</div>
<script>
const DATA = [{"name": "Tamadur AlBaraghtheh", "connection": "1st", "position": "Researcher", "company": "Helmholtz-Zentrum Geesthacht", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Geesthacht (near Hamburg)", "personalLocation": "Hamburg, Germany", "seniority": "Researcher/Scientist (non-postdoc)", "function": "Research/Science", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/tamadur-albaraghtheh-3380ba7a/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Research/Science", "industry": "Research & Collaborations", "industryOther": ""}, {"name": "Alexej Kotelnikov", "connection": "3rd", "position": "Senior KAM & BD (Automotive/Tech/Industrial)", "company": "Bosch Automotive Service Solutions GmbH", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Plochingen (near Stuttgart)", "personalLocation": "Greater Munich Metropolitan Area", "seniority": "Senior IC/Lead", "function": "Business Development/Sales", "sector": "Other named company", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/alexej-kotelnikov-10013a5a/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Senior / Lead / Principal", "roleLevelNote": "", "department": "Business Development/Sales", "industry": "Other", "industryOther": "Automotive Service & Diagnostics Equipment"}, {"name": "Katrin Boeke-Purkis", "connection": "3rd", "position": "Regulatory Post Market Compliance Coordinator", "company": "Intuitive Surgical", "followed": "July 2026", "followedSort": "2026-07", "country": "United States", "city": "Sunnyvale, California (HQ)", "personalLocation": "Sunnyvale, California, United States", "seniority": "Manager/Coordinator", "function": "Regulatory/Compliance", "sector": "Medical/Life Sciences", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/katrin-boeke-purkis-5722888/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Regulatory/Compliance", "industry": "Other", "industryOther": "Medical/Life Sciences"}, {"name": "Timo Christian", "connection": "2nd", "position": "Program Manager", "company": "Impossible Founders and DESY", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Hamburg", "personalLocation": "Hamburg, Germany", "seniority": "Manager/Coordinator", "function": "Marketing/Comms/Ops", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/timo-christian/", "is_team": false, "company_website": "", "engagement_notes": "Liked 16/07 post.", "roleLevel": "Manager", "roleLevelNote": "", "department": "Marketing/Comms/Ops", "industry": "Research & Collaborations", "industryOther": ""}, {"name": "Jan-Christian Schober", "connection": "3rd", "position": "Student", "company": "University of Hamburg", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Hamburg", "personalLocation": "Hamburg, Germany", "seniority": "Student/Trainee", "function": "Student/Academic Track", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/jan-christian-schober-78b72926a/", "is_team": false, "company_website": "", "roleLevel": "Student", "roleLevelNote": "", "department": "Student/Academic Track", "industry": "Academia", "industryOther": ""}, {"name": "Benedikt Kubicki", "connection": "2nd", "position": "SAP-Berater", "company": "SI PRO GmbH", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Mannheim (HQ); has a Hamburg office", "personalLocation": "Hamburg, Germany", "seniority": "Manager/Coordinator", "function": "Engineering/Technical", "sector": "Other named company", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/benedikt-kubicki-31652b25a/", "is_team": false, "company_website": "", "engagement_notes": "Commented on 09/07 post; liked 15/09 \u2014 repeat engager.", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Engineering/Technical", "industry": "OLine truncated
const DATA = [{"name": "Tamadur AlBaraghtheh", "connection": "1st", "position": "Researcher", "company": "Helmholtz-Zentrum Geesthacht", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Geesthacht (near Hamburg)", "personalLocation": "Hamburg, Germany", "seniority": "Researcher/Scientist (non-postdoc)", "function": "Research/Science", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/tamadur-albaraghtheh-3380ba7a/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Research/Science", "industry": "Research & Collaborations", "industryOther": ""}, {"name": "Alexej Kotelnikov", "connection": "3rd", "position": "Senior KAM & BD (Automotive/Tech/Industrial)", "company": "Bosch Automotive Service Solutions GmbH", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Plochingen (near Stuttgart)", "personalLocation": "Greater Munich Metropolitan Area", "seniority": "Senior IC/Lead", "function": "Business Development/Sales", "sector": "Other named company", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/alexej-kotelnikov-10013a5a/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Senior / Lead / Principal", "roleLevelNote": "", "department": "Business Development/Sales", "industry": "Other", "industryOther": "Automotive Service & Diagnostics Equipment"}, {"name": "Katrin Boeke-Purkis", "connection": "3rd", "position": "Regulatory Post Market Compliance Coordinator", "company": "Intuitive Surgical", "followed": "July 2026", "followedSort": "2026-07", "country": "United States", "city": "Sunnyvale, California (HQ)", "personalLocation": "Sunnyvale, California, United States", "seniority": "Manager/Coordinator", "function": "Regulatory/Compliance", "sector": "Medical/Life Sciences", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/katrin-boeke-purkis-5722888/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Regulatory/Compliance", "industry": "Other", "industryOther": "Medical/Life Sciences"}, {"name": "Timo Christian", "connection": "2nd", "position": "Program Manager", "company": "Impossible Founders and DESY", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Hamburg", "personalLocation": "Hamburg, Germany", "seniority": "Manager/Coordinator", "function": "Marketing/Comms/Ops", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/timo-christian/", "is_team": false, "company_website": "", "engagement_notes": "Liked 16/07 post.", "roleLevel": "Manager", "roleLevelNote": "", "department": "Marketing/Comms/Ops", "industry": "Research & Collaborations", "industryOther": ""}, {"name": "Jan-Christian Schober", "connection": "3rd", "position": "Student", "company": "University of Hamburg", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Hamburg", "personalLocation": "Hamburg, Germany", "seniority": "Student/Trainee", "function": "Student/Academic Track", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/jan-christian-schober-78b72926a/", "is_team": false, "company_website": "", "roleLevel": "Student", "roleLevelNote": "", "department": "Student/Academic Track", "industry": "Academia", "industryOther": ""}, {"name": "Benedikt Kubicki", "connection": "2nd", "position": "SAP-Berater", "company": "SI PRO GmbH", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Mannheim (HQ); has a Hamburg office", "personalLocation": "Hamburg, Germany", "seniority": "Manager/Coordinator", "function": "Engineering/Technical", "sector": "Other named company", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/benedikt-kubicki-31652b25a/", "is_team": false, "company_website": "", "engagement_notes": "Commented on 09/07 post; liked 15/09 \u2014 repeat engager.", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Engineering/Technical", "industry": "OLine truncated
const SECTOR_COLORS = {
'Academia/Research Institute': 'var(--series-1)',
@@ -0,0 +1,531 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TXproducts Follower Directory</title>
<style>
.viz-root {
color-scheme: light;
--surface-1: #fcfcfb;
--page: #f9f9f7;
--text-primary: #0b0b0b;
--text-secondary: #52514e;
--text-muted: #898781;
--gridline: #e1e0d9;
--baseline: #c3c2b7;
--border: rgba(11,11,11,0.10);
--series-1: #2a78d6; --series-2: #eb6834; --series-3: #1baf7a; --series-4: #eda100;
--series-5: #e87ba4; --series-6: #008300; --series-7: #4a3aa7; --series-8: #e34948;
--muted-fill: #c3c2b7;
--chip-bg: #f0efec;
--controls-bg: #fbf3d9;
}
@media (prefers-color-scheme: dark) {
:root:where(:not([data-theme="light"])) .viz-root {
color-scheme: dark;
--surface-1: #1a1a19; --page: #0d0d0d; --text-primary: #ffffff; --text-secondary: #c3c2b7;
--text-muted: #898781; --gridline: #2c2c2a; --baseline: #383835; --border: rgba(255,255,255,0.10);
--series-1: #3987e5; --series-2: #d95926; --series-3: #199e70; --series-4: #c98500;
--series-5: #d55181; --series-6: #008300; --series-7: #9085e9; --series-8: #e66767;
--muted-fill: #383835; --chip-bg: #242422;
--controls-bg: #362e17;
}
}
:root[data-theme="dark"] .viz-root {
color-scheme: dark;
--surface-1: #1a1a19; --page: #0d0d0d; --text-primary: #ffffff; --text-secondary: #c3c2b7;
--text-muted: #898781; --gridline: #2c2c2a; --baseline: #383835; --border: rgba(255,255,255,0.10);
--series-1: #3987e5; --series-2: #d95926; --series-3: #199e70; --series-4: #c98500;
--series-5: #d55181; --series-6: #008300; --series-7: #9085e9; --series-8: #e66767;
--muted-fill: #383835; --chip-bg: #242422;
--controls-bg: #152943;
}
* { box-sizing: border-box; }
body { margin: 0; }
.viz-root { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; background: var(--page); color: var(--text-primary); padding: 0 0 64px 0; }
.wrap { max-width: 1240px; margin: 0 auto; padding: 0 24px; }
header.hero { padding: 40px 24px 24px; max-width: 1240px; margin: 0 auto; }
header.hero h1 { font-size: 1.6rem; margin: 0 0 8px; letter-spacing: -0.01em; }
header.hero p.sub { color: var(--text-secondary); font-size: 0.95rem; line-height: 1.55; margin: 0; }
.kpi-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 16px; }
.kpi-tile { background: var(--surface-1); border: 1px solid var(--border); border-radius: 10px; padding: 14px 16px; }
.kpi-tile .val { font-size: 1.5rem; font-weight: 600; font-variant-numeric: tabular-nums; }
.kpi-tile .lbl { color: var(--text-secondary); font-size: 0.76rem; margin-top: 3px; line-height: 1.3; }
@media (max-width: 640px) { .kpi-row { grid-template-columns: 1fr 1fr; } }
.controls { background: var(--controls-bg); border: 1px solid var(--border); border-radius: 10px; padding: 16px 18px; margin-bottom: 20px; display: flex; flex-wrap: nowrap; gap: 8px; align-items: center; overflow-x: auto; }
.controls input[type="text"] { flex: 1 1 180px; min-width: 140px; padding: 9px 10px; border-radius: 8px; border: 1px solid var(--border); background: var(--page); color: var(--text-primary); font-size: 0.85rem; }
.controls select { flex: none; padding: 9px 8px; border-radius: 8px; border: 1px solid var(--border); background: var(--page); color: var(--text-primary); font-size: 0.82rem; max-width: 160px; }
.controls button.clear { flex: none; padding: 8px 10px; border-radius: 8px; border: 1px solid var(--border); background: var(--page); color: var(--text-secondary); font-size: 0.8rem; cursor: pointer; white-space: nowrap; }
.controls button.clear:hover { background: var(--chip-bg); }
.scroll-viewport { max-height: 620px; overflow-y: auto; }
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); gap: 12px; }
.card { background: var(--surface-1); border: 1px solid var(--border); border-radius: 12px; padding: 16px; display: flex; gap: 12px; }
.avatar { flex: none; width: 46px; height: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9rem; color: #fff; }
.card-body { min-width: 0; flex: 1; }
.card-name-row { display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; }
.card-name { font-weight: 600; font-size: 0.95rem; }
.card-degree { font-size: 0.72rem; color: var(--text-muted); }
.card-position { font-size: 0.82rem; color: var(--text-secondary); margin-top: 2px; line-height: 1.4; }
.card-company { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }
.card-followed { font-size: 0.74rem; color: var(--text-muted); margin-top: 4px; }
.card-links { display: flex; gap: 10px; margin-top: 4px; }
.card-links a { font-size: 0.72rem; color: var(--series-1); text-decoration: none; font-weight: 600; }
.card-links a:hover { text-decoration: underline; }
.tag-row { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
.tag { font-size: 0.68rem; padding: 3px 8px; border-radius: 999px; background: var(--chip-bg); color: var(--text-secondary); white-space: nowrap; }
.tag.country { color: var(--text-primary); font-weight: 600; }
.tag.outreach { background: #1baf7a; color: #ffffff; font-weight: 600; }
.empty-state { text-align: center; padding: 40px; color: var(--text-muted); font-size: 0.9rem; }
.view-toggle { display: flex; gap: 8px; margin-top: 10px; }
.view-toggle-btn { padding: 7px 16px; border-radius: 8px; border: 1px solid var(--border); background: var(--surface-1); color: var(--text-secondary); font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.view-toggle-btn.active { background: var(--series-1); color: #ffffff; border-color: var(--series-1); }
.board-sub { margin-bottom: 16px; }
.rules-callout { background: var(--controls-bg); color: var(--text-secondary); border: 1px solid var(--border); border-radius: 10px; padding: 14px 18px; margin-bottom: 18px; font-size: 0.82rem; line-height: 1.55; }
.rules-callout strong { color: var(--text-primary); }
.rules-callout a { color: var(--text-primary); text-decoration: underline; font-weight: 600; }
.board { display: grid; grid-template-columns: 1fr 2.5fr; gap: 14px; align-items: start; }
.board-legend { font-size: 0.76rem; color: var(--text-secondary); margin-bottom: 12px; }
.bc-star { color: #eda100; margin-right: 4px; }
.bc-star-team { color: #2a78d6; margin-right: 4px; }
.detail-panel { position: relative; background: var(--surface-1); border: 2px solid var(--series-1); border-radius: 10px; padding: 18px 20px; margin-bottom: 16px; }
.detail-close { position: absolute; top: 10px; right: 12px; background: none; border: none; font-size: 1.4rem; line-height: 1; color: var(--text-muted); cursor: pointer; }
.detail-close:hover { color: var(--text-primary); }
.detail-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.detail-col h4 { margin: 0 0 10px; font-size: 0.85rem; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.03em; }
.detail-field { font-size: 0.85rem; margin-bottom: 8px; }
.detail-field .dl { color: var(--text-muted); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.03em; display: block; }
.detail-field .dv { color: var(--text-primary); }
.detail-log-entry { font-size: 0.82rem; padding: 8px 0; border-bottom: 1px dashed var(--border); }
.detail-log-entry:last-child { border-bottom: none; }
.detail-log-entry .dl-date { display: block; font-weight: 700; color: var(--text-primary); font-size: 0.74rem; }
@media (max-width: 900px) { .detail-cols { grid-template-columns: 1fr; } }
.board-col { background: var(--surface-1); border: 1px solid var(--border); border-radius: 10px; padding: 10px; min-height: 120px; }
.board-col-header { font-size: 0.8rem; font-weight: 700; color: var(--text-primary); padding: 4px 6px 10px; display: flex; justify-content: space-between; align-items: center; }
.board-col-count { font-size: 0.72rem; font-weight: 600; color: var(--text-secondary); background: var(--chip-bg); border-radius: 999px; padding: 2px 8px; }
.board-card { background: var(--page); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; margin-bottom: 8px; font-size: 0.78rem; cursor: pointer; }
.board-card:hover { border-color: var(--series-1); }
.board-card .bc-name { font-weight: 700; color: var(--text-primary); }
.board-card .bc-meta { color: var(--text-secondary); font-size: 0.7rem; margin-top: 2px; }
.board-card .bc-last-log { color: var(--text-muted); font-size: 0.7rem; margin-top: 4px; font-style: italic; }
.board-card.expanded { border-color: var(--series-1); }
.bc-full-log { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); max-height: 220px; overflow-y: auto; }
.bc-log-entry { font-size: 0.72rem; color: var(--text-secondary); padding: 4px 0; border-bottom: 1px dashed var(--border); }
.bc-log-entry:last-child { border-bottom: none; }
.bc-log-date { display: block; font-weight: 700; color: var(--text-primary); font-size: 0.68rem; }
.bc-log-empty { font-style: italic; color: var(--text-muted); }
@media (max-width: 900px) { .board { grid-template-columns: 1fr 1fr; } }
@media (max-width: 640px) { .board { grid-template-columns: 1fr; } }
.legend { display: flex; flex-wrap: nowrap; gap: 10px; align-items: center; margin: 0 0 16px; font-size: 0.74rem; color: var(--text-secondary); overflow-x: auto; padding-bottom: 2px; }
.legend-item { display: flex; align-items: center; gap: 4px; flex: none; white-space: nowrap; }
.legend-dot { width: 10px; height: 10px; border-radius: 50%; flex: none; }
</style>
</head>
<body>
<div class="viz-root">
<header class="hero">
<h1>TXproducts Follower Directory</h1>
<p class="sub">A searchable, filterable card view of every TXproducts follower (updated 2026-08-03, third pass)</p>
<div class="view-toggle">
<button class="view-toggle-btn active" id="viewDirectoryBtn">Directory View</button>
<button class="view-toggle-btn" id="viewBoardBtn">Outreach Board</button>
<button class="view-toggle-btn" id="viewGotoBtn" onclick="window.open('goto_messaging.html', '_blank')">Handbook of the Rules</button>
</div>
</header>
<div class="wrap" id="directoryView">
<div class="kpi-row" id="kpiRow">
<div class="kpi-tile"><div class="val" id="kpiCount">&mdash;</div><div class="lbl">followers match current search/filters</div></div>
<div class="kpi-tile"><div class="val" id="kpiSenior">&mdash;</div><div class="lbl">in senior positions (C-level, Director/Head, or Senior IC/Lead)</div></div>
<div class="kpi-tile"><div class="val" id="kpiCountries">&mdash;</div><div class="lbl">countries represented</div></div>
<div class="kpi-tile"><div class="val" id="kpiUnknown">&mdash;</div><div class="lbl">still need detective work (sector/employer unknown)</div></div>
</div>
<div class="controls">
<input type="text" id="search" name="follower-search-q" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search name, position, or company...">
<select id="filterSeniority"><option value="">All seniority</option><option value="__postdoc_student__">Postdoc/Student (combined)</option></select>
<select id="filterFunction"><option value="">All functions</option></select>
<select id="filterSector"><option value="">All sectors</option></select>
<select id="filterCountry"><option value="">All countries</option></select>
<select id="filterFollowed"><option value="">All follow dates</option></select>
<button class="clear" id="clearBtn">Clear filters</button>
</div>
<div class="legend" id="legend"></div>
<div class="scroll-viewport" id="scrollViewport">
<div class="grid" id="grid"></div>
</div>
<div class="empty-state" id="emptyState" style="display:none;">No followers match these filters.</div>
</div>
<div class="wrap" id="boardView" style="display:none;">
<p class="sub board-sub">Every follower grouped by outreach stage. Click a card's title bar for the full log.</p>
<div class="rules-callout">
<strong>What this board is (and isn't) for:</strong> connecting and messaging people here always happens through the admin's own personal LinkedIn profile, not the TXproducts Page, LinkedIn Pages can only have followers, never connections, and there's no paid plan that changes that. So this board tracks relationship-building and engagement with people who already follow TXproducts, it does not add to the TXproducts follower count. The free lever that actually grows TXproducts followers is that admin inviting their own personal connections to follow the Page, a downstream step once someone here accepts. See the <a href="goto_messaging.html" target="_blank">Handbook of the Rules</a> for the full explanation.
</div>
<div class="kpi-row" style="grid-template-columns: repeat(3, 1fr);">
<div class="kpi-tile"><div class="val" id="kpiBoardTotal">&mdash;</div><div class="lbl">followers match current search/filters</div></div>
<div class="kpi-tile"><div class="val" id="kpiBoardContacted">&mdash;</div><div class="lbl">contacted so far</div></div>
<div class="kpi-tile"><div class="val" id="kpiBoardResponded">&mdash;</div><div class="lbl">have responded</div></div>
</div>
<div class="board-legend">
&#9733; <span style="color:#eda100; font-weight:700;">gold</span> = Valuable Contact
&nbsp;&nbsp;&#9733; <span style="color:#2a78d6; font-weight:700;">blue</span> = TXproducts
</div>
<div class="controls">
<input type="text" id="boardSearch" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search name, position, or company...">
<select id="boardFilterSeniority"><option value="">All seniority</option><option value="__postdoc_student__">Postdoc/Student (combined)</option></select>
<select id="boardFilterFunction"><option value="">All functions</option></select>
<select id="boardFilterSector"><option value="">All sectors</option></select>
<select id="boardFilterCountry"><option value="">All countries</option></select>
<select id="boardFilterFollowed"><option value="">All follow dates</option></select>
<select id="boardStageFilter">
<option value="">All stages</option>
<option value="Not Contacted">Not Contacted</option>
<option value="In Conversation">In Conversation</option>
</select>
<button class="clear" id="boardClearBtn">Clear filters</button>
</div>
<div class="detail-panel" id="detailPanel" style="display:none;">
<button class="detail-close" id="detailCloseBtn">&times;</button>
<div class="detail-cols">
<div class="detail-col" id="detailCard"></div>
<div class="detail-col" id="detailConversation"></div>
</div>
</div>
<div class="board" id="board"></div>
</div>
</div>
<script>
const DATA = [{"name": "Tamadur AlBaraghtheh", "connection": "1st", "position": "Researcher", "company": "Helmholtz-Zentrum Geesthacht", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Geesthacht (near Hamburg)", "personalLocation": "Hamburg, Germany", "seniority": "Researcher/Scientist (non-postdoc)", "function": "Research/Science", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/tamadur-albaraghtheh-3380ba7a/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Research/Science", "industry": "Research & Collaborations", "industryOther": ""}, {"name": "Alexej Kotelnikov", "connection": "3rd", "position": "Senior KAM & BD (Automotive/Tech/Industrial)", "company": "Bosch Automotive Service Solutions GmbH", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Plochingen (near Stuttgart)", "personalLocation": "Greater Munich Metropolitan Area", "seniority": "Senior IC/Lead", "function": "Business Development/Sales", "sector": "Other named company", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/alexej-kotelnikov-10013a5a/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Senior / Lead / Principal", "roleLevelNote": "", "department": "Business Development/Sales", "industry": "Other", "industryOther": "Automotive Service & Diagnostics Equipment"}, {"name": "Katrin Boeke-Purkis", "connection": "3rd", "position": "Regulatory Post Market Compliance Coordinator", "company": "Intuitive Surgical", "followed": "July 2026", "followedSort": "2026-07", "country": "United States", "city": "Sunnyvale, California (HQ)", "personalLocation": "Sunnyvale, California, United States", "seniority": "Manager/Coordinator", "function": "Regulatory/Compliance", "sector": "Medical/Life Sciences", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/katrin-boeke-purkis-5722888/", "is_team": false, "company_website": "", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Regulatory/Compliance", "industry": "Other", "industryOther": "Medical/Life Sciences"}, {"name": "Timo Christian", "connection": "2nd", "position": "Program Manager", "company": "Impossible Founders and DESY", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Hamburg", "personalLocation": "Hamburg, Germany", "seniority": "Manager/Coordinator", "function": "Marketing/Comms/Ops", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/timo-christian/", "is_team": false, "company_website": "", "engagement_notes": "Liked 16/07 post.", "roleLevel": "Manager", "roleLevelNote": "", "department": "Marketing/Comms/Ops", "industry": "Research & Collaborations", "industryOther": ""}, {"name": "Jan-Christian Schober", "connection": "3rd", "position": "Student", "company": "University of Hamburg", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Hamburg", "personalLocation": "Hamburg, Germany", "seniority": "Student/Trainee", "function": "Student/Academic Track", "sector": "Academia/Research Institute", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/jan-christian-schober-78b72926a/", "is_team": false, "company_website": "", "roleLevel": "Student", "roleLevelNote": "", "department": "Student/Academic Track", "industry": "Academia", "industryOther": ""}, {"name": "Benedikt Kubicki", "connection": "2nd", "position": "SAP-Berater", "company": "SI PRO GmbH", "followed": "July 2026", "followedSort": "2026-07", "country": "Germany", "city": "Mannheim (HQ); has a Hamburg office", "personalLocation": "Hamburg, Germany", "seniority": "Manager/Coordinator", "function": "Engineering/Technical", "sector": "Other named company", "outreach_status": "Not Contacted", "outreach_log": [], "connection_at_outreach": "", "is_valuable": false, "has_responded": false, "email": "", "linkedin_url": "https://www.linkedin.com/in/benedikt-kubicki-31652b25a/", "is_team": false, "company_website": "", "engagement_notes": "Commented on 09/07 post; liked 15/09 \u2014 repeat engager.", "roleLevel": "IC \u2014 Junior / Specialist", "roleLevelNote": "", "department": "Engineering/Technical", "industry": "OLine truncated
const SECTOR_COLORS = {
'Academia/Research Institute': 'var(--series-1)',
'Photonics/Laser/Optics Industry': 'var(--series-3)',
'Semiconductor/Aerospace/Defense': 'var(--series-4)',
'Medical/Life Sciences': 'var(--series-5)',
'TXproducts (internal)': 'var(--series-6)',
'Other named company': 'var(--series-2)',
'Student (no company expected)': 'var(--series-7)',
};
const NEEDS_WORK = '__needs_work__';
// Gray is reserved for "needs more detective work" — a student with no company isn't a gap,
// it's a complete, expected answer, so it gets its own category instead of falling into gray.
// Single source of truth: color, legend, filter dropdown, and card tags all read this.
function sectorCategory(d) {
if (SECTOR_COLORS.hasOwnProperty(d.sector)) return d.sector;
return NEEDS_WORK;
}
function sectorColor(d) {
return SECTOR_COLORS[sectorCategory(d)] || 'var(--muted-fill)';
}
function initials(name) {
const parts = name.trim().split(/\s+/).filter(Boolean);
if (parts.length === 0) return '?';
if (parts.length === 1) return parts[0].slice(0,2).toUpperCase();
return (parts[0][0] + parts[parts.length-1][0]).toUpperCase();
}
function uniqueSorted(field) {
return [...new Set(DATA.map(d => d[field]).filter(Boolean))].sort();
}
function populateSelect(id, values) {
const el = document.getElementById(id);
values.forEach(v => {
const opt = document.createElement('option');
opt.value = v; opt.textContent = v;
el.appendChild(opt);
});
}
populateSelect('filterSeniority', uniqueSorted('seniority'));
populateSelect('filterFunction', uniqueSorted('function'));
populateSelect('filterCountry', uniqueSorted('country'));
populateSelect('boardFilterSeniority', uniqueSorted('seniority'));
populateSelect('boardFilterFunction', uniqueSorted('function'));
populateSelect('boardFilterCountry', uniqueSorted('country'));
function populateFollowedSelect(id) {
const el = document.getElementById(id);
const seen = new Map();
DATA.forEach(d => { if (d.followedSort) seen.set(d.followedSort, d.followed); });
[...seen.entries()].sort((a, b) => b[0].localeCompare(a[0])).forEach(([sortKey, label]) => {
const opt = document.createElement('option');
opt.value = sortKey; opt.textContent = label;
el.appendChild(opt);
});
}
populateFollowedSelect('filterFollowed');
populateFollowedSelect('boardFilterFollowed');
const LEGEND_LABELS = {
'Academia/Research Institute': 'Academia/Research',
'Photonics/Laser/Optics Industry': 'Photonics/Laser/Optics',
'Semiconductor/Aerospace/Defense': 'Semiconductor/Aerospace/Defense',
'Medical/Life Sciences': 'Medical/Life Sciences',
'TXproducts (internal)': 'TXproducts',
'Other named company': 'Other named company',
'Student (no company expected)': 'Student',
};
function populateSectorSelect(id) {
const el = document.getElementById(id);
const present = new Set(DATA.map(sectorCategory));
const order = [...Object.keys(SECTOR_COLORS), NEEDS_WORK];
order.filter(cat => present.has(cat)).forEach(cat => {
const opt = document.createElement('option');
opt.value = cat;
opt.textContent = cat === NEEDS_WORK ? 'Needs more detective work' : (LEGEND_LABELS[cat] || cat);
el.appendChild(opt);
});
}
populateSectorSelect('filterSector');
populateSectorSelect('boardFilterSector');
function renderLegend() {
const el = document.getElementById('legend');
const items = [...Object.entries(SECTOR_COLORS), ['Needs more detective work', 'var(--muted-fill)']];
el.innerHTML = items.map(([label, color]) =>
`<span class="legend-item"><span class="legend-dot" style="background:${color}"></span>${LEGEND_LABELS[label] || label}</span>`
).join('');
}
renderLegend();
function render() {
const q = document.getElementById('search').value.trim().toLowerCase();
const fSen = document.getElementById('filterSeniority').value;
const fFun = document.getElementById('filterFunction').value;
const fSec = document.getElementById('filterSector').value;
const fCon = document.getElementById('filterCountry').value;
const fFollowed = document.getElementById('filterFollowed').value;
const filtered = DATA.filter(d => {
if (fSen === '__postdoc_student__') {
if (d.seniority !== 'Postdoc/PhD Researcher' && d.seniority !== 'Student/Trainee') return false;
} else if (fSen && d.seniority !== fSen) return false;
if (fFun && d.function !== fFun) return false;
if (fSec && sectorCategory(d) !== fSec) return false;
if (fCon && d.country !== fCon) return false;
if (fFollowed && d.followedSort !== fFollowed) return false;
if (q) {
const hay = (d.name + ' ' + d.position + ' ' + d.company).toLowerCase();
if (!hay.includes(q)) return false;
}
return true;
});
filtered.sort((a, b) => a.name.localeCompare(b.name));
const SENIOR = ['C-Level/Founder', 'Director/Head/Principal', 'Senior IC/Lead'];
const seniorCount = filtered.filter(d => SENIOR.includes(d.seniority)).length;
const countryCount = new Set(filtered.map(d => d.country).filter(Boolean)).size;
const unknownCount = filtered.filter(d => sectorCategory(d) === NEEDS_WORK).length;
document.getElementById('kpiCount').textContent = filtered.length;
document.getElementById('kpiSenior').textContent = seniorCount;
document.getElementById('kpiCountries').textContent = countryCount;
document.getElementById('kpiUnknown').textContent = unknownCount;
const grid = document.getElementById('grid');
grid.innerHTML = '';
document.getElementById('emptyState').style.display = filtered.length ? 'none' : 'block';
filtered.forEach(d => {
const card = document.createElement('div');
card.className = 'card';
const tags = [];
const cat = sectorCategory(d);
if (cat === NEEDS_WORK) {
tags.push(`<span class="tag">No company listed</span>`);
} else if (cat !== 'Student (no company expected)') {
tags.push(`<span class="tag">${LEGEND_LABELS[cat] || cat}</span>`);
}
if (d.seniority && d.seniority !== 'Unknown') tags.push(`<span class="tag">${d.seniority}</span>`);
if (d.country) tags.push(`<span class="tag country">${d.country}</span>`);
if (d.is_valuable) tags.push(`<span class="tag" style="color:#eda100; font-weight:700;">&#9733; Valuable Contact</span>`);
if (d.is_team) tags.push(`<span class="tag" style="color:#2a78d6; font-weight:700;">&#9733; TXproducts</span>`);
if (d.outreach_status && d.outreach_status !== 'Not Contacted') {
const lastLog = (d.outreach_log && d.outreach_log.length) ? d.outreach_log[d.outreach_log.length - 1] : null;
const title = (lastLog ? `${lastLog.date}: ${lastLog.note}` : d.outreach_status).replace(/"/g, '&quot;');
tags.push(`<span class="tag outreach" title="${title}">${d.outreach_status}</span>`);
}
card.innerHTML = `
<div class="avatar" style="background:${sectorColor(d)}">${initials(d.name)}</div>
<div class="card-body">
<div class="card-name-row"><span class="card-name">${d.name}</span><span class="card-degree">&middot; ${d.connection || '—'}</span></div>
<div class="card-position">${d.position || '<span style=\"opacity:.6\">(no title listed)</span>'}</div>
${d.company ? `<div class="card-company">${d.company}</div>` : ''}
${d.followed ? `<div class="card-followed">Followed: ${d.followed}</div>` : ''}
${(d.email || d.linkedin_url) ? `<div class="card-links">
${d.email ? `<a href="mailto:${d.email}" onclick="event.stopPropagation()">Email</a>` : ''}
${d.linkedin_url ? `<a href="${d.linkedin_url}" target="_blank" rel="noopener noreferrer" onclick="event.stopPropagation()">LinkedIn</a>` : ''}
</div>` : ''}
<div class="tag-row">${tags.join('')}</div>
</div>
`;
card.style.cursor = 'pointer';
card.title = 'Click to open in the Outreach Board';
card.addEventListener('click', () => setView('board', d));
grid.appendChild(card);
});
document.getElementById('scrollViewport').style.display = filtered.length ? 'block' : 'none';
}
const BOARD_STAGES = ['Not Contacted', 'In Conversation'];
function renderBoard() {
const board = document.getElementById('board');
board.innerHTML = '';
const q = document.getElementById('boardSearch').value.trim().toLowerCase();
const fSen = document.getElementById('boardFilterSeniority').value;
const fFun = document.getElementById('boardFilterFunction').value;
const fSec = document.getElementById('boardFilterSector').value;
const fCon = document.getElementById('boardFilterCountry').value;
const fFollowed = document.getElementById('boardFilterFollowed').value;
const stageFilter = document.getElementById('boardStageFilter').value;
const stages = stageFilter ? [stageFilter] : BOARD_STAGES;
const matchesFilters = d => {
if (fSen === '__postdoc_student__') {
if (d.seniority !== 'Postdoc/PhD Researcher' && d.seniority !== 'Student/Trainee') return false;
} else if (fSen && d.seniority !== fSen) return false;
if (fFun && d.function !== fFun) return false;
if (fSec && sectorCategory(d) !== fSec) return false;
if (fCon && d.country !== fCon) return false;
if (fFollowed && d.followedSort !== fFollowed) return false;
if (q) {
const hay = (d.name + ' ' + d.position + ' ' + d.company).toLowerCase();
if (!hay.includes(q)) return false;
}
return true;
};
const sorted = [...DATA].filter(matchesFilters).sort((a, b) => a.name.localeCompare(b.name));
const contactedCount = sorted.filter(d => (d.outreach_status || 'Not Contacted') !== 'Not Contacted').length;
const respondedCount = sorted.filter(d => d.has_responded).length;
document.getElementById('kpiBoardTotal').textContent = sorted.length;
document.getElementById('kpiBoardContacted').textContent = contactedCount;
document.getElementById('kpiBoardResponded').textContent = respondedCount;
stages.forEach(stage => {
const people = sorted.filter(d => (d.outreach_status || 'Not Contacted') === stage);
const col = document.createElement('div');
col.className = 'board-col';
const header = document.createElement('div');
header.className = 'board-col-header';
header.innerHTML = `<span>${stage}</span><span class="board-col-count">${people.length}</span>`;
col.appendChild(header);
people.forEach(d => {
const card = document.createElement('div');
card.className = 'board-card';
const lastLog = (d.outreach_log && d.outreach_log.length) ? d.outreach_log[d.outreach_log.length - 1] : null;
const degreeNote = d.connection_at_outreach && d.connection_at_outreach !== d.connection
? ` (was ${d.connection_at_outreach}, now ${d.connection})` : '';
const star = (d.is_valuable ? `<span class="bc-star" title="Valuable Contact">&#9733;</span>` : '')
+ (d.is_team ? `<span class="bc-star-team" title="TXproducts">&#9733;</span>` : '');
card.innerHTML = `
<div class="bc-header">
<div class="bc-name">${star}${d.name}${degreeNote}</div>
<div class="bc-meta">${d.connection || '—'} &middot; ${d.company || 'no company listed'}</div>
${lastLog ? `<div class="bc-last-log">Latest: ${lastLog.date}: ${lastLog.note}</div>` : ''}
</div>
`;
card.addEventListener('click', () => showDetailPanel(d));
col.appendChild(card);
});
board.appendChild(col);
});
}
function showDetailPanel(d) {
const star = (d.is_valuable ? `<span class="bc-star" title="Valuable Contact">&#9733;</span>` : '')
+ (d.is_team ? `<span class="bc-star-team" title="TXproducts">&#9733;</span>` : '');
const field = (label, value) => value
? `<div class="detail-field"><span class="dl">${label}</span><span class="dv">${value}</span></div>` : '';
document.getElementById('detailCard').innerHTML = `
<h4>Follower</h4>
<div class="detail-field"><span class="dv" style="font-size:1.05rem; font-weight:700;">${star}${d.name}</span></div>
${field('Position', d.position)}
${field('Company', d.company)}
${field('Connection', d.connection)}
${field('Followed', d.followed)}
${field('Sector', d.sector)}
${field('Seniority', d.seniority !== 'Unknown' ? d.seniority : '')}
${field('Function', d.function !== 'Unknown' ? d.function : '')}
${field('Country', d.country)}
${(d.email || d.linkedin_url) ? `<div class="card-links" style="margin-top:10px;">
${d.email ? `<a href="mailto:${d.email}">Email</a>` : ''}
${d.linkedin_url ? `<a href="${d.linkedin_url}" target="_blank" rel="noopener noreferrer">LinkedIn</a>` : ''}
</div>` : `<div class="detail-field" style="color:var(--text-muted); font-style:italic;">No email or LinkedIn link on file yet.</div>`}
`;
const logEntries = d.outreach_log || [];
const logHtml = logEntries.length
? logEntries.map(l => `<div class="detail-log-entry"><span class="dl-date">${l.date}</span>${l.note}</div>`).join('')
: `<div class="detail-log-entry" style="color:var(--text-muted); font-style:italic;">No conversation yet, status: ${d.outreach_status || 'Not Contacted'}.</div>`;
document.getElementById('detailConversation').innerHTML = `<h4>Conversation</h4>${logHtml}`;
document.getElementById('detailPanel').style.display = 'block';
document.getElementById('detailPanel').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
document.getElementById('detailCloseBtn').addEventListener('click', () => {
document.getElementById('detailPanel').style.display = 'none';
});
function setView(view, personToShow) {
const isBoard = view === 'board';
document.getElementById('directoryView').style.display = isBoard ? 'none' : 'block';
document.getElementById('boardView').style.display = isBoard ? 'block' : 'none';
document.getElementById('viewDirectoryBtn').classList.toggle('active', !isBoard);
document.getElementById('viewBoardBtn').classList.toggle('active', isBoard);
if (isBoard) {
renderBoard();
if (personToShow) showDetailPanel(personToShow);
}
}
document.getElementById('viewDirectoryBtn').addEventListener('click', () => setView('directory'));
document.getElementById('viewBoardBtn').addEventListener('click', () => setView('board'));
document.getElementById('boardStageFilter').addEventListener('change', renderBoard);
document.getElementById('boardSearch').addEventListener('input', renderBoard);
['boardFilterSeniority','boardFilterFunction','boardFilterSector','boardFilterCountry','boardFilterFollowed'].forEach(id =>
document.getElementById(id).addEventListener('change', renderBoard)
);
document.getElementById('boardClearBtn').addEventListener('click', () => {
document.getElementById('boardSearch').value = '';
['boardFilterSeniority','boardFilterFunction','boardFilterSector','boardFilterCountry','boardFilterFollowed','boardStageFilter'].forEach(id => document.getElementById(id).value = '');
renderBoard();
});
if (window.location.hash === '#board') { setView('board'); }
['search'].forEach(id => document.getElementById(id).addEventListener('input', render));
['filterSeniority','filterFunction','filterSector','filterCountry','filterFollowed'].forEach(id =>
document.getElementById(id).addEventListener('change', render)
);
document.getElementById('clearBtn').addEventListener('click', () => {
document.getElementById('search').value = '';
['filterSeniority','filterFunction','filterSector','filterCountry','filterFollowed'].forEach(id => document.getElementById(id).value = '');
render();
});
render();
</script>
</body>
</html>
+136
View File
@@ -66,4 +66,140 @@ CONTACTS = [
"date_surfaced": "2026-08",
"outreach_status": "Not Contacted",
},
{
"name": "Arunangshu Debnath",
"connection": "",
"position": "Scientist (Quantum Dynamics, Nonlinear Optics, Quantum Imaging), DESY",
"company": "DESY",
"linkedin_url": "https://www.linkedin.com/in/arundebnath/",
"surfaced_via": "Commented twice on 08/09 post (reply thread with TXproducts).",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Simon Sebold",
"connection": "",
"position": "PhD Researcher, Advanced Materials Group (neutron imaging, additively manufactured aluminum alloys), Technische Universit\u00e4t M\u00fcnchen / Heinz Maier-Leibnitz Zentrum (MLZ)",
"company": "Technische Universit\u00e4t M\u00fcnchen / Heinz Maier-Leibnitz Zentrum (MLZ)",
"surfaced_via": "Liked 15/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Martin Uhlig",
"connection": "",
"position": "",
"company": "",
"surfaced_via": "Liked 15/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Chen Shen",
"connection": "",
"position": "Scientist, X-ray and Neutron Scattering (PETRA III Beamline P08), DESY",
"company": "DESY",
"surfaced_via": "Liked 15/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Philipp Brandt",
"connection": "",
"position": "Innovation Manager, Hi-Acts / DESY",
"company": "Hi-Acts / DESY",
"surfaced_via": "Liked 15/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Dr. Sonia Utermann",
"connection": "",
"position": "Innovation and research impact expert",
"company": "",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Dr. Jefferson do Ros\u00e1rio Stelzer",
"connection": "",
"position": "Head of Business Development Office, DESY",
"company": "DESY",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Sani Harouna-Mayer",
"connection": "",
"position": "Materials, Data, and X-ray scientist (PhD Physics)",
"company": "",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Shrouk Ehab",
"connection": "",
"position": "Project Management, DESY",
"company": "DESY",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Harish Purushothaman",
"connection": "",
"position": "M.Sc Scientific Instrumentation (Werkstudent), Ernst-Abbe-Hochschule Jena",
"company": "Ernst-Abbe-Hochschule Jena",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Mallika K.",
"connection": "",
"position": "Technischer Vertriebsingenieur, SmarAct Motions GmbH",
"company": "SmarAct Motions GmbH",
"surfaced_via": "Liked (loved) 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Sebastian Sell",
"connection": "",
"position": "Commercial Leader, Marine & Industrial Markets",
"company": "",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Azat Khadiev",
"connection": "",
"position": "Beamline scientist, P23 (In situ X-ray diffraction and imaging), DESY",
"company": "DESY",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Ali A.",
"connection": "",
"position": "Industry Engagement, DAPHNE4NFDI",
"company": "DAPHNE4NFDI",
"surfaced_via": "Liked 08/09 and 22/09 posts \u2014 repeat engager.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
{
"name": "Maximilian Harr",
"connection": "",
"position": "Private Equity, Bridgepoint",
"company": "Bridgepoint",
"surfaced_via": "Liked 22/09 post.",
"date_surfaced": "2026-09",
"outreach_status": "Not Contacted",
},
]