-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontract-tracker.html
More file actions
534 lines (501 loc) · 43 KB
/
Copy pathcontract-tracker.html
File metadata and controls
534 lines (501 loc) · 43 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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Contract Tracker — Mission Meets Tech</title>
<meta name="description" content="Federal health IT contract intelligence. Track active opportunities, recently awarded contracts, and upcoming recompetes across DHA, VA, and federal health agencies.">
<link rel="canonical" href="https://missionmeetstech.com/contract-tracker">
<meta property="og:title" content="Contract Tracker — Mission Meets Tech">
<meta property="og:description" content="Federal health IT contract intelligence. Track active opportunities, recently awarded contracts, and upcoming recompetes across DHA, VA, and federal health agencies.">
<meta property="og:url" content="https://missionmeetstech.com/contract-tracker">
<meta property="og:type" content="website">
<meta property="og:image" content="https://missionmeetstech.com/mmt-logo.png">
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta property="og:site_name" content="Mission Meets Tech">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Contract Tracker — Mission Meets Tech">
<meta name="twitter:description" content="Federal health IT contract intelligence. Track active opportunities, recently awarded contracts, and upcoming recompetes across DHA, VA, and federal health agencies.">
<meta name="twitter:image" content="https://missionmeetstech.com/mmt-logo.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-v3.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-v3-16.png">
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-v3-48.png">
<link rel="icon" type="image/png" sizes="64x64" href="/favicon-v3-64.png">
<link rel="icon" type="image/png" sizes="128x128" href="/favicon-v3-128.png">
<link rel="icon" type="image/png" sizes="256x256" href="/favicon-v3-256.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-v3.png">
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-v3-512.png">
<link rel="preconnect" href="https://plausible.io" crossorigin>
<script defer data-domain="missionmeetstech.com" src="https://plausible.io/js/script.js"></script>
<link rel="alternate" type="application/rss+xml" title="Mission Meets Tech" href="/feed.xml">
<link rel="stylesheet" href="/styles/tailwind.css">
<style>
:root {
--mmt-teal: #457B9D;
--mmt-navy: #0A192F;
--mmt-soft: #F3F4F6;
--mmt-white: #FFFFFF;
--mmt-white: #FFFFFF;
--mmt-text: #102033;
--mmt-text-secondary: #5C6B7A;
}
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; background: var(--mmt-white); color: var(--mmt-navy); }
h1, h2, h3, h4, h5 { font-family: 'Inter', system-ui, sans-serif; }
.gradient-text { color: var(--mmt-teal); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
.btn-primary { color: var(--mmt-teal); color: var(--mmt-navy); font-weight: 600; padding: 0.75rem 2rem; border-radius: 9999px; transition: all 0.3s; }
.btn-primary:hover { transform: translateY(-1px); opacity: 0.9; }
.btn-secondary { border: 1px solid var(--mmt-teal); color: var(--mmt-navy); padding: 0.75rem 2rem; border-radius: 9999px; transition: all 0.3s; }
.btn-secondary:hover { background: rgba(69,123,157,0.1); }
.card { background: var(--mmt-soft); border: 1px solid rgba(69,123,157,0.1); }
.card:hover { border-color: rgba(69,123,157,0.3); }
.section-alt { background: var(--mmt-white); }
*:focus-visible { outline: 2px solid var(--mmt-teal); outline-offset: 2px; }
@media (max-width: 767px) {
#mobileMenu a { min-height: 44px; display: flex; align-items: center; }
footer a { min-height: 44px; display: inline-flex; align-items: center; }
.btn-primary, .btn-secondary { min-height: 44px; }
}
</style>
</head>
<body class="antialiased">
<a href="#main-content" class="sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-[60] focus:px-4 focus:py-2 focus:rounded-lg focus:text-sm focus:font-semibold" style="background:var(--mmt-teal); color: var(--mmt-navy);">Skip to main content</a>
<!-- Navigation -->
<nav class="nav-editorial">
<div class="wrap nav-inner">
<a href="/" class="brand no-underline" aria-label="Mission Meets Tech">
<div class="brand-mark"><img src="/mmt-shield-nav.png" alt="" width="44" height="44"></div>
<div>
<small>Federal Health IT Intelligence</small>
<span>Mission Meets Tech</span>
</div>
</a>
<div class="hidden md:flex items-center gap-5">
<a href="latest.html" class="text-sm font-semibold no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Intelligence</a>
<a href="proposal-pulse.html" class="text-sm font-semibold no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">ProposalPulse</a>
<a href="marketpulse.html" class="text-sm font-semibold no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">MarketPulse</a>
<a href="resources.html" class="text-sm font-semibold no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Resources</a>
<a href="podcast.html" class="text-sm font-semibold no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Podcast</a>
<a href="about.html" class="text-sm font-semibold no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">About</a>
<button id="searchToggle" class="hover:opacity-70" style="color:var(--mmt-text-secondary);background:none;border:none;cursor:pointer;" aria-label="Search"><svg width="16" height="16" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true"><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"/></svg></button>
<a href="/tools" class="btn-primary no-underline" style="margin-left:8px;">Choose a Tool</a>
</div>
<button id="menuToggle" class="md:hidden" style="color:var(--mmt-navy);background:none;border:none;cursor:pointer;" aria-label="Toggle menu">
<svg id="menuOpen" width="24" height="24" viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg>
<svg id="menuClose" class="hidden" width="24" height="24" viewBox="0 0 384 512" fill="currentColor" aria-hidden="true"><path d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/></svg>
</button>
</div>
<div id="mobileMenu" class="hidden md:hidden px-6 pb-4" style="background:var(--mmt-white);border-bottom:1px solid var(--mmt-border);">
<div class="flex flex-col gap-4 pt-2" style="border-top:1px solid var(--mmt-border);">
<a href="latest.html" class="text-sm font-semibold no-underline" style="color:var(--mmt-text);">Intelligence</a>
<a href="proposal-pulse.html" class="text-sm font-semibold no-underline" style="color:var(--mmt-text);">ProposalPulse</a>
<a href="marketpulse.html" class="text-sm font-semibold no-underline" style="color:var(--mmt-text);">MarketPulse</a>
<a href="resources.html" class="text-sm font-semibold no-underline" style="color:var(--mmt-text);">Resources</a>
<a href="podcast.html" class="text-sm font-semibold no-underline" style="color:var(--mmt-text);">Podcast</a>
<a href="about.html" class="text-sm font-semibold no-underline" style="color:var(--mmt-text);">About</a>
<div class="pt-3 mt-1" style="border-top:1px solid var(--mmt-border);">
<a href="/tools" class="btn-primary no-underline">Choose a Tool</a>
</div>
</div>
</div>
</nav>
<main id="main-content">
<!-- Hero -->
<section class="pt-36 pb-16 px-6">
<div class="max-w-4xl mx-auto">
<p class="text-xs uppercase tracking-widest font-semibold mb-4" style="color:var(--mmt-teal);">Contract tracking</p>
<h1 class="text-3xl md:text-5xl font-bold leading-tight mb-4" style="font-family:'Inter',system-ui,sans-serif;">Contract Tracker</h1>
<p class="text-lg max-w-2xl leading-relaxed" style="color:var(--mmt-text);">The federal health IT contracts worth watching, with sourcing, timing signals, and practical implications.</p>
<p style="font-size:13px;color:var(--mmt-text-secondary);margin-top:16px;max-width:56ch;">Contract Tracker shows public contract movement. <a href="/intel/capture-intelligence-this-issue/" style="color:var(--mmt-teal);font-weight:600;">Capture Intelligence</a> (Premium) adds competitive analysis. <a href="/marketpulse.html" style="color:var(--mmt-teal);font-weight:600;">MarketPulse</a> delivers custom pursuit research on demand.</p>
</div>
</section>
<!-- FPDS Migration Watch alert (Sprint 4 MMT-401) -->
<section class="px-6" style="padding:0 0 8px;">
<div class="max-w-5xl mx-auto">
<div style="background:#FFF8E5;border:1px solid #F0C36A;border-radius:8px;padding:12px 18px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
<span style="font-size:18px;line-height:1;flex-shrink:0;">⚠️</span>
<p style="margin:0;font-size:13px;color:var(--mmt-navy);flex:1;min-width:240px;"><strong>FPDS → SAM data migration is underway.</strong> If your pipeline still reads from FPDS Atom, you have until FY2027 to cut over. <a href="/premium/fpds-migration.html" style="color:var(--mmt-teal);font-weight:700;">Read the timeline + risk checklist (Premium) →</a></p>
</div>
</div>
</section>
<!-- Premium teaser -->
<section class="px-6" style="padding:16px 0 0;" data-gate-overlay="premium">
<div class="max-w-5xl mx-auto">
<div style="background:rgba(69,123,157,0.06);border:1px solid rgba(69,123,157,0.2);border-radius:8px;padding:14px 20px;text-align:center;">
<p style="margin:0;font-size:14px;color:var(--mmt-navy);">★ MMT Premium members get full competitive notes, incumbent analysis, and key leader intelligence for all <!-- BUILD:STAT_CONTRACTS --> contracts. <a href="/pricing.html" style="color:var(--mmt-teal);font-weight:600;">See Premium →</a></p>
</div>
</div>
</section>
<!-- Contract Grid -->
<section class="py-16 px-6 section-alt">
<div class="max-w-5xl mx-auto">
<!-- AUT-06: Export button (premium only) -->
<div data-gate="premium" style="display:none;margin-bottom:16px;text-align:right;">
<button id="export-csv" class="btn-secondary" style="padding:8px 16px;font-size:13px;display:inline-flex;align-items:center;gap:6px;" onclick="exportContractsCSV()">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
Export CSV
</button>
</div>
<!-- S2: filter / search / sort toolbar. Progressive enhancement only —
with JS off the build-time cards still render grouped by status and
these controls sit inert. JS lives in js/contract-tracker.js. -->
<div id="ct-toolbar" class="mb-6" style="position:sticky;top:64px;z-index:20;background:var(--mmt-white);padding:12px 0;border-bottom:1px solid var(--mmt-border,#D8E0E8);">
<div class="flex flex-col gap-3">
<div class="flex flex-wrap items-center gap-3">
<input id="ct-search" type="search" placeholder="Search contracts" aria-label="Search contracts" autocomplete="off"
style="flex:1 1 220px;min-width:200px;padding:8px 12px;border:1px solid var(--mmt-border,#D8E0E8);border-radius:8px;font-size:14px;color:var(--mmt-navy);background:var(--mmt-white);" />
<label for="ct-sort" class="text-xs" style="color:var(--mmt-text-secondary);">Sort</label>
<select id="ct-sort" aria-label="Sort contracts"
style="padding:8px 12px;border:1px solid var(--mmt-border,#D8E0E8);border-radius:8px;font-size:13px;color:var(--mmt-navy);background:var(--mmt-white);">
<option value="name">Name (A-Z)</option>
<option value="agency">Agency</option>
<option value="status">Status</option>
</select>
<button id="ct-sb-toggle" type="button" aria-pressed="false"
style="padding:6px 12px;border:1px solid var(--mmt-border,#D8E0E8);border-radius:999px;font-size:13px;font-weight:600;color:var(--mmt-teal);background:var(--mmt-white);cursor:pointer;">Small business only</button>
<div role="group" aria-label="View" style="display:inline-flex;border:1px solid var(--mmt-border,#D8E0E8);border-radius:8px;overflow:hidden;margin-left:auto;">
<button id="ct-view-card" type="button" aria-pressed="true" style="padding:7px 14px;font-size:13px;font-weight:600;border:none;cursor:pointer;background:var(--mmt-teal);color:#FFFFFF;">Cards</button>
<button id="ct-view-table" type="button" aria-pressed="false" style="padding:7px 14px;font-size:13px;font-weight:600;border:none;cursor:pointer;background:var(--mmt-white);color:var(--mmt-teal);">Table</button>
</div>
</div>
<div id="ct-status-filters" class="flex flex-wrap gap-2" role="group" aria-label="Filter by status"></div>
<div id="ct-agency-filters" class="flex flex-wrap gap-2" role="group" aria-label="Filter by agency"></div>
<!-- BUILD:VOTE_TRACKER_FEATURES -->
<span id="ct-count" class="text-xs" style="color:var(--mmt-text-secondary);"></span>
</div>
</div>
<div id="ct-empty" hidden class="card rounded-xl p-8 text-center" style="margin-bottom:16px;">
<p class="text-base mb-1" style="color:var(--mmt-navy);">No contracts match your filters.</p>
<p class="text-sm" style="color:var(--mmt-text-secondary);">Try clearing the search box or choosing All.</p>
</div>
<!-- BUILD:CONTRACT_TRACKER -->
<!-- S3: dense table view. Built client-side from the same card nodes;
obeys the same filter/search/sort state. Cards is the default view. -->
<style>
#ct-table th { padding:10px 12px; color:var(--mmt-navy); font-weight:700; }
#ct-table tbody td { padding:10px 12px; border-bottom:1px solid var(--mmt-border,#D8E0E8); color:var(--mmt-text); vertical-align:top; }
#ct-table tbody tr:hover td { background:rgba(69,123,157,0.06); }
#ct-table a { color:var(--mmt-teal); font-weight:600; text-decoration:none; }
#ct-table a:hover { text-decoration:underline; }
</style>
<div id="ct-table-wrap" hidden style="overflow-x:auto;-webkit-overflow-scrolling:touch;">
<table id="ct-table" style="width:100%;border-collapse:collapse;font-size:13px;min-width:680px;">
<thead>
<tr style="text-align:left;border-bottom:2px solid var(--mmt-border,#D8E0E8);">
<th>Contract</th><th>Agency</th><th>Status</th><th>Classification</th><th>SB</th><th>Last covered</th>
</tr>
</thead>
<tbody id="ct-table-body"></tbody>
</table>
</div>
</div>
</section>
<!-- BUILD:VOTE_TEAMING_FINDER -->
<!-- BUILD:VOTE_WATCHLIST_PANEL -->
<!-- Opportunity Radar -->
<section class="py-16 px-6" id="opportunity-radar">
<div class="max-w-5xl mx-auto">
<div class="flex items-center justify-between mb-6 flex-wrap gap-3">
<div>
<div class="flex items-center gap-3 mb-2">
<svg width="20" height="20" viewBox="0 0 16 16" fill="currentColor" style="color:var(--mmt-teal);" aria-hidden="true"><path d="M8 0a8 8 0 100 16A8 8 0 008 0zm0 14.5a6.5 6.5 0 110-13 6.5 6.5 0 010 13zM8 3a5 5 0 100 10A5 5 0 008 3zm0 8.5a3.5 3.5 0 110-7 3.5 3.5 0 010 7zM8 5.5a2.5 2.5 0 100 5 2.5 2.5 0 000-5zM8 9a1 1 0 110-2 1 1 0 010 2z"/></svg>
<h2 class="text-xl md:text-2xl font-bold" style="color:var(--mmt-navy);">Opportunity Radar</h2>
</div>
<p class="text-sm" style="color:var(--mmt-text-secondary);">AI-scanned federal health IT opportunities with confidence estimates, updated daily</p>
</div>
<span id="radar-scan-date" class="text-xs" style="color:var(--mmt-text-secondary);"></span>
</div>
<!-- Filter buttons -->
<div class="flex flex-wrap gap-2 mb-6" id="radar-filters">
<button class="radar-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-filter="all" style="background:var(--mmt-teal);color:var(--mmt-navy);">All</button>
<button class="radar-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-filter="small_business" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">Small Business</button>
<button class="radar-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-filter="8(a)" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">8(a)</button>
<button class="radar-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-filter="SDVOSB" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">SDVOSB</button>
<button class="radar-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-filter="WOSB" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">WOSB</button>
<button class="radar-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-filter="ebuy" style="background:rgba(146,113,10,0.10);color:#92710A;border:1px solid rgba(146,113,10,0.25);">eBuy RFQs</button>
</div>
<!-- Why some opportunities aren't here: SAM.gov is public; eBuy is Schedule-only -->
<p class="text-xs mb-6" style="color:var(--mmt-text-secondary);line-height:1.6;max-width:72ch;">
<strong style="color:var(--mmt-navy);">Why some opportunities aren't here:</strong> SAM.gov lists public solicitations; GSA eBuy lists RFQs visible only to Schedule holders. We surface eBuy RFQ existence and a link here (tagged <span style="color:#92710A;font-weight:600;">eBuy RFQ</span>), but reading the full RFQ and submitting a quote require the relevant GSA Schedule. If a search comes up empty, check <a href="https://www.ebuy.gsa.gov/advantage/ebuy/start_page.do" target="_blank" rel="noopener" style="color:var(--mmt-teal);font-weight:600;">eBuy Open</a> and <a href="https://sam.gov/search" target="_blank" rel="noopener" style="color:var(--mmt-teal);font-weight:600;">SAM.gov</a> directly.
</p>
<!-- Opportunity cards container -->
<div id="radar-container">
<div class="text-center py-10">
<div class="inline-block w-6 h-6 rounded-full border-2 border-t-transparent animate-spin" style="border-color:var(--mmt-teal);border-top-color:transparent;"></div>
<p class="text-sm mt-3" style="color:var(--mmt-text-secondary);">Scanning for opportunities...</p>
</div>
</div>
</div>
</section>
<!-- Small Business Vehicle Opportunities -->
<section class="py-16 px-6 section-alt" id="sb-vehicles">
<div class="max-w-5xl mx-auto">
<div class="flex items-center justify-between mb-6 flex-wrap gap-3">
<div>
<div class="flex items-center gap-3 mb-2">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="color:var(--mmt-teal);" aria-hidden="true"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
<h2 class="text-xl md:text-2xl font-bold" style="color:var(--mmt-navy);">Small Business Vehicle Opportunities</h2>
</div>
<p class="text-sm" style="color:var(--mmt-text-secondary);">AI-predicted vehicle assignments for federal health IT opportunities, updated daily</p>
</div>
<span id="vehicle-scan-date" class="text-xs" style="color:var(--mmt-text-secondary);"></span>
</div>
<!-- Vehicle filter buttons -->
<div class="flex flex-wrap gap-2 mb-4" id="vehicle-filters">
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="all" style="background:var(--mmt-teal);color:var(--mmt-navy);">All Vehicles</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="OASIS+" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">OASIS+</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="CIO-SP3" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">CIO-SP3</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="Alliant 3" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">Alliant 3</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="T4NG2" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">T4NG2</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="OMNIBUS IV" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">OMNIBUS IV</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="DIU" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">DIU</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="DARPA" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">DARPA</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="SBIR/STTR" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">SBIR/STTR</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="VA SDVOSB" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">VA SDVOSB</button>
<button class="vehicle-filter text-xs font-semibold px-3 py-1.5 rounded-full transition-all" data-vehicle="8(a)" style="background:rgba(69,123,157,0.08);color:var(--mmt-teal);border:1px solid rgba(69,123,157,0.2);">8(a)</button>
</div>
<!-- Sort controls -->
<div class="flex items-center gap-2 mb-6">
<span class="text-xs" style="color:var(--mmt-text-secondary);">Sort by:</span>
<button class="vehicle-sort text-xs font-semibold px-3 py-1 rounded-full transition-all" data-sort="confidence" style="background:var(--mmt-teal);color:var(--mmt-navy);border:1px solid var(--mmt-teal);">Confidence</button>
<button class="vehicle-sort text-xs font-semibold px-3 py-1 rounded-full transition-all" data-sort="date" style="background:transparent;color:var(--mmt-text-secondary);border:1px solid var(--mmt-border);">Date</button>
</div>
<!-- Vehicle opportunity cards container -->
<div id="vehicle-container">
<div class="text-center py-10">
<div class="inline-block w-6 h-6 rounded-full border-2 border-t-transparent animate-spin" style="border-color:var(--mmt-teal);border-top-color:transparent;"></div>
<p class="text-sm mt-3" style="color:var(--mmt-text-secondary);">Scanning vehicle opportunities...</p>
</div>
</div>
</div>
</section>
<!-- Method Note (spec S15 section 6) -->
<section class="py-12 px-6">
<div class="max-w-3xl mx-auto">
<div class="rounded-lg p-6" style="background:var(--mmt-soft);border:1px solid rgba(69,123,157,0.15);">
<h2 class="text-lg font-bold mb-4" style="color:var(--mmt-navy);">How we source this data</h2>
<div class="space-y-3">
<div class="flex items-start gap-3">
<span class="text-xs font-bold px-2 py-0.5 rounded shrink-0" style="background:rgba(69,123,157,0.15);color:var(--mmt-teal);">Verified</span>
<p class="text-sm leading-relaxed" style="color:var(--mmt-text);">Contract names, agencies, award dates, and ceiling values confirmed against SAM.gov, USASpending.gov, agency announcements, or congressional records. Each entry shows a "last verified" date.</p>
</div>
<div class="flex items-start gap-3">
<span class="text-xs font-bold px-2 py-0.5 rounded shrink-0" style="background:rgba(255,184,48,0.15);color:#B8860B;">Estimated</span>
<p class="text-sm leading-relaxed" style="color:var(--mmt-text);">Recompete timelines, contract ceilings without public disclosure, and opportunity confidence scores are estimates based on historical patterns and available signals. These are labeled as estimates wherever they appear.</p>
</div>
<div class="flex items-start gap-3">
<span class="text-xs font-bold px-2 py-0.5 rounded shrink-0" style="background:rgba(92,107,122,0.15);color:var(--mmt-text-secondary);">Inferred</span>
<p class="text-sm leading-relaxed" style="color:var(--mmt-text);">Strategic implications, likely vehicle assignments, and competitive positioning are editorial analysis based on procurement patterns. These represent informed judgment, not confirmed facts.</p>
</div>
</div>
<div class="mt-4 pt-4" style="border-top:1px solid rgba(69,123,157,0.1);">
<p class="text-xs leading-relaxed" style="color:var(--mmt-text-secondary);">Curated contract data is reviewed and updated regularly. Opportunity Radar and Vehicle Radar run automated daily scans. Always verify independently on <a href="https://sam.gov" target="_blank" rel="noopener" class="font-semibold hover:opacity-80" style="color:var(--mmt-teal);">SAM.gov</a> or the relevant agency procurement portal before making business decisions.</p>
</div>
</div>
</div>
</section>
<!-- Vehicle Radar -->
<section class="py-16 px-6 section-alt" id="vehicle-radar">
<div class="max-w-4xl mx-auto">
<h2 class="text-xl md:text-2xl font-bold mb-2" style="color:var(--mmt-navy);">Vehicle Radar</h2>
<p class="text-sm mb-6" style="color:var(--mmt-text-secondary);">Which contract vehicles are seeing the most federal health IT activity. Based on recent task order postings and MMT contract tracker analysis. For current FY2027 budget signals, see the <a href="/intel/capture-intelligence-this-issue/" style="color:var(--mmt-teal);font-weight:600;">Capture Intelligence sheet</a>.</p>
<div class="overflow-x-auto">
<table style="width:100%; border-collapse:collapse; font-size:0.875rem;">
<thead>
<tr style="border-bottom:1px solid rgba(69,123,157,0.15);">
<th style="text-align:left; padding:0.75rem 1rem; color:var(--mmt-teal); font-weight:600; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.05em;">Vehicle</th>
<th style="text-align:left; padding:0.75rem 1rem; color:var(--mmt-teal); font-weight:600; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.05em;">Agency</th>
<th style="text-align:left; padding:0.75rem 1rem; color:var(--mmt-teal); font-weight:600; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.05em;">Activity</th>
<th style="text-align:center; padding:0.75rem 1rem; color:var(--mmt-teal); font-weight:600; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.05em;">Trend</th>
<th style="text-align:left; padding:0.75rem 1rem; color:var(--mmt-teal); font-weight:600; font-size:0.75rem; text-transform:uppercase; letter-spacing:0.05em;">Why</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid rgba(255,255,255,0.05);">
<td style="padding:0.75rem 1rem; color: var(--mmt-navy); font-weight:600;">CIO-SP3</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary);">NIH/NITAAC</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text);">High</td>
<td style="padding:0.75rem 1rem; text-align:center; color:#457B9D;">▲</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary); font-size:0.8rem;">Absorbing CIO-SP4 demand. Extended runway, no replacement vehicle.</td>
</tr>
<tr style="border-bottom:1px solid rgba(255,255,255,0.05);">
<td style="padding:0.75rem 1rem; color: var(--mmt-navy); font-weight:600;">OASIS+</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary);">GSA</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text);">Increasing</td>
<td style="padding:0.75rem 1rem; text-align:center; color:#457B9D;">▲</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary); font-size:0.8rem;">Health IT consulting and PMO work shifting here post-CIO-SP4.</td>
</tr>
<tr style="border-bottom:1px solid rgba(255,255,255,0.05);">
<td style="padding:0.75rem 1rem; color: var(--mmt-navy); font-weight:600;">T4NG / T4NG2</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary);">VA TAC</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text);">High</td>
<td style="padding:0.75rem 1rem; text-align:center; color:#FFB830;">▶</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary); font-size:0.8rem;">T4NG2 task orders beginning. Protests resolved.</td>
</tr>
<tr style="border-bottom:1px solid rgba(255,255,255,0.05);">
<td style="padding:0.75rem 1rem; color: var(--mmt-navy); font-weight:600;">MHS EITS</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary);">DHA</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text);">Steady</td>
<td style="padding:0.75rem 1rem; text-align:center; color:#FFB830;">▶</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary); font-size:0.8rem;">Infrastructure renewals and cybersecurity upgrades ongoing.</td>
</tr>
<tr style="border-bottom:1px solid rgba(255,255,255,0.05);">
<td style="padding:0.75rem 1rem; color: var(--mmt-navy); font-weight:600;">GSA MAS</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary);">GSA</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text);">Moderate</td>
<td style="padding:0.75rem 1rem; text-align:center; color:#FFB830;">▶</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary); font-size:0.8rem;">COTS health IT products. On-ramp for smaller firms.</td>
</tr>
<tr>
<td style="padding:0.75rem 1rem; color: var(--mmt-navy); font-weight:600;">SEWP VI</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary);">NASA</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text);">Increasing</td>
<td style="padding:0.75rem 1rem; text-align:center; color:#457B9D;">▲</td>
<td style="padding:0.75rem 1rem; color:var(--mmt-text-secondary); font-size:0.8rem;">Picking up demand from CIO-SP4 void. IT products/services.</td>
</tr>
</tbody>
</table>
</div>
<p class="text-xs mt-4" style="color:var(--mmt-text-secondary);">Vehicle activity based on SAM.gov task order postings and MMT contract tracker data. Not a predictive model.</p>
<p class="text-sm mt-3"><a href="/contracting.html" class="no-underline hover:opacity-70" style="color:var(--mmt-teal);font-weight:600;">View Contracting Hub for vehicle reference →</a></p>
</div>
</section>
<!-- MarketPulse Bridge (spec S15 section 7) -->
<section class="py-16 px-6 section-alt">
<div class="max-w-3xl mx-auto">
<div class="rounded-lg p-6 md:p-8" style="border:1px solid rgba(69,123,157,0.2);background:rgba(69,123,157,0.03);">
<div class="flex flex-col md:flex-row md:items-center gap-6">
<div class="flex-1">
<h2 class="text-xl font-bold mb-2" style="color:var(--mmt-navy);">Need deeper research on a specific opportunity?</h2>
<p class="text-sm leading-relaxed" style="color:var(--mmt-text);">MarketPulse generates source-cited market briefs on any federal health IT contract or opportunity. Competitive landscape, incumbent analysis, and bid/no-bid signals — by email within 24 hours.</p>
</div>
<div class="shrink-0">
<a href="marketpulse.html" class="btn-primary no-underline inline-block px-6 py-3 rounded-lg text-sm font-semibold" style="border:none;">Request a Brief</a>
</div>
</div>
</div>
</div>
</section>
<!-- CTA -->
<section class="py-16 px-6">
<div class="max-w-2xl mx-auto text-center">
<h2 class="text-2xl font-bold mb-4">Get Contract Intelligence in Your Inbox</h2>
<p class="text-base mb-6 leading-relaxed" style="color:var(--mmt-text);">I track federal health IT procurement so you don't have to. Subscribe for analysis every Tuesday and Friday.</p>
<form action="https://buttondown.com/api/emails/embed-subscribe/missionmeetstech" method="post" target="_blank" class="flex flex-col sm:flex-row gap-3 max-w-md mx-auto">
<label for="subscribe-email-cta" class="sr-only">Email</label>
<input type="email" name="email" id="subscribe-email-cta" placeholder="you@example.com" required class="px-4 py-3 rounded-lg text-sm flex-1" style="background:var(--mmt-soft); border:1px solid var(--mmt-border); color: var(--mmt-navy);">
<button type="submit" class="btn-primary px-6 py-3 rounded-lg text-sm font-semibold whitespace-nowrap" style="cursor:pointer; border:none;">Subscribe</button>
</form>
<div class="mt-4">
<a href="https://www.linkedin.com/build-relation/newsletter-follow?entityUrn=7307800960485969920" target="_blank" rel="noopener" class="text-sm no-underline hover:opacity-80" style="color:var(--mmt-teal);">
<svg class="mr-1" width="1em" height="1em" viewBox="0 0 448 512" fill="currentColor" aria-hidden="true"><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
Or subscribe on LinkedIn
</a>
</div>
</div>
</section>
<!-- AUT-12: Data pipeline status bar -->
<section class="px-6" style="padding:24px 0 48px;">
<div class="max-w-5xl mx-auto">
<div style="display:flex;align-items:center;gap:24px;padding:16px 20px;background:var(--mmt-soft);border:1px solid var(--mmt-border);border-radius:8px;flex-wrap:wrap;font-size:13px;">
<span style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;color:var(--mmt-text-secondary);">Data pipeline</span>
<span><strong style="color:var(--mmt-navy);" id="dsb-last-run">Loading...</strong> <span style="color:var(--mmt-text-secondary);">last sync</span></span>
<span><strong style="color:var(--mmt-navy);">32</strong> <span style="color:var(--mmt-text-secondary);">entries tracked</span></span>
<span style="font-size:12px;color:var(--mmt-text-secondary);margin-left:auto;font-style:italic;">Sources: SAM.gov, agency websites and trade press, GSA eBuy Open. FPDS-NG retired February 2026.</span>
</div>
</div>
</section>
<!-- AUT-06: CSV export script -->
<script>
function exportContractsCSV() {
var cards = document.querySelectorAll('.card.rounded-xl');
if (!cards.length) { alert('No entries to export.'); return; }
var rows = [['Title','Agency','Status','Description']];
cards.forEach(function(card) {
var title = (card.querySelector('h3') || {}).textContent || '';
var agency = '';
var texts = card.querySelectorAll('.text-xs');
if (texts.length > 0) agency = texts[0].textContent.trim();
var desc = (card.querySelector('.text-sm') || {}).textContent || '';
rows.push([title.trim(), agency, '', desc.trim().substring(0, 200)]);
});
var csv = rows.map(function(r) {
return r.map(function(c) { var s = String(c).replace(/"/g, '""'); return s.includes(',') ? '"' + s + '"' : s; }).join(',');
}).join('\r\n');
var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'mmt-contracts-' + new Date().toISOString().split('T')[0] + '.csv';
a.click();
URL.revokeObjectURL(url);
}
// Pipeline last sync (approximate from build time)
var runEl = document.getElementById('dsb-last-run');
if (runEl) {
var buildDate = document.querySelector('[data-last-verified]');
if (buildDate) runEl.textContent = buildDate.getAttribute('data-last-verified');
else runEl.textContent = 'Today';
}
</script>
</main>
<!-- Footer -->
<footer class="wrap" style="padding:28px 0 58px;">
<div style="border-top:1px solid var(--mmt-border);padding-top:24px;display:grid;grid-template-columns:1fr auto auto auto auto;gap:32px;color:var(--mmt-text-secondary);font-size:13px;">
<div>
<p style="margin-bottom:6px;"><strong style="color:var(--mmt-navy);">Mission Meets Tech</strong></p>
<p>Federal health IT intelligence. Mission first.</p>
<p style="margin-top:10px;">Views expressed are those of the authors and do not represent any employer or government agency.</p>
<p>© 2026 Mission Meets Tech. All rights reserved.</p>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<strong style="color:var(--mmt-navy);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;">Read</strong>
<a href="latest.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Latest Intelligence</a>
<a href="topics.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Topics</a>
<a href="podcast.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Podcast</a>
<a href="newsletter.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Subscribe</a>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<strong style="color:var(--mmt-navy);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;">Tools</strong>
<a href="proposal-pulse.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">ProposalPulse</a>
<a href="marketpulse.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">MarketPulse</a>
<a href="contract-tracker.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Contract Tracker</a>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<strong style="color:var(--mmt-navy);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;">Reference</strong>
<a href="getting-started.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Getting Started</a>
<a href="contracting.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Contracting Hub</a>
<a href="glossary.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Glossary</a>
<a href="agency-sources.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Agency Sources</a>
<a href="newswire.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Newswire</a>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<strong style="color:var(--mmt-navy);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;">Trust</strong>
<a href="about.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">About</a>
<a href="editorial-standards.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Editorial Standards</a>
<a href="security.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Security</a>
<a href="privacy.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Privacy</a>
<a href="terms.html" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Terms</a>
<a href="mailto:mary@missionmeetstech.com" class="no-underline hover:opacity-70" style="color:var(--mmt-text-secondary);">Contact</a>
</div>
</div>
</footer>
<script src="/js/contract-tracker.js" defer></script>
<!-- S15-05: Back to top -->
<button id="btt" aria-label="Back to top" style="position:fixed;bottom:2rem;right:2rem;width:44px;height:44px;border-radius:50%;background:var(--mmt-soft);border:1px solid rgba(69,123,157,0.15);color:var(--mmt-teal);cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity 0.3s,transform 0.3s;z-index:90;box-shadow:0 4px 12px rgba(0,0,0,0.3);" onmouseover="this.style.borderColor='rgba(69,123,157,0.3)';this.style.transform='translateY(-2px)'" onmouseout="this.style.borderColor='rgba(69,123,157,0.15)';this.style.transform='none'">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"/></svg>
</button>
<script>
(function(){
var b=document.getElementById('btt');
if(!b)return;
var t=window.innerHeight;
window.addEventListener('scroll',function(){
if(window.scrollY>t){b.style.opacity='1';b.style.pointerEvents='auto';}
else{b.style.opacity='0';b.style.pointerEvents='none';}
},{passive:true});
b.addEventListener('click',function(){window.scrollTo({top:0,behavior:'smooth'});});
})();
</script>
</body>
</html>