Skip to content

Instantly share code, notes, and snippets.

@compwron
Created March 21, 2026 00:17
Show Gist options
  • Select an option

  • Save compwron/4c5dbf3c4e64cff700e3cb334f1f9d02 to your computer and use it in GitHub Desktop.

Select an option

Save compwron/4c5dbf3c4e64cff700e3cb334f1f9d02 to your computer and use it in GitHub Desktop.
Feature Flags Timeline - app-workflow flags since 2024
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Feature Flags Timeline</title>
<style>
:root {
--bg: #0d1117;
--surface: #161b22;
--border: #30363d;
--text: #e6edf3;
--text-muted: #8b949e;
--green: #3fb950;
--red: #f85149;
--blue: #58a6ff;
--purple: #bc8cff;
--orange: #d29922;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.5;
}
.container { max-width: 1400px; margin: 0 auto; padding: 24px; }
h1 { font-size: 28px; margin-bottom: 4px; }
.subtitle { color: var(--text-muted); margin-bottom: 24px; font-size: 14px; }
/* Stats row */
.stats {
display: flex; gap: 16px; margin-bottom: 24px; flex-wrap: wrap;
}
.stat-card {
background: var(--surface); border: 1px solid var(--border);
border-radius: 8px; padding: 16px 20px; min-width: 150px;
}
.stat-card .num { font-size: 32px; font-weight: 700; }
.stat-card .label { color: var(--text-muted); font-size: 13px; }
.stat-card.green .num { color: var(--green); }
.stat-card.red .num { color: var(--red); }
.stat-card.blue .num { color: var(--blue); }
.stat-card.purple .num { color: var(--purple); }
/* Chart section */
.chart-section {
background: var(--surface); border: 1px solid var(--border);
border-radius: 8px; padding: 20px; margin-bottom: 24px;
}
.chart-section h2 { font-size: 16px; margin-bottom: 16px; }
.chart-tabs {
display: flex; gap: 8px; margin-bottom: 16px;
}
.chart-tab {
background: transparent; border: 1px solid var(--border); color: var(--text-muted);
padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 13px;
}
.chart-tab:hover { border-color: var(--text-muted); }
.chart-tab.active { background: var(--blue); color: #fff; border-color: var(--blue); }
canvas { width: 100%; }
/* Gantt chart */
.gantt-section {
background: var(--surface); border: 1px solid var(--border);
border-radius: 8px; padding: 20px; margin-bottom: 24px;
}
.gantt-section h2 { font-size: 16px; margin-bottom: 12px; }
/* Controls */
.controls {
display: flex; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; align-items: center;
}
.controls input[type="text"] {
background: var(--bg); border: 1px solid var(--border); color: var(--text);
padding: 8px 12px; border-radius: 6px; font-size: 14px; width: 260px;
}
.controls select {
background: var(--bg); border: 1px solid var(--border); color: var(--text);
padding: 8px 12px; border-radius: 6px; font-size: 14px;
}
.controls label {
color: var(--text-muted); font-size: 13px; display: flex; align-items: center; gap: 6px;
}
.controls input[type="range"] { width: 100px; }
/* Gantt rows */
.gantt-container {
overflow-x: auto; position: relative;
}
.gantt-header {
display: flex; position: sticky; top: 0; z-index: 2;
background: var(--surface); border-bottom: 1px solid var(--border);
min-width: fit-content;
}
.gantt-header .label-col {
min-width: 340px; max-width: 340px; padding: 6px 10px;
font-size: 12px; color: var(--text-muted); font-weight: 600;
position: sticky; left: 0; background: var(--surface); z-index: 3;
}
.gantt-header .timeline-col {
flex: 1; display: flex; min-width: 800px;
}
.gantt-header .month-label {
flex: 1; text-align: center; font-size: 11px; color: var(--text-muted);
padding: 6px 0; border-left: 1px solid var(--border);
}
.gantt-body {
max-height: 600px; overflow-y: auto; min-width: fit-content;
}
.gantt-row {
display: flex; border-bottom: 1px solid #21262d; min-height: 26px;
align-items: center;
}
.gantt-row:hover { background: rgba(88,166,255,0.04); }
.gantt-row .label-col {
min-width: 340px; max-width: 340px; padding: 2px 10px;
font-size: 12px; font-family: 'SF Mono', SFMono-Regular, monospace;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
position: sticky; left: 0; background: var(--surface); z-index: 1;
}
.gantt-row:hover .label-col { background: #1a2030; }
.gantt-row .timeline-col {
flex: 1; position: relative; height: 20px; min-width: 800px;
}
.gantt-bar {
position: absolute; height: 14px; top: 3px; border-radius: 3px;
min-width: 3px; cursor: pointer;
}
.gantt-bar.active { background: var(--green); opacity: 0.85; }
.gantt-bar.removed { background: var(--red); opacity: 0.6; }
.gantt-bar:hover { opacity: 1; }
/* Tooltip */
.tooltip {
display: none; position: fixed; background: #1c2128; border: 1px solid var(--border);
border-radius: 8px; padding: 10px 14px; font-size: 13px; z-index: 100;
pointer-events: none; max-width: 320px; box-shadow: 0 4px 12px rgba(0,0,0,0.4);
}
.tooltip .flag-name { font-weight: 600; font-family: monospace; margin-bottom: 4px; }
.tooltip .dates { color: var(--text-muted); }
.tooltip .status { margin-top: 4px; }
.tooltip .status.active { color: var(--green); }
.tooltip .status.removed { color: var(--red); }
/* Table section */
.table-section {
background: var(--surface); border: 1px solid var(--border);
border-radius: 8px; padding: 20px; margin-bottom: 24px;
}
.table-section h2 { font-size: 16px; margin-bottom: 12px; }
table {
width: 100%; border-collapse: collapse; font-size: 13px;
}
th {
text-align: left; padding: 8px 12px; border-bottom: 2px solid var(--border);
color: var(--text-muted); font-size: 12px; text-transform: uppercase;
letter-spacing: 0.5px; cursor: pointer; user-select: none;
position: sticky; top: 0; background: var(--surface); z-index: 1;
}
th:hover { color: var(--text); }
th .sort-arrow { margin-left: 4px; font-size: 10px; }
td { padding: 6px 12px; border-bottom: 1px solid #21262d; }
td.flag-name { font-family: 'SF Mono', SFMono-Regular, monospace; font-size: 12px; }
tr:hover td { background: rgba(88,166,255,0.04); }
.badge {
display: inline-block; padding: 2px 8px; border-radius: 10px;
font-size: 11px; font-weight: 600;
}
.badge.active { background: rgba(63,185,80,0.15); color: var(--green); }
.badge.removed { background: rgba(248,81,73,0.15); color: var(--red); }
.lifespan { color: var(--text-muted); font-size: 12px; }
.table-scroll { max-height: 500px; overflow-y: auto; }
.legend {
display: flex; gap: 16px; margin-bottom: 12px; font-size: 13px; color: var(--text-muted);
}
.legend-item { display: flex; align-items: center; gap: 6px; }
.legend-swatch {
width: 14px; height: 14px; border-radius: 3px;
}
.legend-swatch.active { background: var(--green); }
.legend-swatch.removed { background: var(--red); opacity: 0.6; }
</style>
</head>
<body>
<div class="container">
<h1>Feature Flags Timeline</h1>
<p class="subtitle">All flags in config/feature_flags.yml since January 2024 &middot; Generated 2026-03-20</p>
<div class="stats" id="stats"></div>
<div class="chart-section">
<h2>Active Flag Count Over Time</h2>
<div class="chart-tabs">
<button class="chart-tab active" data-chart="active">Active Count</button>
<button class="chart-tab" data-chart="additions">Additions / Removals per Month</button>
<button class="chart-tab" data-chart="lifespan">Avg Lifespan (days)</button>
</div>
<canvas id="chart" height="300"></canvas>
</div>
<div class="gantt-section">
<h2>Flag Lifespans</h2>
<div class="controls">
<input type="text" id="ganttSearch" placeholder="Search flags...">
<select id="ganttFilter">
<option value="all">All flags</option>
<option value="active">Still active</option>
<option value="removed">Removed</option>
<option value="pre2024">Existed before 2024</option>
</select>
<select id="ganttSort">
<option value="added">Sort by date added</option>
<option value="removed">Sort by date removed</option>
<option value="lifespan">Sort by lifespan</option>
<option value="name">Sort by name</option>
</select>
</div>
<div class="legend">
<div class="legend-item"><div class="legend-swatch active"></div> Still active</div>
<div class="legend-item"><div class="legend-swatch removed"></div> Removed</div>
</div>
<div class="gantt-container">
<div class="gantt-header" id="ganttHeader"></div>
<div class="gantt-body" id="ganttBody"></div>
</div>
</div>
<div class="table-section">
<h2>All Flags</h2>
<div class="controls">
<input type="text" id="tableSearch" placeholder="Search flags...">
<select id="tableFilter">
<option value="all">All flags</option>
<option value="active">Still active</option>
<option value="removed">Removed</option>
</select>
</div>
<div class="table-scroll">
<table>
<thead>
<tr>
<th data-sort="name">Flag Name <span class="sort-arrow"></span></th>
<th data-sort="added">Date Added <span class="sort-arrow"></span></th>
<th data-sort="removed">Date Removed <span class="sort-arrow"></span></th>
<th data-sort="lifespan">Lifespan <span class="sort-arrow"></span></th>
<th data-sort="status">Status <span class="sort-arrow"></span></th>
</tr>
</thead>
<tbody id="tableBody"></tbody>
</table>
</div>
</div>
</div>
<div class="tooltip" id="tooltip"></div>
<script>
const FLAGS = [
{name:"activation_add_clinicians_alert",added:null,removed:"2024-02-29",pre2024:true},
{name:"activation_facility_support_page",added:null,removed:"2024-03-28",pre2024:true},
{name:"activation_reminder_to_finish_organic_order_email",added:null,removed:"2024-04-16",pre2024:true},
{name:"activation_request_to_join",added:null,removed:"2024-07-31",pre2024:true},
{name:"activation_stacked_supplier_selection",added:null,removed:"2024-03-14",pre2024:true},
{name:"activation_validate_phone",added:null,removed:"2024-01-31",pre2024:true},
{name:"allow_n_plus_one_queries_for_versions",added:null,removed:"2024-04-16",pre2024:true},
{name:"cms_product_details_page_v3",added:null,removed:"2024-06-15",pre2024:true},
{name:"fax_reviewer_workflow",added:null,removed:"2024-03-26",pre2024:true},
{name:"improve_definition_pdf_upload_flow_documentation_definition_form",added:null,removed:"2024-04-01",pre2024:true},
{name:"left_sidebar_new_pill_clinical_dashboards",added:null,removed:"2024-03-26",pre2024:true},
{name:"left_sidebar_orders_dropdown",added:null,removed:"2024-04-02",pre2024:true},
{name:"legal_entity_service_areas",added:null,removed:"2024-05-21",pre2024:true},
{name:"manage_facilities_materialized_view",added:null,removed:"2024-06-03",pre2024:true},
{name:"ordering_product_variations_relationships_v1",added:null,removed:"2024-03-14",pre2024:true},
{name:"package_configuration_hidden_suppliers",added:null,removed:"2024-02-21",pre2024:true},
{name:"pay_percent_zero",added:null,removed:"2024-05-23",pre2024:true},
{name:"preferred_supplier_ux_v2",added:null,removed:"2024-06-03",pre2024:true},
{name:"prescription_updates_new_signature",added:null,removed:"2024-04-18",pre2024:true},
{name:"reassign_sales_reps",added:null,removed:"2024-06-03",pre2024:true},
{name:"reminder_to_create_first_organic_order_email",added:null,removed:"2024-02-14",pre2024:true},
{name:"sales_rep_on_employment",added:null,removed:"2024-02-21",pre2024:true},
{name:"sales_rep_territories",added:null,removed:"2024-06-03",pre2024:true},
{name:"supplier_system_patient_id_patient_search",added:null,removed:"2024-02-16",pre2024:true},
{name:"transfer_sales_reps",added:null,removed:"2024-06-24",pre2024:true},
{name:"trigram_non_facilities_patient_search",added:null,removed:"2024-06-17",pre2024:true},
{name:"activation_new_user_added_email",added:"2024-01-05",removed:"2024-05-06"},
{name:"use_signing_status",added:"2024-01-05",removed:"2024-01-09"},
{name:"cms_categories_page_v2",added:"2024-01-09",removed:"2025-02-09"},
{name:"documentation_order_dashboard_uses_signing_status",added:"2024-01-09",removed:"2024-02-22"},
{name:"use_maskito_date_input",added:"2024-01-09",removed:"2024-01-31"},
{name:"activation_upgraded_adding_user",added:"2024-01-11",removed:"2024-07-30"},
{name:"ie_deprecation_modal",added:"2024-01-12",removed:"2024-05-09"},
{name:"hide_stale_orders_banner",added:"2024-01-16",removed:"2024-03-11"},
{name:"marketplace_package_configuration",added:"2024-01-16",removed:"2026-01-20"},
{name:"cms_new_survey_mapping_index_page",added:"2024-01-18",removed:"2024-06-06"},
{name:"send_back_invitation_pdf_v2",added:"2024-01-18",removed:"2024-03-14"},
{name:"survey_to_doc_validator",added:"2024-01-23",removed:"2026-01-06"},
{name:"fast_catalog_browse",added:"2024-01-24",removed:"2024-02-05"},
{name:"user_activation_product_first_search",added:"2024-01-24",removed:"2024-11-01"},
{name:"cms_edit_product_settings_v2",added:"2024-02-08",removed:"2025-10-22"},
{name:"sales_rep_territories_supplier_admin",added:"2024-02-21",removed:"2024-06-28"},
{name:"user_activation_validate_dx",added:"2024-02-26",removed:"2024-05-30"},
{name:"prefer_official_name",added:"2024-02-27",removed:"2025-01-31"},
{name:"sales_reports_redirect",added:"2024-02-27",removed:"2025-01-31"},
{name:"batch_emr_doctor_dashboard_dme_order_signature_requests",added:"2024-03-14",removed:"2024-10-29"},
{name:"facility_order_details_reviewer_promo",added:"2024-03-14",removed:"2024-10-29"},
{name:"left_sidebar_pending_signature_requests",added:"2024-03-14",removed:"2024-03-18"},
{name:"ccx_auth_requests",added:"2024-03-15",removed:"2025-08-21"},
{name:"left_sidebar_signature_requests_clinician_list",added:"2024-03-15",removed:"2024-03-26"},
{name:"left_sidebar_signature_requests_signup",added:"2024-03-18",removed:"2024-10-29"},
{name:"share_request_link",added:"2024-03-19",removed:"2025-02-12"},
{name:"catalog_sku_details_page_v2",added:"2024-03-21",removed:"2025-02-10"},
{name:"route_with_insurance_eligibility",added:"2024-03-22",removed:"2024-06-05"},
{name:"supplier_fax_documents",added:"2024-03-25",removed:"2025-05-14"},
{name:"log_preferred_supplier_criteria",added:"2024-03-26",removed:"2024-06-05"},
{name:"ie_deprecation_banner",added:"2024-03-27",removed:"2024-05-09"},
{name:"react_supplier_insurance_settings",added:"2024-04-05",removed:"2024-11-11"},
{name:"cms_async_formulary_definition_import",added:"2024-04-08",removed:"2024-11-25"},
{name:"filter_inactive_coverage_from_emr",added:"2024-04-09",removed:"2024-12-06"},
{name:"cms_react_flash_notices",added:"2024-04-10",removed:"2025-02-11"},
{name:"activation_slim_the_order_sidebars",added:"2024-04-11",removed:"2024-06-21"},
{name:"additional_fax_prompt",added:"2024-04-16",removed:"2025-03-18"},
{name:"new_digital_eligibility_definition",added:"2024-04-22",removed:"2024-08-14"},
{name:"hide_discharge_date",added:"2024-04-24",removed:"2024-06-18"},
{name:"cms_signature_requests_page_v2",added:"2024-05-08",removed:"2024-10-29"},
{name:"ie_prevent_access",added:"2024-05-09",removed:"2024-09-03"},
{name:"orders_dashboard_tab_view",added:"2024-05-09",removed:"2024-09-16"},
{name:"patient_portal_message_templates",added:"2024-05-13",removed:"2024-06-11"},
{name:"cms_async_seed_import",added:"2024-05-14",removed:"2025-04-08"},
{name:"user_activation_product_first_search_include_enterprise",added:"2024-05-20",removed:"2025-02-25"},
{name:"cms_seeds_page_v2",added:"2024-05-23",removed:"2025-07-21"},
{name:"use_functional_browsing_component",added:"2024-05-28",removed:"2024-08-20"},
{name:"banner_signature_requests",added:"2024-05-30",removed:"2024-08-16"},
{name:"supplier_acceptance_email_ssp_id",added:"2024-05-30",removed:"2025-01-08"},
{name:"activation_zip_service_areas",added:"2024-05-31",removed:"2024-08-19"},
{name:"optum_enhanced_clinical_guidelines_rx_only",added:"2024-05-31",removed:"2024-08-01"},
{name:"fillable_pdfs_for_documentation_requirements",added:"2024-06-03",removed:"2024-06-05"},
{name:"optum_enhanced_clinical_guidelines",added:"2024-06-03",removed:"2024-08-06"},
{name:"use_initial_package_configuration",added:"2024-06-03",removed:"2024-08-01"},
{name:"brightree_supplier_document_mapping_ui_enabled",added:"2024-06-04",removed:"2024-06-12"},
{name:"jedi_pending_browser_fillable_pdfs_for_documentation_requirements",added:"2024-06-05",removed:"2024-09-18"},
{name:"jedi_pending_fillable_pdfs_for_documentation_requirements",added:"2024-06-05",removed:null},
{name:"unique_document_generation",added:"2024-06-10",removed:"2025-02-25"},
{name:"payor_dashboard",added:"2024-06-11",removed:"2025-04-09"},
{name:"brightree_supplier_document_mapping_enabled",added:"2024-06-12",removed:"2024-09-13"},
{name:"ssr_app_signature_request_via_email",added:"2024-06-24",removed:"2024-10-02"},
{name:"cms_seeds_import_page_v2",added:"2024-06-27",removed:"2025-07-21"},
{name:"context_driven_docs",added:"2024-06-27",removed:"2025-12-11"},
{name:"ssr_app_new_request_signature_flow",added:"2024-06-28",removed:"2025-02-16"},
{name:"facility_incoming_orders",added:"2024-07-01",removed:"2024-11-14"},
{name:"context_group_mgmt",added:"2024-07-02",removed:"2025-12-11"},
{name:"ssr_app_performance_fix",added:"2024-07-09",removed:"2024-07-10"},
{name:"ssr_app_search_performance_improvement",added:"2024-07-10",removed:"2024-08-14"},
{name:"do_not_fax_digitally_active_doctors",added:"2024-07-16",removed:"2024-12-13"},
{name:"ssr_app_my_facilities_ignore_old_orders",added:"2024-07-18",removed:"2025-05-28"},
{name:"facility_user_email_for_pushback_optional",added:"2024-07-22",removed:"2024-11-22"},
{name:"ssr_app_signature_request_count_existing_email_as_dont_request_contact_info",added:"2024-07-22",removed:"2024-10-08"},
{name:"use_relevancy_in_search_by_supplier",added:"2024-07-22",removed:"2024-08-26"},
{name:"use_functional_signature_component",added:"2024-07-25",removed:"2024-08-14"},
{name:"demo_clinical_guidelines",added:"2024-08-01",removed:"2026-01-07"},
{name:"facility_snooze_orders",added:"2024-08-01",removed:"2025-07-11"},
{name:"catalog_publications",added:"2024-08-05",removed:"2025-04-08"},
{name:"cms_attributes_page_v2",added:"2024-08-05",removed:"2025-04-25"},
{name:"cms_audit_log_page_v2",added:"2024-08-05",removed:"2025-06-10"},
{name:"cms_bulk_import_v1",added:"2024-08-05",removed:"2024-09-18"},
{name:"cms_catalog_product_variations_relationships_v1",added:"2024-08-05",removed:"2025-04-08"},
{name:"cms_edit_package_config_v2",added:"2024-08-05",removed:null},
{name:"cms_package_details_page_v2",added:"2024-08-05",removed:"2024-08-16"},
{name:"cms_package_edit_page_v2",added:"2024-08-05",removed:null},
{name:"cms_supplier_details_page_v2",added:"2024-08-05",removed:"2025-02-09"},
{name:"combined_catalog_search",added:"2024-08-05",removed:"2025-02-25"},
{name:"create_o2_recerts",added:"2024-08-05",removed:"2024-08-05"},
{name:"default_to_fax_for_digitally_inactive_doctors",added:"2024-08-05",removed:"2025-05-27"},
{name:"draft_doc_mappings",added:"2024-08-05",removed:"2026-01-12"},
{name:"epic_oauth",added:"2024-08-05",removed:"2025-01-02"},
{name:"external_dme_order_creation_api",added:"2024-08-05",removed:"2025-03-10"},
{name:"formulary_pricing",added:"2024-08-05",removed:null},
{name:"marketplace_sku_search",added:"2024-08-05",removed:"2024-10-18"},
{name:"new_patient_loading_form",added:"2024-08-05",removed:null},
{name:"new_patient_search_card",added:"2024-08-05",removed:"2025-02-20"},
{name:"quick_list",added:"2024-08-05",removed:null},
{name:"referral_api_pending_order_enabled",added:"2024-08-05",removed:"2025-01-03"},
{name:"rename_recertification_to_renewal",added:"2024-08-05",removed:"2024-08-05"},
{name:"signature_pad",added:"2024-08-05",removed:"2024-11-12"},
{name:"supplier_sendback_clinical_facility_search",added:"2024-08-05",removed:"2024-12-12"},
{name:"survey_tester",added:"2024-08-05",removed:"2026-01-06"},
{name:"token_search_dictionaries",added:"2024-08-05",removed:"2025-04-17"},
{name:"use_aws_sms_provider",added:"2024-08-05",removed:null},
{name:"consignment_closet_foundational_refresh",added:"2024-08-06",removed:"2025-06-02"},
{name:"stubbed_clinical_guidelines",added:"2024-08-06",removed:"2025-07-15"},
{name:"payor_user_actions",added:"2024-08-12",removed:"2024-11-13"},
{name:"territories_data_propagation",added:"2024-08-13",removed:"2024-11-14"},
{name:"workflow_function_component",added:"2024-08-13",removed:"2024-08-16"},
{name:"ranked_supplier",added:"2024-08-14",removed:"2025-12-12"},
{name:"jedi_pending_smart_document_intake",added:"2024-08-19",removed:"2024-12-13"},
{name:"auto_accept_renewal_orders",added:"2024-08-20",removed:"2025-02-25"},
{name:"service_areas_data_propagation",added:"2024-08-20",removed:"2024-10-24"},
{name:"accessory_check_enabled",added:"2024-08-21",removed:"2025-06-25"},
{name:"facility_incoming_orders_search_patients",added:"2024-08-26",removed:"2025-09-23"},
{name:"new_pill_incoming_orders",added:"2024-08-29",removed:"2025-01-17"},
{name:"use_new_queuing_in_configuration_component",added:"2024-09-05",removed:"2024-09-16"},
{name:"explicit_supplier_selection_step",added:"2024-09-09",removed:"2024-11-27"},
{name:"cms_dme_order_cart_enhancements",added:"2024-09-11",removed:"2024-11-19"},
{name:"reduce_dup_eligibility_checks",added:"2024-09-11",removed:"2024-11-05"},
{name:"user_activation_search_by_product_tab_default",added:"2024-09-11",removed:"2024-11-11"},
{name:"payor_enhanced_clinical_guidelines",added:"2024-09-16",removed:"2026-01-08"},
{name:"use_functional_configuration_component",added:"2024-09-16",removed:"2026-03-09"},
{name:"fhirbenders_browser_fillable_pdfs_for_emr_instances",added:"2024-09-18",removed:null},
{name:"automated_welcome_message",added:"2024-09-19",removed:"2024-10-22"},
{name:"consignment_closet_duplication",added:"2024-09-19",removed:"2025-06-24"},
{name:"facility_incoming_orders_to_action_required",added:"2024-09-19",removed:"2024-10-29"},
{name:"territories_overlapping_zips",added:"2024-09-20",removed:"2024-11-14"},
{name:"collect_facility_cancel_reason",added:"2024-09-23",removed:"2025-02-12"},
{name:"incoming_orders_enabled_setting",added:"2024-09-24",removed:"2025-07-21"},
{name:"calculate_pushback_recipients_for_sgo_renewals",added:"2024-09-25",removed:"2025-02-12"},
{name:"suppress_recipient_notifications_for_sgo_renewals",added:"2024-09-25",removed:"2025-07-09"},
{name:"facility_incoming_orders_display_required_actions",added:"2024-10-01",removed:"2025-06-18"},
{name:"referral_api_product_selection_enabled",added:"2024-10-01",removed:null},
{name:"remove_timestamp_from_pcc_doc_names",added:"2024-10-03",removed:null},
{name:"use_functional_date_picker_component",added:"2024-10-03",removed:"2024-10-22"},
{name:"async_order_completion_job_enabled",added:"2024-10-16",removed:"2024-11-21"},
{name:"ssr_app_action_needed_filter",added:"2024-10-17",removed:"2025-01-29"},
{name:"user_activation_mobile_filters",added:"2024-10-17",removed:"2024-11-27"},
{name:"facility_freedom_prominent_rejection",added:"2024-10-18",removed:"2024-11-11"},
{name:"prohibit_duplicate_orders",added:"2024-10-22",removed:"2025-08-08"},
{name:"search_by_product_using_shop",added:"2024-10-25",removed:"2025-03-25"},
{name:"payor_order_details",added:"2024-10-30",removed:"2025-04-09"},
{name:"facility_dashboard_focus_tiles",added:"2024-10-31",removed:"2025-05-19"},
{name:"use_zendesk_native_chat",added:"2024-11-05",removed:"2025-09-30"},
{name:"facility_search_by_other_name",added:"2024-11-11",removed:"2025-01-28"},
{name:"clinician_search_namecase",added:"2024-11-12",removed:"2024-12-06"},
{name:"doctor_search_service_local",added:"2024-11-12",removed:"2024-11-26"},
{name:"sales_order_classification_mappings",added:"2024-11-12",removed:"2025-05-21"},
{name:"catalog_validate_supplier_sku_archived_at",added:"2024-11-13",removed:"2025-03-10"},
{name:"include_user_info_on_document_upload_event",added:"2024-11-15",removed:"2025-05-27"},
{name:"ssr_app_documentation_pill",added:"2024-11-15",removed:"2025-05-28"},
{name:"jedi_extract_fields_intake",added:"2024-11-17",removed:"2024-11-18"},
{name:"new_webhook_push_job_requeue_logic",added:"2024-11-17",removed:"2025-02-12"},
{name:"jedi_new_document_review_intake",added:"2024-11-18",removed:"2025-02-27"},
{name:"additional_fax_prompt_v2",added:"2024-11-19",removed:"2025-03-18"},
{name:"catalog_search_use_inclusive_mode",added:"2024-11-19",removed:"2025-11-19"},
{name:"ssr_app_filter_by_facility",added:"2024-11-19",removed:"2025-05-28"},
{name:"auth_requests_page",added:"2024-11-20",removed:"2025-08-21"},
{name:"warn_when_facility_has_no_signed_agreements",added:"2024-11-20",removed:null},
{name:"canceled_orders_visible_to_supplier",added:"2024-11-21",removed:"2025-04-14"},
{name:"chat_commercialization",added:"2024-11-22",removed:null},
{name:"show_demo_prompt_on_new_order_page",added:"2024-11-25",removed:"2025-02-19"},
{name:"accurate_common_codes",added:"2024-11-30",removed:null},
{name:"epic_sig_requests_without_cached_patients",added:"2024-12-05",removed:null},
{name:"async_spc_configurability",added:"2024-12-10",removed:null},
{name:"facility_dashboard_actionable_cards",added:"2024-12-10",removed:"2025-07-08"},
{name:"sales_team_collaboration_tools",added:"2024-12-11",removed:"2025-06-26"},
{name:"cms_complex_spc_config",added:"2024-12-17",removed:"2025-09-15"},
{name:"cms_attribute_enhancements_refresh",added:"2024-12-18",removed:"2025-12-08"},
{name:"address_standardization",added:"2024-12-20",removed:null},
{name:"address_verification",added:"2024-12-20",removed:"2025-02-13"},
{name:"allow_sign_out_for_embedded_app",added:"2024-12-30",removed:"2025-06-11"},
{name:"show_demo_prompt_on_dashboard_page",added:"2025-01-07",removed:"2025-02-14"},
{name:"supplier_routing_pilot",added:"2025-01-08",removed:"2025-12-12"},
{name:"collect_facility_generated_order_cancel_reason",added:"2025-01-09",removed:"2025-02-25"},
{name:"cms_debugger_payment_details",added:"2025-01-14",removed:"2025-04-09"},
{name:"duplicate_facility_order",added:"2025-01-14",removed:null},
{name:"cms_perry_scope",added:"2025-01-15",removed:"2025-03-13"},
{name:"dme_enforcement_pathways",added:"2025-01-15",removed:null},
{name:"ssr_app_saved_facilities",added:"2025-01-17",removed:"2025-05-27"},
{name:"match_patient_by_phone",added:"2025-01-23",removed:"2026-01-14"},
{name:"facility_dashboard_order_actions",added:"2025-01-24",removed:"2025-04-17"},
{name:"sales_team_collab_tools_facilities_no_connection",added:"2025-01-24",removed:"2025-06-30"},
{name:"catalog_product_details_spa",added:"2025-01-28",removed:"2025-07-25"},
{name:"complete_facility_profile",added:"2025-01-31",removed:"2025-05-20"},
{name:"renewal_pushback_reminder",added:"2025-01-31",removed:"2025-05-08"},
{name:"incoming_order_banner_facility_review_page",added:"2025-02-04",removed:"2025-04-14"},
{name:"sgo_banner_facility_review_page",added:"2025-02-04",removed:null},
{name:"optimized_compatibility_check",added:"2025-02-05",removed:"2025-04-03"},
{name:"sales_team_collab_tools_saved_main_app",added:"2025-02-10",removed:"2025-06-26"},
{name:"send_docs_for_auth",added:"2025-02-11",removed:null},
{name:"clinical_facility_multiple_fax_numbers",added:"2025-02-12",removed:"2025-02-25"},
{name:"dme_order_reminders_disabled",added:"2025-02-19",removed:"2025-08-11"},
{name:"payor_auth_misc_hcpcs",added:"2025-02-26",removed:"2025-08-21"},
{name:"payor_auth_reauthorization",added:"2025-02-26",removed:"2025-04-09"},
{name:"prescribing_quantity_capture",added:"2025-02-26",removed:null},
{name:"payor_auth_determination_api",added:"2025-02-27",removed:"2025-08-21"},
{name:"skip_delivery_step_when_complete",added:"2025-02-27",removed:null},
{name:"hide_order_progress_donuts",added:"2025-02-28",removed:"2025-03-12"},
{name:"clinical_facility_dashboard_cache_model_listener_subscribed",added:"2025-03-03",removed:"2025-10-29"},
{name:"jedi_intake_patient_search",added:"2025-03-03",removed:"2025-04-15"},
{name:"supplier_system_instance_external_order_mangement",added:"2025-03-03",removed:"2025-10-13"},
{name:"disable_acceptance_faxes_for_supplier",added:"2025-03-04",removed:"2025-08-14"},
{name:"dme_order_reminders_internal_comments",added:"2025-03-07",removed:"2025-05-20"},
{name:"payor_auth_request_reauth",added:"2025-03-11",removed:"2025-08-21"},
{name:"facility_incoming_order_teams",added:"2025-03-12",removed:null},
{name:"sales_team_collab_tools_use_n_1_in_serializer",added:"2025-03-13",removed:"2025-04-01"},
{name:"enhanced_fillable_forms",added:"2025-03-17",removed:null},
{name:"items_key_in_api_payload",added:"2025-03-18",removed:"2025-10-14"},
{name:"payor_auth_edits",added:"2025-03-18",removed:"2025-08-21"},
{name:"jedi_intake_sku_setter",added:"2025-03-19",removed:"2025-06-30"},
{name:"network_experience_low_engagement",added:"2025-03-19",removed:"2025-10-21"},
{name:"retain_transferred_signed_generated_docs",added:"2025-03-20",removed:"2025-04-14"},
{name:"fax_invite_pushback_reminder",added:"2025-03-24",removed:null},
{name:"facility_dashboard_use_cache",added:"2025-03-25",removed:"2026-02-18"},
{name:"split_document_provisioning_in_brightree",added:"2025-03-31",removed:"2025-07-15"},
{name:"network_experience_low_engagement_no_connection",added:"2025-04-01",removed:"2025-06-30"},
{name:"order_type_modal",added:"2025-04-01",removed:null},
{name:"supplier_organization_dashboard_focus_tiles",added:"2025-04-03",removed:"2025-08-08"},
{name:"user_preferences_tabbed",added:"2025-04-04",removed:null},
{name:"doctor_search_trigram",added:"2025-04-09",removed:"2025-05-23"},
{name:"rx_quantity_order_flow_redesign",added:"2025-04-09",removed:"2025-11-24"},
{name:"sales_team_collab_tools_has_ordered_filter",added:"2025-04-11",removed:"2025-10-21"},
{name:"show_self_guided_demo_prompt_on_new_order_page",added:"2025-04-11",removed:null},
{name:"show_video",added:"2025-04-13",removed:"2025-04-14"},
{name:"supplier_organization_patient_scope_v2",added:"2025-04-13",removed:"2025-04-16"},
{name:"cms_attribute_value_migration",added:"2025-04-14",removed:"2025-07-28"},
{name:"payor_test_eligibility_service_keys",added:"2025-04-14",removed:"2025-07-07"},
{name:"sales_team_collab_tools_facility_profile",added:"2025-04-15",removed:"2025-06-27"},
{name:"jedi_accept_order_with_no_items",added:"2025-04-16",removed:"2025-06-27"},
{name:"concatenate_patient_given_name",added:"2025-04-18",removed:null},
{name:"dme_order_reminders_api_sgos",added:"2025-04-18",removed:"2025-05-20"},
{name:"dme_order_reminders_manual_sgos",added:"2025-04-18",removed:"2025-05-20"},
{name:"order_type_modal_variant",added:"2025-04-18",removed:"2025-08-21"},
{name:"v2_clinical_guidelines",added:"2025-04-22",removed:"2025-08-11"},
{name:"dme_order_reminder_experiment",added:"2025-04-24",removed:"2025-08-11"},
{name:"dummy_boolean_flag",added:"2025-04-28",removed:null},
{name:"dummy_json_flag",added:"2025-04-28",removed:null},
{name:"cat_crew_package_search_using_shop",added:"2025-05-05",removed:null},
{name:"catalog_spc_compatibility_checker",added:"2025-05-06",removed:"2025-08-08"},
{name:"supplier_send_back_drawer",added:"2025-05-07",removed:"2025-07-22"},
{name:"facility_enterprise_focus_tiles",added:"2025-05-19",removed:"2025-11-20"},
{name:"payor_auth_creation",added:"2025-05-20",removed:"2025-08-21"},
{name:"catalog_browsing",added:"2025-05-22",removed:"2025-09-19"},
{name:"cms_attribute_alias",added:"2025-05-29",removed:"2025-07-03"},
{name:"zendesk_chat_in_ssr_app",added:"2025-05-29",removed:"2025-07-21"},
{name:"documentation_order_attempt_facility_match",added:"2025-06-02",removed:"2025-08-11"},
{name:"rx_summary_document_refresh",added:"2025-06-02",removed:"2025-11-25"},
{name:"clinical_organizations_users_query_v2",added:"2025-06-04",removed:"2025-07-14"},
{name:"dme_order_fax_visibility",added:"2025-06-05",removed:"2025-08-06"},
{name:"signing_signature_request_batch_notifications_v2",added:"2025-06-05",removed:"2025-06-09"},
{name:"signature_request_batch_notifications_v2",added:"2025-06-09",removed:"2026-01-12"},
{name:"patient_search_no_stop_words",added:"2025-06-11",removed:"2025-07-23"},
{name:"similar_facilities_cta",added:"2025-06-11",removed:"2025-07-21"},
{name:"network_profile_user_tab",added:"2025-06-13",removed:"2025-07-17"},
{name:"sales_team_collab_tools_stats_table",added:"2025-06-13",removed:"2025-11-05"},
{name:"batch_uploaded_complex_renewal_notifications",added:"2025-06-18",removed:"2025-12-04"},
{name:"clinical_facility_doc_order_cache_listener",added:"2025-06-20",removed:"2025-10-29"},
{name:"cms_hidden_attributes",added:"2025-06-24",removed:null},
{name:"jedi_intake_document_upload",added:"2025-07-01",removed:null},
{name:"cms_attribute_units",added:"2025-07-16",removed:"2025-12-03"},
{name:"disable_configurable_attributes",added:"2025-07-16",removed:"2025-11-19"},
{name:"clinical_facility_dashboard_signature_requests_focus_tile",added:"2025-07-17",removed:"2025-11-18"},
{name:"payor_make_policy_primary_button",added:"2025-07-17",removed:null},
{name:"cms_survey_show_page_v2",added:"2025-07-22",removed:"2026-01-15"},
{name:"network_facility_profile_overview",added:"2025-07-23",removed:"2025-10-21"},
{name:"public_facility_user_approval",added:"2025-07-29",removed:null},
{name:"payor_test_insurance_products",added:"2025-07-30",removed:null},
{name:"catalog_optimized_compatibility_index_builder",added:"2025-08-01",removed:"2025-12-03"},
{name:"fax_via_telnyx",added:"2025-08-01",removed:null},
{name:"facility_all_orders_dashboard",added:"2025-08-04",removed:"2025-09-18"},
{name:"network_recent_orders",added:"2025-08-04",removed:"2025-10-21"},
{name:"push_to_facility_prefill",added:"2025-08-06",removed:"2025-10-08"},
{name:"facility_auto_approve_user_by_email_domain",added:"2025-08-07",removed:null},
{name:"eb_order_benefits_display",added:"2025-08-11",removed:"2025-10-17"},
{name:"scannable_qr_codes",added:"2025-08-11",removed:"2025-08-13"},
{name:"use_active_record_with_connection",added:"2025-08-12",removed:"2025-09-10"},
{name:"scannable_qr_codes_v2",added:"2025-08-13",removed:null},
{name:"payor_notification_settings",added:"2025-08-25",removed:"2025-10-06"},
{name:"jedi_ai_qualification_in_dme_order",added:"2025-08-27",removed:"2025-11-13"},
{name:"packageless_dme_order_uploader",added:"2025-08-28",removed:null},
{name:"homepage_page",added:"2025-09-02",removed:"2025-09-22"},
{name:"network_new_pill",added:"2025-09-02",removed:"2025-09-03"},
{name:"eb_new_eligibility_check",added:"2025-09-03",removed:"2025-10-21"},
{name:"network_new_tag_strong",added:"2025-09-03",removed:"2025-09-23"},
{name:"documentation_mappings_v2",added:"2025-09-04",removed:"2026-03-06"},
{name:"payor_network_managed_orders",added:"2025-09-05",removed:"2025-12-12"},
{name:"suggested_actions",added:"2025-09-05",removed:"2026-01-05"},
{name:"payor_orders_dashboard_filters",added:"2025-09-09",removed:"2025-12-12"},
{name:"custom_order_markers",added:"2025-09-10",removed:null},
{name:"disable_complex_duplicate_check",added:"2025-09-11",removed:null},
{name:"eb_order_benefits_display_errors",added:"2025-09-11",removed:"2025-10-17"},
{name:"use_active_record_sanitize_sql_like",added:"2025-09-12",removed:null},
{name:"cms_pricing_sheets",added:"2025-09-15",removed:"2026-03-11"},
{name:"new_messages_scoper_performance",added:"2025-09-15",removed:"2025-10-06"},
{name:"price_enabled_ordering",added:"2025-09-15",removed:"2026-03-10"},
{name:"facility_unified_demand_experience",added:"2025-09-18",removed:"2026-03-03"},
{name:"high_performing_rep_experiment",added:"2025-09-18",removed:null},
{name:"jedi_auto_classify_documents",added:"2025-09-24",removed:null},
{name:"supplier_draft_focus_tile",added:"2025-09-25",removed:"2025-11-21"},
{name:"zendesk_native_identify",added:"2025-09-30",removed:"2025-10-10"},
{name:"enterprise_facility_unified_demand_experience",added:"2025-10-02",removed:"2025-10-07"},
{name:"jedi_brightree_audit_packet",added:"2025-10-02",removed:"2025-12-04"},
{name:"pod_supplemental_docs",added:"2025-10-02",removed:null},
{name:"jedi_textract_search",added:"2025-10-08",removed:"2025-12-05"},
{name:"network_dashboard_grow_experience",added:"2025-10-08",removed:null},
{name:"eb_carrier_prediction_regex",added:"2025-10-09",removed:"2025-11-05"},
{name:"zendesk_native_authenticate",added:"2025-10-09",removed:"2025-10-30"},
{name:"network_profile_sso_detection_by_domain",added:"2025-10-13",removed:null},
{name:"attribute_auto_selection_fix",added:"2025-10-14",removed:"2025-12-03"},
{name:"add_consigment_closet_name_to_delivery_notes",added:"2025-10-15",removed:null},
{name:"brightree_fax_out_cart_mappings",added:"2025-10-16",removed:null},
{name:"payor_open_closed_orders",added:"2025-10-16",removed:"2026-03-08"},
{name:"age_based_coverage_criteria",added:"2025-10-22",removed:null},
{name:"supplier_exclusions",added:"2025-10-22",removed:null},
{name:"zendesk_messaging",added:"2025-10-22",removed:"2025-12-03"},
{name:"cms_survey_show_page_v3",added:"2025-10-23",removed:"2026-03-11"},
{name:"cms_package_level_hidden_attributes",added:"2025-10-27",removed:null},
{name:"jedi_dme_order_audit_packets",added:"2025-10-27",removed:"2026-02-03"},
{name:"eb_enable_ihcs_bcbs_plan_exclusivity",added:"2025-10-28",removed:"2025-11-11"},
{name:"cms_react_menu",added:"2025-11-01",removed:"2025-11-25"},
{name:"doc_request_per_order_mapping_review",added:"2025-11-03",removed:null},
{name:"send_fax_events_without_dme_order",added:"2025-11-03",removed:"2026-01-05"},
{name:"skip_document_processing_status_guard",added:"2025-11-03",removed:"2025-12-17"},
{name:"custom_order_markers_end_user_dashboard",added:"2025-11-04",removed:null},
{name:"global_account_switcher_new",added:"2025-11-06",removed:"2026-01-14"},
{name:"renewal_triage_step",added:"2025-11-13",removed:null},
{name:"enhanced_fillable_forms_v2",added:"2025-11-18",removed:null},
{name:"global_ude_facility_filter",added:"2025-11-18",removed:"2026-01-13"},
{name:"fax_details",added:"2025-11-19",removed:"2025-11-20"},
{name:"jedi_field_attribution",added:"2025-11-19",removed:"2026-03-13"},
{name:"patient_feedback_dashboard_enabled",added:"2025-11-19",removed:null},
{name:"eb_store_eligibility_raw_responses",added:"2025-11-20",removed:"2026-01-06"},
{name:"fax_details_page",added:"2025-11-20",removed:null},
{name:"catalog_audit_log_spa",added:"2025-11-21",removed:"2026-01-28"},
{name:"doc_request_orders_need_review_focus_tile",added:"2025-11-21",removed:"2025-12-10"},
{name:"nav_bar_renderer",added:"2025-11-21",removed:"2025-12-10"},
{name:"cms_category_detail_page_reactified",added:"2025-11-24",removed:"2026-03-16"},
{name:"jedi_intake_reordering_pages",added:"2025-12-03",removed:null},
{name:"skip_updating_zendesk_users_at_login",added:"2025-12-05",removed:null},
{name:"doc_request_ignore_duplicates",added:"2025-12-08",removed:"2025-12-19"},
{name:"connect_with_clinical_ae",added:"2025-12-11",removed:null},
{name:"payor_supplier_configuration_s3",added:"2025-12-11",removed:"2026-03-06"},
{name:"dummy_hcpcs_mapping",added:"2025-12-15",removed:"2025-12-16"},
{name:"zendesk_api_use_retry_settings",added:"2025-12-15",removed:null},
{name:"payor_dummy_hcpcs_mapping",added:"2025-12-16",removed:"2026-03-05"},
{name:"optional_numeric_attribute_values",added:"2025-12-17",removed:"2026-03-11"},
{name:"sign_proof_of_delivery_type_modal",added:"2025-12-17",removed:null},
{name:"eb_eligibility_benefits_display_v2",added:"2025-12-19",removed:null},
{name:"reviewer_playlist_bulk_sign",added:"2026-01-06",removed:null},
{name:"payor_mark_order_reviewed",added:"2026-01-07",removed:null},
{name:"signature_matching_accuracy_improvements",added:"2026-01-09",removed:null},
{name:"cms_subcategory_detail_page_reactified",added:"2026-01-12",removed:"2026-03-17"},
{name:"integrated_sig_request_failure",added:"2026-01-14",removed:"2026-03-05"},
{name:"jedi_field_attribution_highlighting_on_order_page",added:"2026-01-14",removed:"2026-03-13"},
{name:"jedi_supplier_system_patient_id",added:"2026-01-20",removed:null},
{name:"payor_auth_rejection_edits",added:"2026-01-20",removed:"2026-01-21"},
{name:"use_workflow_rules",added:"2026-01-20",removed:null},
{name:"bt_patient_search_in_workflow",added:"2026-01-21",removed:null},
{name:"payor_auth_edit_rejections",added:"2026-01-21",removed:"2026-03-08"},
{name:"doc_request_fax_out_reminder",added:"2026-01-23",removed:null},
{name:"recent_order_tracking",added:"2026-01-23",removed:"2026-02-17"},
{name:"eb_preferred_supplier_address_selection",added:"2026-01-27",removed:null},
{name:"facility_profile_summary",added:"2026-01-27",removed:null},
{name:"jedi_interstitial_order_creation",added:"2026-01-28",removed:null},
{name:"facility_recently_opened_orders",added:"2026-01-29",removed:"2026-03-11"},
{name:"eb_member_file_enhanced_prior_auth",added:"2026-01-30",removed:null},
{name:"email_subject_hide_patient_name",added:"2026-01-30",removed:"2026-02-02"},
{name:"payor_bulk_upload_auths",added:"2026-01-30",removed:null},
{name:"facility_mailers_no_patient_names_experiment",added:"2026-02-02",removed:null},
{name:"jedi_sync_document_derivation",added:"2026-02-11",removed:"2026-03-04"},
{name:"use_pdf_service",added:"2026-02-11",removed:"2026-03-16"},
{name:"cms_facility_profile_glow_up",added:"2026-02-12",removed:null},
{name:"facility_orders_page_focus_tiles",added:"2026-02-12",removed:"2026-03-13"},
{name:"baseline_qualification_ui",added:"2026-02-13",removed:null},
{name:"payor_auth_cancellation_data",added:"2026-02-19",removed:"2026-03-02"},
{name:"payor_evaluate_unsupported_hcpcs",added:"2026-02-19",removed:null},
{name:"dme_order_extended_terminal_age",added:"2026-02-25",removed:null},
{name:"prescribed_quantity_seeds",added:"2026-02-25",removed:null},
{name:"new_workflow_navigation",added:"2026-03-02",removed:null},
{name:"jedi_auto_merge_csr_inbox_states",added:"2026-03-03",removed:null},
{name:"qualification_feedback",added:"2026-03-03",removed:null},
{name:"facility_reviewer_sign_up_banner",added:"2026-03-12",removed:"2026-03-20"},
{name:"reviewer_signup_2026",added:"2026-03-20",removed:null},
];
// Derived constants
const TODAY = new Date("2026-03-20");
const TIMELINE_START = new Date("2024-01-01");
const TIMELINE_END = new Date("2026-04-01");
const TOTAL_DAYS = (TIMELINE_END - TIMELINE_START) / 86400000;
function parseDate(s) { return s ? new Date(s) : null; }
function daysSince(start, end) {
const s = start || TIMELINE_START;
const e = end || TODAY;
return Math.max(0, Math.round((e - s) / 86400000));
}
function formatDate(d) {
if (!d) return "—";
return d.toISOString().slice(0, 10);
}
function formatDays(n) {
if (n === 0) return "<1 day";
if (n < 30) return n + "d";
if (n < 365) return Math.round(n / 30) + "mo";
return (n / 365).toFixed(1) + "y";
}
// Enrich flags
FLAGS.forEach(f => {
f.addedDate = parseDate(f.added);
f.removedDate = parseDate(f.removed);
f.active = f.removed === null;
f.lifespan = daysSince(f.addedDate || TIMELINE_START, f.removedDate || TODAY);
});
// Stats
const totalFlags = FLAGS.length;
const activeFlags = FLAGS.filter(f => f.active).length;
const removedFlags = FLAGS.filter(f => !f.active).length;
const avgLifespan = Math.round(FLAGS.filter(f => !f.active).reduce((s, f) => s + f.lifespan, 0) / removedFlags);
document.getElementById("stats").innerHTML = `
<div class="stat-card blue"><div class="num">${totalFlags}</div><div class="label">Total flags tracked</div></div>
<div class="stat-card green"><div class="num">${activeFlags}</div><div class="label">Currently active</div></div>
<div class="stat-card red"><div class="num">${removedFlags}</div><div class="label">Removed</div></div>
<div class="stat-card purple"><div class="num">${formatDays(avgLifespan)}</div><div class="label">Avg lifespan (removed)</div></div>
`;
// ---- Canvas chart ----
const canvas = document.getElementById("chart");
const ctx = canvas.getContext("2d");
let currentChart = "active";
function getMonths() {
const months = [];
let d = new Date(TIMELINE_START);
while (d < TIMELINE_END) {
months.push(new Date(d));
d.setMonth(d.getMonth() + 1);
}
return months;
}
function computeActivePerMonth() {
const months = getMonths();
return months.map(m => {
const end = new Date(m); end.setMonth(end.getMonth() + 1);
const mid = new Date((m.getTime() + end.getTime()) / 2);
let count = 0;
FLAGS.forEach(f => {
const start = f.addedDate || TIMELINE_START;
const stop = f.removedDate || TODAY;
if (start <= mid && stop >= mid) count++;
});
return count;
});
}
function computeAdditionsRemovals() {
const months = getMonths();
const additions = months.map(() => 0);
const removals = months.map(() => 0);
FLAGS.forEach(f => {
if (f.addedDate) {
const mi = months.findIndex((m, i) => {
const next = new Date(m); next.setMonth(next.getMonth() + 1);
return f.addedDate >= m && f.addedDate < next;
});
if (mi >= 0) additions[mi]++;
}
if (f.removedDate) {
const mi = months.findIndex((m, i) => {
const next = new Date(m); next.setMonth(next.getMonth() + 1);
return f.removedDate >= m && f.removedDate < next;
});
if (mi >= 0) removals[mi]++;
}
});
return { additions, removals };
}
function computeAvgLifespanPerMonth() {
const months = getMonths();
return months.map((m, i) => {
const next = new Date(m); next.setMonth(next.getMonth() + 1);
const removed = FLAGS.filter(f => f.removedDate && f.removedDate >= m && f.removedDate < next);
if (removed.length === 0) return 0;
return Math.round(removed.reduce((s, f) => s + f.lifespan, 0) / removed.length);
});
}
function drawChart() {
const dpr = window.devicePixelRatio || 1;
const rect = canvas.parentElement.getBoundingClientRect();
const w = rect.width - 40;
const h = 300;
canvas.width = w * dpr;
canvas.height = h * dpr;
canvas.style.width = w + "px";
canvas.style.height = h + "px";
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.clearRect(0, 0, w, h);
const months = getMonths();
const labels = months.map(m => m.toLocaleDateString("en", { month: "short", year: "2-digit" }));
const pad = { top: 20, right: 20, bottom: 40, left: 50 };
const cw = w - pad.left - pad.right;
const ch = h - pad.top - pad.bottom;
function drawLine(data, color, maxVal) {
const stepX = cw / (data.length - 1);
ctx.beginPath();
ctx.strokeStyle = color;
ctx.lineWidth = 2.5;
ctx.lineJoin = "round";
data.forEach((v, i) => {
const x = pad.left + i * stepX;
const y = pad.top + ch - (v / maxVal) * ch;
i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
});
ctx.stroke();
// dots
data.forEach((v, i) => {
const x = pad.left + i * stepX;
const y = pad.top + ch - (v / maxVal) * ch;
ctx.beginPath();
ctx.arc(x, y, 3, 0, Math.PI * 2);
ctx.fillStyle = color;
ctx.fill();
});
}
function drawBars(data1, data2, color1, color2, maxVal) {
const barW = Math.max(4, (cw / data1.length) * 0.35);
const stepX = cw / data1.length;
data1.forEach((v, i) => {
const x = pad.left + i * stepX + stepX / 2 - barW - 1;
const bh = (v / maxVal) * ch;
ctx.fillStyle = color1;
ctx.fillRect(x, pad.top + ch - bh, barW, bh);
});
data2.forEach((v, i) => {
const x = pad.left + i * stepX + stepX / 2 + 1;
const bh = (v / maxVal) * ch;
ctx.fillStyle = color2;
ctx.fillRect(x, pad.top + ch - bh, barW, bh);
});
}
// Grid
ctx.strokeStyle = "#21262d";
ctx.lineWidth = 1;
for (let i = 0; i <= 5; i++) {
const y = pad.top + (ch / 5) * i;
ctx.beginPath(); ctx.moveTo(pad.left, y); ctx.lineTo(w - pad.right, y); ctx.stroke();
}
// X labels
ctx.fillStyle = "#8b949e";
ctx.font = "11px -apple-system, sans-serif";
ctx.textAlign = "center";
const labelStep = months.length > 18 ? 3 : months.length > 12 ? 2 : 1;
labels.forEach((l, i) => {
if (i % labelStep !== 0) return;
const stepX = currentChart === "additions" ? cw / months.length : cw / (months.length - 1);
const x = pad.left + i * stepX + (currentChart === "additions" ? stepX / 2 : 0);
ctx.save();
ctx.translate(x, h - 5);
ctx.rotate(-0.5);
ctx.fillText(l, 0, 0);
ctx.restore();
});
if (currentChart === "active") {
const data = computeActivePerMonth();
const maxVal = Math.max(...data) * 1.15;
// Y labels
for (let i = 0; i <= 5; i++) {
const v = Math.round((maxVal / 5) * (5 - i));
ctx.fillStyle = "#8b949e";
ctx.textAlign = "right";
ctx.fillText(v, pad.left - 8, pad.top + (ch / 5) * i + 4);
}
drawLine(data, "#58a6ff", maxVal);
} else if (currentChart === "additions") {
const { additions, removals } = computeAdditionsRemovals();
const maxVal = Math.max(...additions, ...removals) * 1.15;
for (let i = 0; i <= 5; i++) {
const v = Math.round((maxVal / 5) * (5 - i));
ctx.fillStyle = "#8b949e";
ctx.textAlign = "right";
ctx.fillText(v, pad.left - 8, pad.top + (ch / 5) * i + 4);
}
drawBars(additions, removals, "#3fb950", "#f85149", maxVal);
// legend
ctx.fillStyle = "#3fb950"; ctx.fillRect(w - 170, 10, 12, 12);
ctx.fillStyle = "#8b949e"; ctx.textAlign = "left"; ctx.fillText("Added", w - 154, 21);
ctx.fillStyle = "#f85149"; ctx.fillRect(w - 100, 10, 12, 12);
ctx.fillStyle = "#8b949e"; ctx.fillText("Removed", w - 84, 21);
} else if (currentChart === "lifespan") {
const data = computeAvgLifespanPerMonth();
const maxVal = Math.max(...data) * 1.15 || 1;
for (let i = 0; i <= 5; i++) {
const v = Math.round((maxVal / 5) * (5 - i));
ctx.fillStyle = "#8b949e";
ctx.textAlign = "right";
ctx.fillText(v + "d", pad.left - 8, pad.top + (ch / 5) * i + 4);
}
drawLine(data, "#bc8cff", maxVal);
}
}
document.querySelectorAll(".chart-tab").forEach(tab => {
tab.addEventListener("click", () => {
document.querySelectorAll(".chart-tab").forEach(t => t.classList.remove("active"));
tab.classList.add("active");
currentChart = tab.dataset.chart;
drawChart();
});
});
window.addEventListener("resize", drawChart);
drawChart();
// ---- Gantt ----
const tooltip = document.getElementById("tooltip");
function buildGanttHeader() {
const header = document.getElementById("ganttHeader");
let html = '<div class="label-col">Flag Name</div><div class="timeline-col">';
const months = getMonths();
months.forEach(m => {
const label = m.toLocaleDateString("en", { month: "short", year: "2-digit" });
html += `<div class="month-label">${label}</div>`;
});
html += '</div>';
header.innerHTML = html;
}
function getFilteredFlags() {
const search = document.getElementById("ganttSearch").value.toLowerCase();
const filter = document.getElementById("ganttFilter").value;
const sort = document.getElementById("ganttSort").value;
let list = FLAGS.filter(f => {
if (search && !f.name.includes(search)) return false;
if (filter === "active" && !f.active) return false;
if (filter === "removed" && f.active) return false;
if (filter === "pre2024" && !f.pre2024) return false;
return true;
});
list.sort((a, b) => {
if (sort === "name") return a.name.localeCompare(b.name);
if (sort === "added") return (a.addedDate || TIMELINE_START) - (b.addedDate || TIMELINE_START);
if (sort === "removed") {
const ar = a.removedDate || new Date("2099-01-01");
const br = b.removedDate || new Date("2099-01-01");
return ar - br;
}
if (sort === "lifespan") return b.lifespan - a.lifespan;
return 0;
});
return list;
}
function buildGanttBody() {
const body = document.getElementById("ganttBody");
const list = getFilteredFlags();
let html = "";
list.forEach(f => {
const start = f.addedDate || TIMELINE_START;
const end = f.removedDate || TODAY;
const leftPct = ((start - TIMELINE_START) / (TIMELINE_END - TIMELINE_START)) * 100;
const widthPct = ((end - start) / (TIMELINE_END - TIMELINE_START)) * 100;
const cls = f.active ? "active" : "removed";
html += `<div class="gantt-row">
<div class="label-col" title="${f.name}">${f.name}</div>
<div class="timeline-col">
<div class="gantt-bar ${cls}"
style="left:${leftPct}%;width:${Math.max(0.2, widthPct)}%"
data-name="${f.name}"
data-added="${f.added || 'before 2024'}"
data-removed="${f.removed || 'still active'}"
data-lifespan="${formatDays(f.lifespan)}"
data-active="${f.active}">
</div>
</div>
</div>`;
});
body.innerHTML = html;
}
// Tooltip for gantt bars
document.getElementById("ganttBody").addEventListener("mousemove", e => {
const bar = e.target.closest(".gantt-bar");
if (!bar) { tooltip.style.display = "none"; return; }
const active = bar.dataset.active === "true";
tooltip.innerHTML = `
<div class="flag-name">${bar.dataset.name}</div>
<div class="dates">Added: ${bar.dataset.added}<br>Removed: ${bar.dataset.removed}</div>
<div class="dates">Lifespan: ${bar.dataset.lifespan}</div>
<div class="status ${active ? 'active' : 'removed'}">${active ? 'Still active' : 'Removed'}</div>
`;
tooltip.style.display = "block";
tooltip.style.left = Math.min(e.clientX + 12, window.innerWidth - 340) + "px";
tooltip.style.top = (e.clientY - 80) + "px";
});
document.getElementById("ganttBody").addEventListener("mouseleave", () => {
tooltip.style.display = "none";
});
["ganttSearch", "ganttFilter", "ganttSort"].forEach(id => {
document.getElementById(id).addEventListener("input", buildGanttBody);
document.getElementById(id).addEventListener("change", buildGanttBody);
});
buildGanttHeader();
buildGanttBody();
// ---- Table ----
let tableSortCol = "added";
let tableSortAsc = true;
function buildTable() {
const search = document.getElementById("tableSearch").value.toLowerCase();
const filter = document.getElementById("tableFilter").value;
const tbody = document.getElementById("tableBody");
let list = FLAGS.filter(f => {
if (search && !f.name.includes(search)) return false;
if (filter === "active" && !f.active) return false;
if (filter === "removed" && f.active) return false;
return true;
});
list.sort((a, b) => {
let cmp = 0;
if (tableSortCol === "name") cmp = a.name.localeCompare(b.name);
else if (tableSortCol === "added") cmp = (a.addedDate || TIMELINE_START) - (b.addedDate || TIMELINE_START);
else if (tableSortCol === "removed") {
const ar = a.removedDate || new Date("2099-01-01");
const br = b.removedDate || new Date("2099-01-01");
cmp = ar - br;
}
else if (tableSortCol === "lifespan") cmp = a.lifespan - b.lifespan;
else if (tableSortCol === "status") cmp = (a.active ? 1 : 0) - (b.active ? 1 : 0);
return tableSortAsc ? cmp : -cmp;
});
tbody.innerHTML = list.map(f => `
<tr>
<td class="flag-name">${f.name}</td>
<td>${f.added || '<span style="color:#8b949e">before 2024</span>'}</td>
<td>${f.removed || '<span style="color:#3fb950">still active</span>'}</td>
<td class="lifespan">${formatDays(f.lifespan)}</td>
<td><span class="badge ${f.active ? 'active' : 'removed'}">${f.active ? 'Active' : 'Removed'}</span></td>
</tr>
`).join("");
}
document.querySelectorAll("th[data-sort]").forEach(th => {
th.addEventListener("click", () => {
const col = th.dataset.sort;
if (tableSortCol === col) tableSortAsc = !tableSortAsc;
else { tableSortCol = col; tableSortAsc = true; }
document.querySelectorAll("th .sort-arrow").forEach(s => s.textContent = "");
th.querySelector(".sort-arrow").textContent = tableSortAsc ? " \u25B2" : " \u25BC";
buildTable();
});
});
["tableSearch", "tableFilter"].forEach(id => {
document.getElementById(id).addEventListener("input", buildTable);
document.getElementById(id).addEventListener("change", buildTable);
});
buildTable();
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment