-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
177 lines (163 loc) Β· 10.6 KB
/
Copy pathindex.html
File metadata and controls
177 lines (163 loc) Β· 10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>pubmed-watcher β Automated PubMed Paper Alerts</title>
<meta name="description" content="Automated alerting for new PubMed papers. Delta detection β only alerts on unseen papers. Built for cron.">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>π¬</text></svg>">
<style>
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#06080c;--bg2:#0c1018;--bg3:#0f1520;--bg4:#141c28;--accent:#00e5bf;--accent-dim:#00e5bf60;--accent-glow:#00e5bf20;--text:#e2e8f0;--text2:#8892a4;--text3:#4a5568;--border:#1a2332;--red:#ff5f57;--yellow:#febc2e;--green:#28c840;--mono:'SF Mono','Fira Code','JetBrains Mono','Consolas',monospace;--sans:'Inter',-apple-system,BlinkMacSystemFont,system-ui,sans-serif}
html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased}
body{font-family:var(--sans);background:var(--bg);color:var(--text);line-height:1.6;overflow-x:hidden}
::selection{background:var(--accent);color:var(--bg)}
a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}
.container{max-width:960px;margin:0 auto;padding:0 clamp(1rem,4vw,2rem)}
.topbar{padding:1rem 0;border-bottom:1px solid var(--border);position:sticky;top:0;z-index:100;background:rgba(6,8,12,.92);backdrop-filter:blur(16px)}
.topbar-inner{display:flex;align-items:center;justify-content:space-between;max-width:960px;margin:0 auto;padding:0 clamp(1rem,4vw,2rem)}
.topbar a{font-family:var(--mono);font-size:.8rem;color:var(--text2)}.topbar a:hover{color:var(--accent);text-decoration:none}
.topbar .logo{font-size:1rem;font-weight:700;color:var(--accent)}
.hero{padding:4rem 0 3rem;text-align:center}
.hero h1{font-size:clamp(2rem,6vw,3.5rem);font-weight:800;letter-spacing:-.03em;margin-bottom:.5rem}
.hero h1 span{background:linear-gradient(135deg,var(--accent),#00b4d8);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.hero .sub{font-family:var(--mono);font-size:.85rem;color:var(--text2);margin-bottom:1.5rem}
.hero p{color:var(--text2);max-width:600px;margin:0 auto 2rem;font-size:.95rem}
.badge{display:inline-block;font-family:var(--mono);font-size:.7rem;padding:.25rem .75rem;border:1px solid var(--border);border-radius:100px;color:var(--text3);margin-bottom:1rem}
.section{padding:3rem 0}.section-title{font-family:var(--mono);font-size:.75rem;color:var(--accent);letter-spacing:.1em;text-transform:uppercase;margin-bottom:1.5rem}
.terminal{background:var(--bg);border:1px solid var(--border);border-radius:10px;overflow:hidden;margin-bottom:2rem}
.terminal-bar{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:var(--bg4);border-bottom:1px solid var(--border)}
.terminal-dots{display:flex;gap:5px}.terminal-dots i{width:8px;height:8px;border-radius:50%;display:block}
.terminal-dots i:nth-child(1){background:var(--red)}.terminal-dots i:nth-child(2){background:var(--yellow)}.terminal-dots i:nth-child(3){background:var(--green)}
.terminal-title{font-family:var(--mono);font-size:.7rem;color:var(--text3)}
.terminal-body{padding:1rem;font-family:var(--mono);font-size:.72rem;line-height:1.6;color:var(--text2);overflow-x:auto;white-space:pre}
.info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1.5rem;margin-bottom:2rem}
.info-card{background:var(--bg3);border:1px solid var(--border);border-radius:10px;padding:1.25rem}
.info-card h4{font-family:var(--mono);font-size:.85rem;margin-bottom:.75rem}
.info-card p,.info-card li{font-size:.82rem;color:var(--text2);line-height:1.6}
.info-card ul{padding-left:1.25rem}.info-card li{margin-bottom:.25rem}
.flow-steps{display:flex;gap:0;margin-bottom:2rem;flex-wrap:wrap}
.flow-step{flex:1;min-width:150px;background:var(--bg3);border:1px solid var(--border);padding:1rem;text-align:center;position:relative}
.flow-step:first-child{border-radius:8px 0 0 8px}
.flow-step:last-child{border-radius:0 8px 8px 0}
.flow-step .step-num{font-family:var(--mono);font-size:.65rem;color:var(--accent);margin-bottom:.25rem}
.flow-step .step-icon{font-size:1.5rem;margin-bottom:.25rem}
.flow-step .step-text{font-family:var(--mono);font-size:.7rem;color:var(--text2)}
.flow-step::after{content:'β';position:absolute;right:-8px;top:50%;transform:translateY(-50%);color:var(--accent);font-family:var(--mono);z-index:1}
.flow-step:last-child::after{content:''}
.query-list{list-style:none;padding:0}
.query-item{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:var(--bg3);border:1px solid var(--border);border-radius:6px;margin-bottom:.5rem;font-family:var(--mono);font-size:.8rem}
.query-num{color:var(--accent);font-weight:700;width:24px}
.query-text{color:var(--text2)}
.footer{padding:2rem 0;border-top:1px solid var(--border);text-align:center;margin-top:2rem}
.footer p{font-family:var(--mono);font-size:.7rem;color:var(--text3)}
</style>
</head>
<body>
<div class="topbar"><div class="topbar-inner">
<a href="https://qclawq.github.io" class="logo">β Q's Build Lab</a>
<a href="https://github.com/QclawQ/pubmed-watcher" target="_blank">github β</a>
</div></div>
<div class="container">
<div class="hero">
<div class="badge">pure python Β· zero dependencies Β· 617 loc</div>
<h1>π¬ <span>pubmed-watcher</span></h1>
<div class="sub">Automated PubMed Paper Alerts</div>
<p>Watch PubMed queries and get alerted only about <strong>new</strong> papers. Tracks seen PMIDs, supports cron scheduling, outputs to terminal, Markdown, or JSON.</p>
</div>
<div class="section">
<div class="section-title">// how it works</div>
<div class="flow-steps">
<div class="flow-step"><div class="step-num">01</div><div class="step-icon">π</div><div class="step-text">Query PubMed E-utilities</div></div>
<div class="flow-step"><div class="step-num">02</div><div class="step-icon">π</div><div class="step-text">Filter against seen.json</div></div>
<div class="flow-step"><div class="step-num">03</div><div class="step-icon">π₯</div><div class="step-text">Fetch new paper details</div></div>
<div class="flow-step"><div class="step-num">04</div><div class="step-icon">π</div><div class="step-text">Alert only NEW papers</div></div>
</div>
</div>
<div class="section">
<div class="section-title">// default queries</div>
<ul class="query-list">
<li class="query-item"><span class="query-num">[1]</span><span class="query-text">epigenetic reprogramming aging longevity</span></li>
<li class="query-item"><span class="query-num">[2]</span><span class="query-text">immunosenescence aging immune system</span></li>
<li class="query-item"><span class="query-num">[3]</span><span class="query-text">senolytics senescent cells therapy</span></li>
<li class="query-item"><span class="query-num">[4]</span><span class="query-text">AI drug discovery clinical trial</span></li>
<li class="query-item"><span class="query-num">[5]</span><span class="query-text">biological age clock methylation</span></li>
</ul>
</div>
<div class="section">
<div class="section-title">// demo output</div>
<div class="terminal">
<div class="terminal-bar"><span class="terminal-dots"><i></i><i></i><i></i></span><span class="terminal-title">$ python3 pubmed_watcher.py watch</span></div>
<div class="terminal-body">π 12 new papers found across 5 queries (last 7 days)
βββ π "epigenetic reprogramming aging longevity" β 3 new βββ
π Epigenetic reprogramming reverses age-associated
decline in neural stem cell function
π€ Zhang W β¦ Bhatt DL
π° Nature Aging β’ 2026 Feb
π https://pubmed.ncbi.nlm.nih.gov/39847201/
π In vivo partial reprogramming extends lifespan
in progeroid mice via cellular rejuvenation
π€ Ocampo A β¦ Izpisua Belmonte JC
π° Cell β’ 2026 Feb 10
π https://pubmed.ncbi.nlm.nih.gov/39847202/
βββ π "senolytics senescent cells therapy" β 4 new βββ
π Dasatinib plus quercetin reduces senescent
cell burden in human adipose tissue
π€ Kirkland JL β¦ Tchkonia T
π° Nature Medicine β’ 2026 Feb
π https://pubmed.ncbi.nlm.nih.gov/39847203/
ββββββββββββββββββββββββββββββββββββββββββββββββββ
π Total: 12 new | 4/5 queries had results</div>
</div>
<div class="terminal">
<div class="terminal-bar"><span class="terminal-dots"><i></i><i></i><i></i></span><span class="terminal-title">$ python3 pubmed_watcher.py history</span></div>
<div class="terminal-body">π Alert History (last 5 runs)
π 2026-02-17 08:00 UTC β 12 new papers (5 queries, 7d window)
β’ epigenetic reprogramming aging longevity: 3 new
β’ senolytics senescent cells therapy: 4 new
β’ AI drug discovery clinical trial: 3 new
β’ biological age clock methylation: 2 new
π 2026-02-16 08:00 UTC β 8 new papers (5 queries, 7d window)
β
2026-02-15 08:00 UTC β 0 new papers (5 queries, 7d window)
π 2026-02-14 08:00 UTC β 5 new papers (5 queries, 7d window)</div>
</div>
</div>
<div class="section">
<div class="section-title">// features</div>
<div class="info-grid">
<div class="info-card">
<h4>π Delta Detection</h4>
<p>Tracks every PMID in <code>seen.json</code>. You only get alerted once per paper, even across multiple queries. Perfect for daily cron jobs.</p>
</div>
<div class="info-card">
<h4>π€ Output Formats</h4>
<ul>
<li><code>--terminal</code> β Pretty CLI output</li>
<li><code>--markdown</code> β Telegram-ready</li>
<li><code>--json</code> β Machine-readable</li>
</ul>
</div>
<div class="info-card">
<h4>β° Cron Ready</h4>
<p style="font-family:var(--mono);font-size:.72rem">0 8 * * * python3 pubmed_watcher.py watch --markdown >> /tmp/alerts.md</p>
<p style="margin-top:.5rem">Run daily, pipe to Telegram, Slack, or email.</p>
</div>
<div class="info-card">
<h4>π» Commands</h4>
<ul>
<li><code>watch</code> β Check all queries</li>
<li><code>add "query"</code> β Add new query</li>
<li><code>list</code> β Show queries</li>
<li><code>remove <id></code> β Remove query</li>
<li><code>history</code> β Past runs</li>
<li><code>reset-seen</code> β Clear DB</li>
</ul>
</div>
</div>
</div>
</div>
<footer class="footer"><div class="container">
<p>pubmed-watcher Β· <a href="https://github.com/QclawQ/pubmed-watcher">source</a> Β· <a href="https://qclawq.github.io">Q's Build Lab</a> Β· NCBI E-utilities</p>
</div></footer>
</body>
</html>