Download index.html from Glint-Research/Tiny-ML-Leaderboard: direct link, hf CLI and curl.
- Browser
- Download file 77 kB
-
https://huggingface.co/spaces/Glint-Research/Tiny-ML-Leaderboard/resolve/bcc6ee9b729db099d6c7b647b808acbd583a87e9/index.html
- Command line
-
hf download hf://spaces/Glint-Research/Tiny-ML-Leaderboard@bcc6ee9b729db099d6c7b647b808acbd583a87e9/index.html
-
curl -L -o index.html https://huggingface.co/spaces/Glint-Research/Tiny-ML-Leaderboard/resolve/bcc6ee9b729db099d6c7b647b808acbd583a87e9/index.html
77 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Tiny-ML Leaderboard</title> | |
| <script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-date-fns@3"></script> | |
| <style> | |
| :root { | |
| --bg: #0d1117; | |
| --bg-warm: #161b22; | |
| --card: #161b22; | |
| --card-hover: #1c2129; | |
| --border: #30363d; | |
| --border-light: #21262d; | |
| --text: #c9d1d9; | |
| --text-secondary: #8b949e; | |
| --text-muted: #484f58; | |
| --accent: #58a6ff; | |
| --green: #3fb950; | |
| --orange: #d29922; | |
| --shadow-sm: 0 1px 3px rgba(0,0,0,0.3); | |
| --shadow-md: 0 4px 12px rgba(0,0,0,0.35); | |
| --radius: 12px; | |
| --radius-sm: 8px; | |
| --radius-xs: 6px; | |
| --transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); | |
| --glintresearch: #3fb950; | |
| --dreamw: #6a00ff; | |
| --supralabs: #58a6ff; | |
| --axiomiclabs: #c2b6ff; | |
| --mihaipopa: #93c6aa; | |
| --cromia: #ffffff; | |
| --wop: #ff9b50; | |
| --GODELEV: #1a56db; | |
| --finnianx: #06b6d4; | |
| --ivmelabs: #ff0000; | |
| --rtc: #e8a87c; | |
| --huggingface: #ffcc00; | |
| --facebook: #1877f2; | |
| --openai: #10a37f; | |
| --eleutherai: #ef4444; | |
| --stentor: #ff6bcb; | |
| --eclipsesenpai: #06b6d4; | |
| --minimalabs: #4961e6; | |
| --sandroeth: #84cc16; | |
| --thingai: #b45309; | |
| --veyraai: #d45672; | |
| --fromzero: #d2b48c; | |
| --joelhenwang: #e5e7eb; | |
| --jhuclsp: #2563eb; | |
| --liodonai: #6366f1; | |
| --smalldoge: #ec4899; | |
| --quazim0t0: #0ea5e9; | |
| --small56ai: #22c55e; | |
| --lhtechai: #f97316; | |
| --56m: #a855f7; | |
| } | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| html { scroll-behavior: smooth; } | |
| body { | |
| font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif; | |
| background: var(--bg); | |
| color: var(--text); | |
| line-height: 1.5; | |
| -webkit-font-smoothing: antialiased; | |
| } | |
| .shell { | |
| max-width: 100%; | |
| margin: 0 auto; | |
| padding: 1.25rem 1.75rem; | |
| } | |
| .welcome { padding: 0.5rem 0 1rem; } | |
| .welcome h1 { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| letter-spacing: -0.02em; | |
| margin-bottom: 4px; | |
| } | |
| .welcome p { color: var(--text-secondary); font-size: 0.95rem; } | |
| .stat-row { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); | |
| gap: 10px; | |
| margin-bottom: 0.9rem; | |
| } | |
| .stat-pill { | |
| background: var(--card); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius-sm); | |
| padding: 0.6rem 0.9rem; | |
| transition: box-shadow var(--transition), transform var(--transition); | |
| } | |
| .stat-pill:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); } | |
| .stat-pill .label { | |
| font-size: 0.72rem; font-weight: 600; text-transform: uppercase; | |
| letter-spacing: 0.06em; color: var(--text-muted); margin-bottom: 3px; | |
| } | |
| .stat-pill .value { font-size: 1.15rem; font-weight: 700; letter-spacing: -0.02em; } | |
| .stat-pill .sub { font-size: 0.75rem; color: var(--text-secondary); margin-top: 1px; } | |
| .info-banner { | |
| background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-sm); | |
| padding: 0.7rem 1rem; margin-bottom: 0.9rem; font-size: 0.84rem; line-height: 1.55; | |
| display: flex; align-items: flex-start; gap: 10px; | |
| } | |
| .info-banner svg { width: 18px; height: 18px; flex-shrink: 0; margin-top: 2px; color: var(--accent); } | |
| .info-banner a { color: var(--accent); text-decoration: none; } | |
| .info-banner a:hover { text-decoration: underline; } | |
| .info-banner.clickable { cursor: pointer; user-select: none; } | |
| .info-banner.clickable:hover { border-color: var(--accent); } | |
| .banner-expand { | |
| max-height: 0; overflow: hidden; | |
| transition: max-height 0.35s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s ease, margin 0.3s ease; | |
| opacity: 0; margin-top: 0; | |
| } | |
| .banner-expand.open { | |
| max-height: 300px; opacity: 1; margin-top: 10px; | |
| } | |
| .banner-expand-inner { | |
| padding: 0.85rem 1rem; background: var(--bg); border-radius: var(--radius-xs); | |
| border: 1px solid var(--border-light); font-size: 0.84rem; color: var(--text-secondary); line-height: 1.65; | |
| } | |
| .banner-expand-inner code { | |
| background: rgba(88,166,255,0.1); padding: 1px 5px; border-radius: 3px; | |
| font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.82rem; color: var(--accent); | |
| } | |
| .banner-hint { | |
| font-size: 0.75rem; color: var(--text-muted); margin-left: 6px; | |
| transition: transform 0.25s ease; display: inline-block; | |
| } | |
| .banner-hint.rotated { transform: rotate(180deg); } | |
| .section { margin-bottom: 1.1rem; } | |
| .tabbar { | |
| display: flex; gap: 2px; padding: 3px; margin-bottom: 14px; | |
| background: var(--bg-warm); border: 1px solid var(--border); | |
| border-radius: 100px; width: fit-content; max-width: 100%; overflow-x: auto; | |
| } | |
| .tabbar .tab { | |
| border: none; cursor: pointer; padding: 7px 18px; border-radius: 100px; | |
| font-family: inherit; font-size: 0.82rem; font-weight: 600; letter-spacing: -0.01em; | |
| color: var(--text-secondary); background: transparent; white-space: nowrap; | |
| transition: all var(--transition); | |
| } | |
| .tabbar .tab:hover { color: var(--text); background: var(--card-hover); } | |
| .tabbar .tab.active { background: var(--accent); color: #fff; } | |
| [hidden] { display: none ; } | |
| .timeline-toolbar { | |
| display: flex; align-items: center; gap: 6px; | |
| margin-bottom: 10px; | |
| overflow-x: auto; -webkit-overflow-scrolling: touch; | |
| scrollbar-width: none; | |
| padding-bottom: 2px; | |
| } | |
| .timeline-toolbar::-webkit-scrollbar { display: none; } | |
| .tl-sep { | |
| width: 1px; height: 18px; background: var(--border); | |
| margin: 0 4px; flex-shrink: 0; | |
| } | |
| .timeline { | |
| background: var(--card); | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius); | |
| overflow: hidden; | |
| } | |
| .tl-month { | |
| display: flex; | |
| align-items: center; | |
| gap: 12px; | |
| padding: 10px 16px; | |
| background: var(--bg-warm); | |
| border-bottom: 1px solid var(--border); | |
| font-size: 0.78rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--text-secondary); | |
| position: sticky; | |
| top: 0; | |
| z-index: 1; | |
| } | |
| .tl-month .tl-month-count { | |
| margin-left: auto; | |
| font-weight: 500; | |
| text-transform: none; | |
| letter-spacing: 0; | |
| color: var(--text-muted); | |
| font-size: 0.74rem; | |
| } | |
| .tl-row { | |
| display: grid; | |
| grid-template-columns: 92px 1fr auto auto; | |
| align-items: center; | |
| gap: 14px; | |
| padding: 11px 16px; | |
| border-bottom: 1px solid var(--border-light); | |
| transition: background var(--transition); | |
| } | |
| .tl-row:last-child { border-bottom: none; } | |
| .tl-row:hover { background: var(--card-hover); } | |
| .tl-date { | |
| font-variant-numeric: tabular-nums; | |
| font-size: 0.8rem; | |
| color: var(--text-muted); | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .tl-date::before { | |
| content: ''; | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: var(--org-color, var(--text-muted)); | |
| flex-shrink: 0; | |
| box-shadow: 0 0 0 3px rgba(255,255,255,0.04); | |
| } | |
| .tl-name { | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| min-width: 0; | |
| } | |
| .tl-name a { | |
| color: var(--text); | |
| text-decoration: none; | |
| font-weight: 600; | |
| font-size: 0.88rem; | |
| letter-spacing: -0.01em; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .tl-name a:hover { color: var(--accent); } | |
| .tl-params { | |
| font-size: 0.75rem; | |
| color: var(--text-muted); | |
| font-variant-numeric: tabular-nums; | |
| white-space: nowrap; | |
| } | |
| .tl-org { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 5px; | |
| padding: 2px 9px; | |
| border-radius: 4px; | |
| font-size: 0.72rem; | |
| font-weight: 600; | |
| white-space: nowrap; | |
| } | |
| @media (max-width: 640px) { | |
| .tl-row { | |
| grid-template-columns: 78px 1fr; | |
| grid-template-areas: "date name" "date extras"; | |
| row-gap: 4px; | |
| } | |
| .tl-date { grid-area: date; } | |
| .tl-name { grid-area: name; } | |
| .tl-params { grid-area: extras; justify-self: end; } | |
| .tl-org { grid-area: extras; justify-self: end; } | |
| } | |
| .tl-empty { | |
| padding: 24px 16px; | |
| text-align: center; | |
| color: var(--text-muted); | |
| font-size: 0.84rem; | |
| } | |
| .section-head { | |
| display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.75rem; | |
| } | |
| .section-head h2 { font-size: 1.15rem; font-weight: 700; letter-spacing: -0.02em; } | |
| .section-head .badge { | |
| font-size: 0.72rem; font-weight: 600; padding: 3px 10px; border-radius: 100px; | |
| background: var(--bg-warm); color: var(--text-secondary); border: 1px solid var(--border); | |
| } | |
| .section-head .head-right { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } | |
| .search { | |
| background: var(--bg-warm); border: 1px solid var(--border); border-radius: 100px; | |
| padding: 6px 14px; color: var(--text); font-family: inherit; font-size: 0.78rem; | |
| width: 210px; outline: none; transition: border-color var(--transition); | |
| } | |
| .search::placeholder { color: var(--text-muted); } | |
| .search:focus { border-color: var(--accent); } | |
| .sort-control { | |
| display: inline-flex; align-items: center; gap: 6px; | |
| background: var(--bg-warm); border: 1px solid var(--border); | |
| border-radius: 100px; padding: 2px 4px 2px 12px; | |
| font-size: 0.68rem; font-weight: 600; color: var(--text-muted); | |
| text-transform: uppercase; letter-spacing: 0.05em; | |
| } | |
| .sort-control select { | |
| background: transparent; border: none; color: var(--text); | |
| font-size: 0.76rem; font-weight: 600; text-transform: none; letter-spacing: 0; | |
| padding: 4px 26px 4px 8px; border-radius: 100px; cursor: pointer; outline: none; | |
| appearance: none; -webkit-appearance: none; -moz-appearance: none; | |
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%238b949e' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); | |
| background-repeat: no-repeat; background-position: right 8px center; | |
| transition: background-color var(--transition); | |
| } | |
| .sort-control select:hover { background-color: var(--bg); } | |
| .sort-control select:focus { box-shadow: 0 0 0 2px rgba(88, 166, 255, 0.3); } | |
| .sort-control select option { background: var(--bg-warm); color: var(--text); } | |
| .banner-expand.open { max-height: 340px; } | |
| .table-wrap { | |
| background: var(--card); border: 1px solid var(--border); | |
| border-radius: var(--radius); overflow: hidden; | |
| } | |
| .table-toolbar { | |
| display: flex; align-items: center; gap: 6px; padding: 8px 12px; | |
| border-bottom: 1px solid var(--border-light); overflow-x: auto; -webkit-overflow-scrolling: touch; | |
| } | |
| .filter-chip { | |
| display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; | |
| border-radius: 100px; font-size: 0.74rem; font-weight: 500; color: var(--text-secondary); | |
| background: var(--bg); border: 1px solid var(--border); cursor: pointer; | |
| transition: all var(--transition); white-space: nowrap; user-select: none; | |
| } | |
| .filter-chip:hover { border-color: var(--accent); color: var(--text); } | |
| .filter-chip.active { background: var(--accent); border-color: var(--accent); color: #fff; } | |
| .filter-chip .dot { width: 7px; height: 7px; border-radius: 50%; } | |
| .table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; max-height: 78vh; } | |
| table { width: 100%; border-collapse: collapse; font-size: 0.8rem; } | |
| thead { position: sticky; top: 0; z-index: 2; } | |
| th { | |
| background: #1c2129; padding: 6px 10px; text-align: left; font-weight: 600; | |
| font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; | |
| color: var(--text-muted); border-bottom: 1px solid var(--border); white-space: nowrap; | |
| } | |
| td { | |
| padding: 5px 10px; border-bottom: 1px solid var(--border-light); | |
| transition: background var(--transition); | |
| line-height: 1.3; | |
| } | |
| tr:last-child td { border-bottom: none; } | |
| tbody tr { transition: background var(--transition); } | |
| .lb-row.hover td { background: var(--bg-warm); } | |
| .cell-rank { width: 38px; text-align: center; font-weight: 700; color: var(--text-muted); font-size: 0.78rem; } | |
| .cell-rank .medal { font-size: 1rem; } | |
| .cell-rank.rank-1 { color: #ffd700; } | |
| .cell-rank.rank-2 { color: #c0c0c0; } | |
| .cell-rank.rank-3 { color: #cd7f32; } | |
| .cell-model { min-width: 140px; } | |
| .model-name { font-weight: 600; letter-spacing: -0.01em; font-size: 0.82rem; } | |
| .model-params { font-size: 0.7rem; color: var(--text-muted); margin-top: 1px; } | |
| .org-tag { | |
| display: inline-flex; align-items: center; gap: 4px; padding: 1px 7px; | |
| border-radius: 4px; font-size: 0.7rem; font-weight: 600; white-space: nowrap; | |
| } | |
| .org-tag .org-dot { width: 6px; height: 6px; border-radius: 50%; } | |
| .cell-metric { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; min-width: 68px; font-size: 0.78rem; } | |
| .info-icon { cursor: help; opacity: 0.5; font-size: 0.85em; vertical-align: middle; } | |
| .info-icon:hover { opacity: 1; } | |
| .metric-val { font-weight: 600; font-size: 0.8rem; } | |
| .metric-na { color: var(--text-muted); font-style: italic; font-weight: 400; font-size: 0.72rem; } | |
| .best { color: var(--green); font-weight: 700; } | |
| .cell-links { white-space: nowrap; } | |
| .cell-links a { | |
| display: inline-flex; align-items: center; gap: 3px; padding: 1px 6px; | |
| border-radius: var(--radius-xs); font-size: 0.7rem; font-weight: 500; | |
| color: var(--accent); text-decoration: none; transition: all var(--transition); | |
| } | |
| .cell-links a:hover { background: rgba(88,166,255,0.1); } | |
| .cell-tokens { font-size: 0.76rem; color: var(--text-secondary); white-space: nowrap; } | |
| .cell-date { font-size: 0.74rem; color: var(--text-muted); white-space: nowrap; } | |
| .chart-grid { | |
| display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 1.25rem; | |
| } | |
| .chart-card { | |
| background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); | |
| padding: 1rem; transition: box-shadow var(--transition); | |
| } | |
| .chart-card:hover { box-shadow: var(--shadow-sm); } | |
| .chart-card.full { grid-column: 1 / -1; } | |
| .chart-card h3 { font-size: 0.85rem; font-weight: 600; margin-bottom: 3px; } | |
| .chart-card .chart-sub { font-size: 0.72rem; color: var(--text-muted); margin-bottom: 8px; } | |
| .metric-switch { display: inline-flex; gap: 2px; padding: 3px; background: var(--bg-warm); | |
| border: 1px solid var(--border); border-radius: 100px; } | |
| .metric-chip { | |
| border: none; cursor: pointer; padding: 5px 14px; border-radius: 100px; | |
| font-family: inherit; font-size: 0.76rem; font-weight: 600; letter-spacing: -0.01em; | |
| color: var(--text-secondary); background: transparent; transition: all var(--transition); | |
| } | |
| .metric-chip:hover { color: var(--text); background: var(--card-hover); } | |
| .metric-chip.active { background: var(--accent); color: #fff; } | |
| .chart-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; | |
| flex-wrap: wrap; margin-bottom: 14px; } | |
| .chart-scroll { position: relative; overflow-y: auto; max-height: 70vh; } | |
| .legend-bar { display: flex; flex-wrap: wrap; gap: 10px 12px; justify-content: flex-end; max-width: 62%; } | |
| .legend-bar .legend-item { display: flex; align-items: center; gap: 6px; font-size: 0.76rem; color: var(--text-secondary); } | |
| .legend-bar .ldot { width: 8px; height: 8px; border-radius: 50%; } | |
| .eff-note { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 6px; font-size: 0.7rem; color: var(--text-muted); } | |
| .eff-note span { display: flex; align-items: center; gap: 5px; } | |
| .eff-note .line-sample { width: 18px; height: 2px; border-radius: 1px; } | |
| .timeline-bubble-wrap { position: relative; } | |
| .timeline-custom-tooltip { | |
| position: absolute; pointer-events: none; background: #1c2129; | |
| border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px; | |
| font-size: 0.78rem; color: var(--text); box-shadow: var(--shadow-md); | |
| opacity: 0; transition: opacity 0.15s ease; z-index: 10; white-space: nowrap; | |
| } | |
| .timeline-custom-tooltip.visible { opacity: 1; } | |
| .timeline-custom-tooltip .tt-name { font-weight: 600; margin-bottom: 2px; } | |
| .timeline-custom-tooltip .tt-val { color: var(--text-secondary); } | |
| .cta-card { | |
| background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); | |
| padding: 1.25rem; display: flex; align-items: center; justify-content: space-between; | |
| gap: 1rem; margin-bottom: 1.5rem; flex-wrap: wrap; | |
| } | |
| .cta-card h3 { font-size: 1rem; font-weight: 700; margin-bottom: 3px; } | |
| .cta-card p { font-size: 0.84rem; color: var(--text-secondary); max-width: 520px; line-height: 1.55; } | |
| .cta-btn { | |
| display: inline-flex; align-items: center; gap: 6px; padding: 9px 18px; | |
| border-radius: var(--radius-sm); background: var(--accent); color: #fff; | |
| font-size: 0.84rem; font-weight: 600; text-decoration: none; border: none; | |
| cursor: pointer; transition: all var(--transition); flex-shrink: 0; | |
| } | |
| .cta-btn:hover { opacity: 0.88; transform: translateY(-1px); box-shadow: var(--shadow-md); } | |
| footer { | |
| margin-top: 1rem; padding: 1.25rem 0; border-top: 1px solid var(--border); | |
| font-size: 0.78rem; color: var(--text-muted); text-align: center; line-height: 1.6; | |
| } | |
| footer a { color: var(--accent); text-decoration: none; } | |
| footer a:hover { text-decoration: underline; } | |
| @keyframes fadeUp { | |
| from { opacity: 0; transform: translateY(10px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| .anim { animation: fadeUp 0.45s cubic-bezier(0.4,0,0.2,1) both; } | |
| .d1 { animation-delay: .04s; } | |
| .d2 { animation-delay: .08s; } | |
| .d3 { animation-delay: .12s; } | |
| .d4 { animation-delay: .16s; } | |
| .d5 { animation-delay: .20s; } | |
| .d6 { animation-delay: .24s; } | |
| ::-webkit-scrollbar { width: 6px; height: 6px; } | |
| ::-webkit-scrollbar-track { background: transparent; } | |
| ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 100px; } | |
| ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); } | |
| @media (max-width: 1024px) { | |
| .chart-grid { grid-template-columns: 1fr; } | |
| .chart-card.full { grid-column: 1; } | |
| } | |
| @media (max-width: 768px) { | |
| .shell { padding: 1rem; } | |
| .stat-row { grid-template-columns: repeat(2, 1fr); } | |
| .welcome h1 { font-size: 1.4rem; } | |
| table { font-size: 0.76rem; } | |
| th, td { padding: 7px 8px; } | |
| .cta-card { flex-direction: column; align-items: flex-start; } | |
| } | |
| @media (max-width: 480px) { | |
| .stat-row { grid-template-columns: 1fr; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="main-content"> | |
| <div class="shell"> | |
| <div class="welcome anim"> | |
| <h1>Tiny-ML Leaderboard</h1> | |
| <p>Sub-150M parameter language models, same eval harness, transparent methodology.</p> | |
| </div> | |
| <div class="stat-row anim d1" id="stat-row"></div> | |
| <div class="info-banner anim d2 clickable" id="unknown-banner" onclick="toggleUnknownBanner()"> | |
| <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> | |
| <div style="flex:1"> | |
| <div style="display:flex;align-items:center;gap:4px;flex-wrap:wrap"> | |
| <strong>Every tiny LM with verifiable benchmarks</strong> | |
| <span>— ours, our competitors', yours.</span> | |
| <a href="https://huggingface.co/spaces/Glint-Research/Tiny-ML-Leaderboard/discussions" target="_blank" onclick="event.stopPropagation()">Submit a model via PR.</a> | |
| <span class="banner-hint" id="banner-hint">βΌ</span> | |
| </div> | |
| <div class="banner-expand" id="banner-expand"> | |
| <div class="banner-expand-inner"> | |
| <strong>Scoring.</strong> Efficiency (β‘) is the overall benchmark score (average of BLiMP, ARC-Easy and normalised WikiText-2) | |
| times a size bonus, capped on a log scale: the smallest model on the board tops out at <code>1.5Γ</code>, the largest gets <code>1.0Γ</code>. | |
| A tiny model can't out-rank a much larger, better-performing one on parameter count alone.<br> | |
| <strong>Unknown org?</strong> That tag is for makers submitting benchmarks ahead of release — DM <strong>glintresearch</strong> on Discord to have it replaced with your org. | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <nav class="tabbar anim d2" id="tabbar"> | |
| <button class="tab active" data-view="table">Leaderboard</button> | |
| <button class="tab" data-view="charts">Charts</button> | |
| <button class="tab" data-view="timeline">Timeline</button> | |
| <button class="tab" data-view="efficiency">Efficiency</button> | |
| </nav> | |
| <div class="section anim d3 view" id="table-section"> | |
| <div class="section-head"> | |
| <h2>Detailed Results</h2> | |
| <div class="head-right"> | |
| <input class="search" id="model-search" type="search" placeholder="Search models or orgsβ¦" autocomplete="off"> | |
| <span class="badge" id="model-count-badge"></span> | |
| <div class="sort-control"> | |
| <span>Sort</span> | |
| <select id="sort-select" aria-label="Sort leaderboard by"> | |
| <option value="efficiency">Efficiency β‘</option> | |
| <option value="score">Overall Score</option> | |
| <option value="wiki">WikiText-2 byte_ppl</option> | |
| <option value="blimp">BLiMP</option> | |
| <option value="arc">ARC-Easy</option> | |
| <option value="aci">AxiomicLabs ACI</option> | |
| <option value="params">Parameters</option> | |
| <option value="date">Release Date</option> | |
| </select> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="table-wrap"> | |
| <div class="table-toolbar" id="org-filters"></div> | |
| <div class="table-scroll"> | |
| <table> | |
| <thead> | |
| <tr> | |
| <th>#</th> | |
| <th>Model</th> | |
| <th>Org</th> | |
| <th>Params</th> | |
| <th class="cell-metric">Eff. β‘</th> | |
| <th class="cell-metric">WikiText-2 byte_ppl β</th> | |
| <th class="cell-metric">BLiMP β</th> | |
| <th class="cell-metric">ARC-Easy β</th> | |
| <th class="cell-metric">ACI β</th> | |
| <th>Training Tokens</th> | |
| <th>Released</th> | |
| <th>Links</th> | |
| </tr> | |
| </thead> | |
| <tbody id="leaderboard-body"></tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="section anim d4 view" id="timeline-section" hidden> | |
| <div class="section-head"> | |
| <h2>Model Release Timeline</h2> | |
| <span class="badge">Most recent first</span> | |
| </div> | |
| <div class="timeline" id="timeline-list"></div> | |
| </div> | |
| <div class="section anim d5 view" id="charts-section" hidden> | |
| <div class="section-head"> | |
| <h2>Benchmark Overview</h2> | |
| <div class="head-right"> | |
| <div class="metric-switch" id="metric-switch"></div> | |
| </div> | |
| </div> | |
| <div class="chart-card"> | |
| <div class="chart-head"> | |
| <div> | |
| <h3 id="metric-title">BLiMP</h3> | |
| <p class="chart-sub" id="metric-sub">Higher is better</p> | |
| </div> | |
| <div class="legend-bar" id="legend-bar"></div> | |
| </div> | |
| <div class="chart-scroll"><canvas id="metricChart"></canvas></div> | |
| </div> | |
| </div> | |
| <div class="section anim d6 view" id="efficiency-section" hidden> | |
| <div class="section-head"> | |
| <h2>Model Efficiency</h2> | |
| <span class="badge">Leaderboard Score vs Params</span> | |
| </div> | |
| <div class="chart-grid"> | |
| <div class="chart-card full"> | |
| <h3>Parameters vs Leaderboard Score</h3> | |
| <p class="chart-sub">Scatter of each model's overall score vs its parameter count. Points above the dashed threshold line are ≥1σ above the trend. Top 3 marked.</p> | |
| <canvas id="efficiencyChart" style="max-height:400px"></canvas> | |
| <div class="eff-note"> | |
| <span><span class="line-sample" style="border-top:2px dashed rgba(255,200,0,0.4)"></span> Avg trend</span> | |
| <span><span class="line-sample" style="border-top:2px dashed rgba(255,200,0,0.8)"></span> High-efficiency threshold</span> | |
| <span><span class="line-sample" style="background:rgba(255,230,0,0.1);height:8px"></span> Outperforming zone</span> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <footer> | |
| Tiny-ML Leaderboard by <a href="https://huggingface.co/Glint-Research">Glint Research</a>. | |
| Not affiliated with SupraLabs or LH-Tech-AI. | |
| All benchmark data is self-reported by model authors unless otherwise noted. | |
| </footer> | |
| </div> | |
| </div> | |
| <script> | |
| const models = [ | |
| { | |
| name: "GoLLeM-v5 32M", | |
| org: "Fabryka AI", | |
| params: "31.6M", | |
| blimp: 73.77, | |
| arc: 44.44, | |
| wiki: 2.5386, | |
| tokens: "16B", | |
| releaseDate: "2026-09-23", | |
| links: { | |
| card: "https://huggingface.co/SlayerLab/gollem-v5-ckpts" | |
| } | |
| }, | |
| { | |
| name: "GoLLeM-v5 16M", | |
| org: "Fabryka AI", | |
| params: "17.4M", | |
| blimp: 70.53, | |
| arc: 40.91, | |
| wiki: 2.6746, | |
| tokens: "16B", | |
| releaseDate: "2026-09-23", | |
| links: { | |
| card: "https://huggingface.co/SlayerLab/gollem-v5-ckpts" | |
| } | |
| }, | |
| { | |
| name: "Pollock 1.5 Mini LM 128M", | |
| org: "Fabryka AI", | |
| params: "127.43M", | |
| blimp: 78.497, | |
| arc: 47.7273, | |
| wiki: 1.9435, | |
| tokens: "21.50B", | |
| releaseDate: "2026-09-20", | |
| links: { | |
| card: "https://huggingface.co/SlayerLab/pollock-mini-lm-125m" | |
| } | |
| }, | |
| { | |
| name: "JugnuLM-53M", | |
| org: "altslate", | |
| params: "53M", | |
| blimp: 78.14, | |
| arc: 51.43, | |
| wiki: 2.04, | |
| tokens: "12B", | |
| releaseDate: "2026-09-05", | |
| links: { | |
| card: "https://huggingface.co/altslate/JugnuLM-53M" | |
| } | |
| }, | |
| { | |
| name: "JugnuLM-110M-R2+", | |
| org: "altslate", | |
| params: "110M", | |
| blimp: 82.52, | |
| arc: 55.13, | |
| wiki: 1.8735, | |
| tokens: "25B", | |
| releaseDate: "2026-09-19", | |
| links: { | |
| card: "https://huggingface.co/altslate/JugnuLM-110M-R2plus" | |
| } | |
| }, | |
| { | |
| name: "peacebell-v1-148M", | |
| org: "wayneworkman", | |
| params: "148.55M", | |
| blimp: 56.26, | |
| arc: 27.36, | |
| wiki: 6.8841, | |
| tokens: "~35B", | |
| releaseDate: "2026-09-19", | |
| links: { | |
| card: "https://huggingface.co/wayneworkman2012/peacebell-v1-148M" | |
| } | |
| }, | |
| { | |
| name: "Ivme-Conversate-N-v1-Base", | |
| org: "ivmelabs", | |
| params: "9.55M", | |
| blimp: 59.24, | |
| arc: 26.81, | |
| wiki: 4.95, | |
| tokens: "~836M", | |
| releaseDate: "2026-08-08", | |
| links: { | |
| card: "https://huggingface.co/IvmeLabs/Ivme-Conversate-S-v1-Base" | |
| } | |
| }, | |
| { | |
| name: "Glint-2", | |
| org: "glintresearch", | |
| params: "1.71M", | |
| blimp: 66.36, | |
| arc: 36.80, | |
| aci: 48.02, | |
| wiki: 3.09, | |
| tokens: "~300B", | |
| releaseDate: "2026-07-19", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-2" | |
| } | |
| }, | |
| { | |
| name: "MicroSupra-1k", | |
| org: "supralabs", | |
| params: "1K", | |
| blimp: 58.61, | |
| arc: 26.39, | |
| aci: 0.57, | |
| wiki: 11.27, | |
| tokens: "β", | |
| releaseDate: "2026-05-13", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/MicroSupra-1k" | |
| } | |
| }, | |
| { | |
| name: "Glint-0.1", | |
| org: "glintresearch", | |
| params: "1M", | |
| blimp: 46.7, | |
| arc: 21, | |
| wiki: 4106963.13, | |
| tokens: "~100M", | |
| releaseDate: "2026-03-09", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-0.1" | |
| } | |
| }, | |
| { | |
| name: "Supra-Mini-v2", | |
| org: "supralabs", | |
| params: "168K", | |
| blimp: 53.5, | |
| arc: 26.8, | |
| aci: 48.95, | |
| wiki: 7.79, | |
| tokens: "β", | |
| releaseDate: "2026-05-12", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-Mini-v2-0.1M" | |
| } | |
| }, | |
| { | |
| name: "Glint-0.2", | |
| org: "glintresearch", | |
| params: "1M", | |
| blimp: 49.8, | |
| arc: 27, | |
| wiki: 636.4, | |
| tokens: "~100M", | |
| releaseDate: "2026-03-22", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-0.2" | |
| } | |
| }, | |
| { | |
| name: "Glint-0.3", | |
| org: "glintresearch", | |
| params: "1M", | |
| blimp: 47.3, | |
| arc: 25.5, | |
| wiki: 7.87, | |
| tokens: "~100M", | |
| releaseDate: "2026-04-04", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-0.3" | |
| } | |
| }, | |
| { | |
| name: "CinnabarLM 1.4M", | |
| org: "mihaipopa", | |
| params: "1.51M", | |
| blimp: 60.7, | |
| arc: 24.58, | |
| aci: 51.57, | |
| wiki: 4.09, | |
| tokens: "~30M", | |
| releaseDate: "2026-05-19", | |
| links: { | |
| card: "https://huggingface.co/MihaiPopa-1/CinnabarLM-1.4M-Base" | |
| } | |
| }, | |
| { | |
| name: "Glint-0.4", | |
| org: "glintresearch", | |
| params: "1M", | |
| blimp: 58.5, | |
| arc: 31, | |
| wiki: 5.01, | |
| tokens: "10B", | |
| releaseDate: "2026-04-19", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-0.4" | |
| } | |
| }, | |
| { | |
| name: "CinnabarLM 1.5M", | |
| org: "mihaipopa", | |
| params: "1.71M", | |
| blimp: 60.51, | |
| arc: 26.68, | |
| aci: 51.28, | |
| wiki: 4.23, | |
| tokens: "~50M", | |
| releaseDate: "2026-05-19", | |
| links: { | |
| card: "https://huggingface.co/MihaiPopa-1/CinnabarLM-1.5M-Base" | |
| } | |
| }, | |
| { | |
| name: "PotentSulfurLM 500K", | |
| org: "mihaipopa", | |
| params: "587K", | |
| blimp: 59.01, | |
| arc: 27.06, | |
| aci: 51.40, | |
| wiki: 4.52, | |
| tokens: "~200M", | |
| releaseDate: "2026-05-27", | |
| links: { | |
| card: "https://huggingface.co/MihaiPopa-1/PotentSulfurLM-500K-Base" | |
| } | |
| }, | |
| { | |
| name: "MicroLM2-1M", | |
| org: "cromia", | |
| params: "1.71M", | |
| blimp: 54.2, | |
| arc: 27.4, | |
| aci: 49.54, | |
| wiki: 4.82, | |
| tokens: "~4.5B", | |
| releaseDate: "2026-05-22", | |
| links: { | |
| card: "https://huggingface.co/CromIA/MicroLM2-1M" | |
| } | |
| }, | |
| { | |
| name: "Glint-1", | |
| org: "glintresearch", | |
| params: "1M", | |
| blimp: 61.2, | |
| arc: 32, | |
| wiki: 4.45, | |
| tokens: "100B", | |
| releaseDate: "2026-05-02", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-1" | |
| } | |
| }, | |
| { | |
| name: "Supra-Mini-v3", | |
| org: "supralabs", | |
| params: "468K", | |
| blimp: 55.3, | |
| arc: 27.3, | |
| aci: 48.96, | |
| wiki: 4.49, | |
| tokens: "β", | |
| releaseDate: "2026-05-14", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-Mini-v3-0.5M" | |
| } | |
| }, | |
| { | |
| name: "Cosmos-T-80M", | |
| org: "wop", | |
| params: "79.7M", | |
| blimp: 50.47, | |
| arc: 27.82, | |
| aci: 49.77, | |
| wiki: 12.42, | |
| tokens: "~21M", | |
| releaseDate: "2026-05-30", | |
| links: { | |
| card: "https://huggingface.co/wop/Cosmos-T-80M" | |
| } | |
| }, | |
| { | |
| name: "Cosmos-T2-80M-Test", | |
| org: "wop", | |
| params: "87.60M", | |
| blimp: 57.61, | |
| arc: 25, | |
| aci: 49.50, | |
| wiki: 11.24, | |
| tokens: "~18M", | |
| releaseDate: "2026-05-31", | |
| links: { | |
| card: "https://huggingface.co/wop/Cosmos-T2-80M-Test" | |
| } | |
| }, | |
| { | |
| name: "Supra-Mini-v4", | |
| org: "supralabs", | |
| params: "2.62M", | |
| blimp: 60.7, | |
| arc: 31.5, | |
| aci: 50.42, | |
| wiki: 3.17, | |
| tokens: "β", | |
| releaseDate: "2026-05-14", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-Mini-v4-2M" | |
| } | |
| }, | |
| { | |
| name: "CinnabarLM 4M", | |
| org: "mihaipopa", | |
| params: "4.23M", | |
| blimp: 62.87, | |
| arc: 27.36, | |
| aci: 50.99, | |
| wiki: 3.77, | |
| tokens: "~80M", | |
| releaseDate: "2026-05-05", | |
| links: { | |
| card: "https://huggingface.co/MihaiPopa-1/CinnabarLM-4M-Base" | |
| } | |
| }, | |
| { | |
| name: "Cosmos-T2-Accelerate-beta", | |
| org: "wop", | |
| params: "5.03M", | |
| blimp: 54.3, | |
| arc: 26.3, | |
| aci: 48.40, | |
| wiki: 6.26, | |
| tokens: "~22M", | |
| releaseDate: "2026-06-02", | |
| links: { | |
| card: "https://huggingface.co/wop/Cosmos-T2-Accelerate-beta" | |
| } | |
| }, | |
| { | |
| name: "Cosmos-T2A-low", | |
| org: "wop", | |
| params: "9.96M", | |
| blimp: 47.8, | |
| arc: 31, | |
| aci: 49.54, | |
| wiki: 5.31, | |
| tokens: "~46.7M", | |
| releaseDate: "2026-06-04", | |
| links: { | |
| card: "https://huggingface.co/wop/Cosmos-T2A-low" | |
| } | |
| }, | |
| { | |
| name: "Cosmos-T2-Accelerate-Beta2", | |
| org: "wop", | |
| params: "9.96M", | |
| blimp: 69, | |
| arc: 28, | |
| aci: 50.21, | |
| wiki: 6.72, | |
| tokens: "~10M", | |
| releaseDate: "2026-06-03", | |
| links: { | |
| card: "https://huggingface.co/wop/Cosmos-T2-Accelerate-Beta2" | |
| } | |
| }, | |
| { | |
| name: "StorySupra-10M", | |
| org: "supralabs", | |
| params: "12.6M", | |
| blimp: 61.47, | |
| arc: 28.45, | |
| aci: 49.86, | |
| wiki: 8.76, | |
| tokens: "β", | |
| releaseDate: "2026-05-15", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/StorySupra-10M" | |
| } | |
| }, | |
| { | |
| name: "Supra-Mini-v5", | |
| org: "supralabs", | |
| params: "7.87M", | |
| blimp: 63.5, | |
| arc: 34.4, | |
| aci: 52.56, | |
| wiki: 2.73, | |
| tokens: "β", | |
| releaseDate: "2026-05-16", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-Mini-v5-8M" | |
| } | |
| }, | |
| { | |
| name: "Cosmos-T2-Accelerate-Preview", | |
| org: "wop", | |
| params: "9.96M", | |
| blimp: 56.95, | |
| arc: 26.8, | |
| aci: 50.71, | |
| wiki: 6.73, | |
| tokens: "462M", | |
| releaseDate: "2026-06-01", | |
| links: { | |
| card: "https://huggingface.co/wop/Cosmos-T2-Accelerate-Preview", | |
| demo: "https://huggingface.co/spaces/wop/Cosmos-T2-Chat" | |
| } | |
| }, | |
| { | |
| name: "Glint-1.3 (merged)", | |
| org: "glintresearch", | |
| params: "982K", | |
| blimp: 68.7, | |
| arc: 32.5, | |
| aci: 52.73, | |
| wiki: 3.08, | |
| tokens: "100B", | |
| releaseDate: "2026-05-13", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glint-1.3" | |
| } | |
| }, | |
| { | |
| name: "Supra-Mini-v6", | |
| org: "supralabs", | |
| params: "1.41M", | |
| blimp: 61.86, | |
| arc: 30.26, | |
| aci: 51.04, | |
| wiki: 3, | |
| tokens: "β", | |
| releaseDate: "2026-05-30", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-Mini-v6-1M" | |
| } | |
| }, | |
| { | |
| name: "GPT-S-5M", | |
| org: "axiomiclabs", | |
| params: "5.16M", | |
| blimp: 72.27, | |
| arc: 35.69, | |
| aci: 53.07, | |
| wiki: 2.57, | |
| tokens: "25B", | |
| releaseDate: "2026-05-19", | |
| links: { | |
| card: "https://huggingface.co/AxiomicLabs/GPT-S-5M" | |
| } | |
| }, | |
| { | |
| name: "Archaea-74M", | |
| org: "GODELEV", | |
| params: "74M", | |
| blimp: 74.91, | |
| arc: 39.06, | |
| aci: 52.58, | |
| wiki: 2.2, | |
| tokens: "~1.2B", | |
| releaseDate: "2026-06-01", | |
| links: { | |
| card: "https://huggingface.co/GODELEV/Archaea-74M" | |
| } | |
| }, | |
| { | |
| name: "Supra-50M-Instruct", | |
| org: "supralabs", | |
| params: "51.8M", | |
| blimp: 76.3, | |
| arc: 52.2, | |
| aci: 53.28, | |
| wiki: 2.56, | |
| tokens: "20B", | |
| releaseDate: "2026-05-21", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-50M-Instruct", | |
| base: "https://huggingface.co/SupraLabs/Supra-50M-Base" | |
| } | |
| }, | |
| { | |
| name: "Michel-Tiny", | |
| org: "finnianx", | |
| params: "55.7M", | |
| blimp: 74.08, | |
| arc: 37.33, | |
| aci: 52.90, | |
| wiki: 2.29, | |
| tokens: "1.3B", | |
| releaseDate: "2026-06-05", | |
| links: { | |
| card: "https://huggingface.co/finnianx/michel-tiny" | |
| } | |
| }, | |
| { | |
| name: "Gros-Michel-90m-Base", | |
| org: "finnianx", | |
| params: "91.1M", | |
| blimp: 78.35, | |
| arc: 41.5, | |
| aci: 54.51, | |
| wiki: 2.07, | |
| tokens: "6.5B", | |
| releaseDate: "2026-06-28", | |
| links: { | |
| card: "https://huggingface.co/finnianx/Gros-Michel-90m-Base" | |
| } | |
| }, | |
| { | |
| name: "Michel-Nano-v2", | |
| org: "finnianx", | |
| params: "9.94M", | |
| blimp: 72.52, | |
| arc: 35.9, | |
| aci: 54.25, | |
| wiki: 2.46, | |
| tokens: "6.5B", | |
| releaseDate: "2026-06-13", | |
| links: { | |
| card: "https://huggingface.co/finnianx/michel-nano-v2" | |
| } | |
| }, | |
| { | |
| name: "Michel-Nano", | |
| org: "finnianx", | |
| params: "5.96M", | |
| blimp: 65.23, | |
| arc: 33.38, | |
| aci: 54.25, | |
| wiki: 3.25, | |
| tokens: "1.1B", | |
| releaseDate: "2026-06-10", | |
| links: { | |
| card: "https://huggingface.co/finnianx/michel-nano" | |
| } | |
| }, | |
| { | |
| name: "Gros-Michel-90m-Base-v2", | |
| org: "finnianx", | |
| params: "95M", | |
| blimp: 80.20, | |
| arc: 43.18, | |
| aci: 53.90, | |
| wiki: 2.08, | |
| tokens: "9B", | |
| releaseDate: "2026-07-06", | |
| links: { | |
| card: "https://huggingface.co/finnianx/Gros-Michel-90m-Base-v2" | |
| } | |
| }, | |
| { | |
| name: "Michel-Micro", | |
| org: "finnianx", | |
| params: "28.4M", | |
| blimp: 69.75, | |
| arc: 38.59, | |
| aci: 53.50, | |
| wiki: 2.3, | |
| tokens: "2.6B", | |
| releaseDate: "2026-06-09", | |
| links: { | |
| card: "https://huggingface.co/finnianx/michel-micro" | |
| } | |
| }, | |
| { | |
| name: "Ivme-Conversate-v1-Base", | |
| org: "ivmelabs", | |
| params: "22.03M", | |
| blimp: 61.4, | |
| arc: 30.85, | |
| aci: 53.66, | |
| wiki: 3.14, | |
| tokens: "~1.57B", | |
| releaseDate: "2026-06-05", | |
| links: { | |
| card: "https://huggingface.co/IvmeLabs/Ivme-Conversate-22M-Base" | |
| } | |
| }, | |
| { | |
| name: "kirk-tung", | |
| org: "rtc", | |
| params: "53.1M", | |
| blimp: 72.81, | |
| arc: 30.3, | |
| aci: 52.77, | |
| wiki: 2.38, | |
| tokens: "1.1B", | |
| releaseDate: "2026-06-09", | |
| links: { | |
| card: "https://huggingface.co/rtc2022/kirk-tung" | |
| } | |
| }, | |
| { | |
| name: "Supra-Mini-0.1M", | |
| org: "supralabs", | |
| params: "117K", | |
| blimp: 51.77, | |
| arc: 26.39, | |
| aci: 52.23, | |
| wiki: 25.17, | |
| tokens: "500M", | |
| releaseDate: "2026-05-18", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-Mini-0.1M" | |
| } | |
| }, | |
| { | |
| name: "Supra-50M-Base", | |
| org: "supralabs", | |
| params: "51.8M", | |
| blimp: 76.3, | |
| arc: 46.0, | |
| aci: 53.53, | |
| wiki: 2.04, | |
| tokens: "20B", | |
| releaseDate: "2026-05-27", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-50M-Base" | |
| } | |
| }, | |
| { | |
| name: "Supra-50M-Reasoning", | |
| org: "supralabs", | |
| params: "51.8M", | |
| blimp: 64.14, | |
| arc: 45.16, | |
| aci: 53.16, | |
| wiki: 2.6, | |
| tokens: "20B", | |
| releaseDate: "2026-06-04", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-50M-Reasoning", | |
| demo: "https://huggingface.co/spaces/SupraLabs/Supra-50M-Reasoning-Demo" | |
| } | |
| }, | |
| { | |
| name: "Escarda-86M-Base", | |
| org: "quazim0t0", | |
| params: "85.7M", | |
| blimp: 71.44, | |
| arc: 38.01, | |
| aci: 52.51, | |
| wiki: 2.2228, | |
| tokens: "~20B", | |
| releaseDate: "2026-05-22", | |
| links: { | |
| card: "https://huggingface.co/Quazim0t0/Escarda-86M-Base", | |
| discussion: "https://huggingface.co/spaces/Glint-Research/Tiny-ML-Leaderboard/discussions/21" | |
| } | |
| }, | |
| { | |
| name: "KeyLM-75M", | |
| org: "minimalabs", | |
| params: "75M", | |
| blimp: 76.10, | |
| arc: 35.65, | |
| aci: 52.27, | |
| wiki: 2.08, | |
| tokens: "~18B", | |
| releaseDate: "2026-05-29", | |
| links: { | |
| card: "https://huggingface.co/MinimaLabs/KeyLM-75M" | |
| } | |
| }, | |
| { | |
| name: "KeyLM-75M-Instruct", | |
| org: "minimalabs", | |
| params: "75M", | |
| blimp: 76.02, | |
| arc: 39.10, | |
| aci: 52.26, | |
| wiki: 2.17, | |
| tokens: "~18B", | |
| releaseDate: "2026-05-29", | |
| links: { | |
| card: "https://huggingface.co/MinimaLabs/KeyLM-75M-Instruct", | |
| base: "https://huggingface.co/MinimaLabs/KeyLM-75M" | |
| } | |
| }, | |
| { | |
| name: "Glimmer 1", | |
| org: "glintresearch", | |
| params: "11.9K", | |
| blimp: 52.43, | |
| arc: 25.46, | |
| aci: 50.00, | |
| wiki: 14.73, | |
| tokens: "500K", | |
| releaseDate: "2026-06-16", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Glimmer-1-Base" | |
| } | |
| }, | |
| { | |
| name: "Echo88-150M-Instruct", | |
| org: "exnivo", | |
| params: "150M", | |
| blimp: 72.67, | |
| arc: 31.40, | |
| aci: 50.83, | |
| wiki: 2.45, | |
| tokens: "~1.47B", | |
| releaseDate: "2026-05-05", | |
| links: { | |
| card: "https://huggingface.co/exnivo/Echo88-150M-Instruct" | |
| } | |
| }, | |
| { | |
| name: "Byrne-86M-Base", | |
| org: "quazim0t0", | |
| params: "86M", | |
| blimp: 73.56, | |
| arc: 39.31, | |
| aci: 52.42, | |
| wiki: 2.3753, | |
| tokens: "β", | |
| releaseDate: "2026-06-18", | |
| links: { | |
| card: "https://huggingface.co/Quazim0t0/Byrne-86M-Base", | |
| base: "https://huggingface.co/Quazim0t0/Byrne-86M" | |
| } | |
| }, | |
| { | |
| name: "Byrne-86M", | |
| org: "quazim0t0", | |
| params: "86M", | |
| blimp: 70.33, | |
| arc: 34.68, | |
| aci: 52.16, | |
| wiki: 2.6839, | |
| tokens: "β", | |
| releaseDate: "2026-06-18", | |
| links: { | |
| card: "https://huggingface.co/Quazim0t0/Byrne-86M", | |
| base: "https://huggingface.co/Quazim0t0/Byrne-86M-Base" | |
| } | |
| }, | |
| { | |
| name: "Blink-1-Base", | |
| org: "glintresearch", | |
| params: "1.09K", | |
| blimp: 52.84, | |
| arc: 26.60, | |
| wiki: 71.35, | |
| tokens: "100B", | |
| releaseDate: "2026-06-21", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Blink-1-Base" | |
| } | |
| }, | |
| { | |
| name: "Blink-1-Instruct", | |
| org: "glintresearch", | |
| params: "1.09K", | |
| blimp: 52.46, | |
| arc: 26.80, | |
| wiki: 70.44, | |
| tokens: "100B", | |
| releaseDate: "2026-06-21", | |
| links: { | |
| card: "https://huggingface.co/Glint-Research/Blink-1-Base", | |
| base: "https://huggingface.co/Glint-Research/Blink-1-Base" | |
| } | |
| }, | |
| { | |
| name: "Dumb-1.2-Preview-0625", | |
| org: "56m", | |
| params: "34.6M", | |
| blimp: 64.05, | |
| arc: 32.79, | |
| aci: 54.44, | |
| wiki: 2.875, | |
| tokens: "~115-165M", | |
| releaseDate: "2026-06-25", | |
| links: { | |
| card: "https://huggingface.co/56m/Dumb-1.2-Preview-0625" | |
| } | |
| }, | |
| { | |
| name: "Dumb-1.2-RC1", | |
| org: "56m", | |
| params: "34.6M", | |
| blimp: 64.87, | |
| arc: 34.13, | |
| aci: 54.16, | |
| wiki: 2.838, | |
| tokens: "210M", | |
| releaseDate: "2026-06-28", | |
| links: { | |
| card: "https://huggingface.co/56m/Dumb-1.2-RC1" | |
| } | |
| }, | |
| { | |
| name: "GPT-X2-125M", | |
| org: "axiomiclabs", | |
| params: "125M", | |
| blimp: 81.28, | |
| arc: 57.07, | |
| aci: 54.53, | |
| wiki: 1.86, | |
| tokens: "75B", | |
| releaseDate: "2026-04-22", | |
| links: { | |
| card: "https://huggingface.co/AxiomicLabs/GPT-X2-125M" | |
| } | |
| }, | |
| { | |
| name: "Dumb 1.2", | |
| org: "56m", | |
| params: "34.6M", | |
| blimp: 70.51, | |
| arc: 34.97, | |
| wiki: 2.7195, | |
| tokens: "1.1B", | |
| links: {} | |
| }, | |
| { | |
| name: "TinyMoE-100m-2x8", | |
| org: "flamef0x", | |
| params: "99.8M", | |
| blimp: 61.13, | |
| arc: 25.88, | |
| aci: 50.66, | |
| wiki: 3.878, | |
| tokens: "~625M", | |
| releaseDate: "2026-06-15", | |
| links: { | |
| card: "https://huggingface.co/FlameF0X/TinyMoE-100m-2x8" | |
| } | |
| }, | |
| { | |
| name: "TinyMoE-100m-2x8-retrained", | |
| org: "flamef0x", | |
| params: "99.8M", | |
| blimp: 66.01, | |
| arc: 33.88, | |
| aci: 51.69, | |
| wiki: 2.879, | |
| tokens: "β", | |
| releaseDate: "2026-07-05", | |
| links: { | |
| card: "https://huggingface.co/FlameF0X/TinyMoE-100m-2x8-retrained" | |
| } | |
| }, | |
| { | |
| name: "SRLM-1M", | |
| org: "martico2432", | |
| params: "904k", | |
| blimp: 53.1, | |
| arc: 28.66, | |
| wiki: 4.455, | |
| tokens: "~16M", | |
| releaseDate: "2026-07-04", | |
| links: { | |
| card: "https://huggingface.co/Martico2432/srlm-1m" | |
| } | |
| }, | |
| { | |
| name: "CreekwardGoat-500K", | |
| org: "wonderfulmonkey", | |
| params: "500k", | |
| blimp: 60.61, | |
| arc: 30.35, | |
| aci: 49.58, | |
| wiki: 4.1228, | |
| tokens: "300M", | |
| releaseDate: "2026-07-16", | |
| links: { | |
| card: "https://huggingface.co/wonderfulmonkey/CreekwardGoat-500K" | |
| } | |
| }, | |
| { | |
| name: "Ivme-Conversate-v2-Base", | |
| org: "ivmelabs", | |
| params: "23.85M", | |
| blimp: 75.09, | |
| arc: 39.98, | |
| aci: 53.72, | |
| wiki: 2.2250, | |
| tokens: "~12.85B", | |
| releaseDate: "2026-07-07", | |
| links: { | |
| card: "https://huggingface.co/IvmeLabs/Ivme-Conversate-v2-Base", | |
| demo: "https://huggingface.co/spaces/IvmeLabs/Ivme-Conversate-Demo" | |
| } | |
| }, | |
| { | |
| name: "Ivme-Conversate-v3-Base", | |
| org: "ivmelabs", | |
| params: "24.79M", | |
| blimp: 78.49, | |
| arc: 39.02, | |
| wiki: 2.1362, | |
| tokens: "~15B", | |
| releaseDate: "2026-09-13", | |
| links: { | |
| card: "https://huggingface.co/IvmeLabs/Ivme-Conversate-v3-Base" | |
| } | |
| }, | |
| { | |
| name: "Supra-1.5-Instruct-exp", | |
| org: "supralabs", | |
| params: "51.8M", | |
| blimp: 67.4, | |
| arc: 45.9, | |
| aci: 53.17, | |
| wiki: 2.7, | |
| tokens: "23B", | |
| releaseDate: "2026-06-12", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/Supra-1.5-50M-Instruct-exp", | |
| demo: "https://huggingface.co/spaces/SupraLabs/Supra1.5-50M-Instruct-Demo" | |
| } | |
| }, | |
| { | |
| name: "DistillSupra-0.2M", | |
| org: "supralabs", | |
| params: "0.2M", | |
| blimp: 51.84, | |
| arc: 26.77, | |
| aci: 49.26, | |
| wiki: 8.0696, | |
| tokens: "1.5M", | |
| releaseDate: "2026-05-15", | |
| links: { | |
| card: "https://huggingface.co/SupraLabs/DistillSupra-0.2M" | |
| } | |
| }, | |
| { | |
| name: "Hydrion-v1-Base", | |
| org: "opengcm", | |
| params: "114.1M", | |
| blimp: 80.08, | |
| arc: 47.26, | |
| wiki: 2.04, | |
| tokens: "~2.5B", | |
| links: {} | |
| }, | |
| { | |
| name: "TextModel-v1", | |
| org: "benchlabs", | |
| params: "122.7M", | |
| blimp: 80.31, | |
| arc: 49.71, | |
| aci: 55.044, | |
| wiki: 2.628, | |
| tokens: "1.64B", | |
| releaseDate: "2026-07-29", | |
| links: { | |
| card: "https://huggingface.co/TobiasLogic/TextModel-v1" | |
| } | |
| }, | |
| { | |
| name: "ObsidianSmall-Base", | |
| org: "dreamw", | |
| params: "8.7M", | |
| blimp: 71.891, | |
| arc: 33.291, | |
| wiki: 2.467, | |
| tokens: "4B", | |
| releaseDate: "2026-07-31", | |
| links: { | |
| card: "https://huggingface.co/Dream-W/ObsidianSmall-Base" | |
| } | |
| }, | |
| { | |
| name: "min-spark", | |
| org: "minimalabs", | |
| params: "5.76M", | |
| blimp: 69.19, | |
| arc: 37.08, | |
| wiki: 2.7747, | |
| tokens: "10B", | |
| releaseDate: "2026-08-06", | |
| links: { | |
| card: "https://huggingface.co/MinimaLabs/min-spark" | |
| } | |
| }, | |
| { | |
| name: "Haidass-143M-v1", | |
| org: "DALab", | |
| params: "143M", | |
| blimp: 79.05, | |
| arc: 60.23, | |
| wiki: 1.8892, | |
| tokens: "100B", | |
| releaseDate: "2026-08-11", | |
| links: { | |
| card: "https://huggingface.co/DALabCommunity/Haidass-143M-v1" | |
| } | |
| }, | |
| { | |
| name: "Byrne-100M-Ultra-MC-base", | |
| org: "quazim0t0", | |
| params: "113.9M", | |
| blimp: 81.10, | |
| arc: 20.50, | |
| wiki: 2.3080, | |
| tokens: "~2B", | |
| releaseDate: "2026-08-19", | |
| links: { | |
| card: "https://huggingface.co/Quazim0t0/Byrne-100M-Ultra-MC" | |
| } | |
| }, | |
| { | |
| name: "Byrne-100M-Ultra-MC-sft", | |
| org: "quazim0t0", | |
| params: "113.9M", | |
| blimp: 78.00, | |
| arc: 26.50, | |
| wiki: 2.3830, | |
| tokens: "~2B", | |
| releaseDate: "2026-08-19", | |
| links: { | |
| card: "https://huggingface.co/Quazim0t0/Byrne-100M-Ultra-MC" | |
| } | |
| }, | |
| { | |
| name: "Byrne-100M-Ultra-MC-dpo", | |
| org: "quazim0t0", | |
| params: "113.9M", | |
| blimp: 77.90, | |
| arc: 25.50, | |
| wiki: 2.3850, | |
| tokens: "~2B", | |
| releaseDate: "2026-08-19", | |
| links: { | |
| card: "https://huggingface.co/Quazim0t0/Byrne-100M-Ultra-MC" | |
| } | |
| }, | |
| { | |
| name: "Aurora-80K", | |
| org: "auroraairesearch", | |
| params: "80K", | |
| blimp: 52.31, | |
| arc: 26.05, | |
| wiki: 9.78, | |
| tokens: "80M", | |
| releaseDate: "2026-08-20", | |
| links: { | |
| card: "https://huggingface.co/AuroraAI-Research/Aurora-80K" | |
| } | |
| } | |
| ]; | |
| models.forEach(m => { if (!m.links) m.links = {}; }); | |
| const orgNameMap = { | |
| 'Fabryka AI': 'Fabryka AI', | |
| glintresearch: 'Glint Research', | |
| supralabs: 'SupraLabs', | |
| axiomiclabs: 'Axiomic Labs', | |
| mihaipopa: 'Mihai Popa', | |
| cromia: 'CromIA', | |
| wop: 'wop', | |
| GODELEV: 'GODELEV', | |
| finnianx: 'finnianx', | |
| ivmelabs: 'IvmeLabs', | |
| rtc: 'RTC', | |
| huggingface: 'HuggingFace', | |
| facebook: 'Meta', | |
| openai: 'OpenAI', | |
| eleutherai: 'EleutherAI', | |
| stentor: 'StentorLabs', | |
| eclipsesenpai: 'Eclipse-Senpai', | |
| minimalabs: 'Minima Labs', | |
| sandroeth: 'Sandroeth', | |
| thingai: 'ThingAI', | |
| veyraai: 'veyra-ai', | |
| fromzero: 'FromZero', | |
| joelhenwang: 'joelhenwang', | |
| jhuclsp: 'JHU CLSP', | |
| liodonai: 'Liodon AI', | |
| smalldoge: 'SmallDoge', | |
| quazim0t0: 'Quazim0t0', | |
| small56ai: 'Small56.AI', | |
| lhtechai: 'LH-Tech-AI', | |
| harleyml: 'Harley ML', | |
| exnivo: 'Exnivo', | |
| '56m': '56m', | |
| unknown: 'Unknown', | |
| opengcm: 'OpenGCM', | |
| flamef0x: 'FlameF0X', | |
| martico2432: 'Martico2432', | |
| wonderfulmonkey: 'Wonderful Monkey', | |
| benchlabs: 'bench-labs', | |
| dreamw: 'Dream W', | |
| DALab: 'DALab', | |
| auroraairesearch: 'AuroraAI-Research', | |
| wayneworkman: 'Wayne Workman', | |
| altslate: "altslate" | |
| }; | |
| const colorMap = { | |
| 'Fabryka AI': '#963200', | |
| glintresearch: '#3fb950', | |
| supralabs: '#58a6ff', | |
| axiomiclabs: '#c2b6ff', | |
| mihaipopa: '#93c6aa', | |
| cromia: '#d0d7de', | |
| wop: '#ff9b50', | |
| GODELEV: '#1a56db', | |
| finnianx: '#06b6d4', | |
| ivmelabs: '#ff0000', | |
| rtc: '#e8a87c', | |
| huggingface: '#ffcc00', | |
| facebook: '#1877f2', | |
| openai: '#10a37f', | |
| eleutherai: '#ef4444', | |
| stentor: '#ff6bcb', | |
| eclipsesenpai: '#06b6d4', | |
| minimalabs: '#4961e6', | |
| sandroeth: '#84cc16', | |
| thingai: '#b45309', | |
| veyraai: '#d45672', | |
| fromzero: '#d2b48c', | |
| joelhenwang: '#9ca3af', | |
| jhuclsp: '#2563eb', | |
| liodonai: '#6366f1', | |
| smalldoge: '#ec4899', | |
| quazim0t0: '#0ea5e9', | |
| small56ai: '#22c55e', | |
| lhtechai: '#f97316', | |
| exnivo: '#8B4513', | |
| unknown: '#fbbf24', | |
| opengcm: '#808080', | |
| '56m': '#a855f7', | |
| flamef0x: '#cc5218', | |
| martico2432: '#6cf01a', | |
| wonderfulmonkey: '#f0f8ff', | |
| benchlabs: '#7c3aed', | |
| dreamw: '#6a00ff', | |
| DALab: '#e11d48', | |
| auroraairesearch: '#8234A8', | |
| wayneworkman: '#14b8a6', | |
| altslate: '#7EB096' | |
| }; | |
| const bgMap = {}; | |
| Object.keys(colorMap).forEach(k => { | |
| const c = colorMap[k]; | |
| const r = parseInt(c.slice(1, 3), 16); | |
| const g = parseInt(c.slice(3, 5), 16); | |
| const b = parseInt(c.slice(5, 7), 16); | |
| bgMap[k] = `rgba(${r},${g},${b},0.7)`; | |
| }); | |
| function parseParams(s) { | |
| if (!s || typeof s !== 'string') return NaN; | |
| const u = s.toUpperCase().replace(/,/g, ''); | |
| if (u.endsWith('B')) return parseFloat(u) * 1e9; | |
| if (u.endsWith('M')) return parseFloat(u) * 1e6; | |
| if (u.endsWith('K')) return parseFloat(u) * 1e3; | |
| return parseFloat(u) || NaN; | |
| } | |
| // Size-fairness: reward smaller models, but cap the bonus so a 1K model | |
| // can't score wildly higher (e.g. 100x) than a 1M model for similar performance. | |
| // We work in log-parameter space (since params span 1K to 150M+) and cap the | |
| // smallest model's bonus at MAX_SIZE_BONUS relative to the largest model. | |
| const paramLogs = models | |
| .map(m => parseParams(m.params)) | |
| .filter(p => !isNaN(p) && p > 0) | |
| .map(p => Math.log10(p)); | |
| const paramLogMin = Math.min(...paramLogs); | |
| const paramLogMax = Math.max(...paramLogs); | |
| const MAX_SIZE_BONUS = 0.5; // smallest model on the board tops out at +50%, not +9900% | |
| function getSizeMultiplier(m) { | |
| const p = parseParams(m.params); | |
| if (isNaN(p) || p <= 0 || paramLogMin === paramLogMax) return 1; | |
| // t = 1 for the smallest model on the board, 0 for the largest | |
| const t = (paramLogMax - Math.log10(p)) / (paramLogMax - paramLogMin); | |
| return 1 + MAX_SIZE_BONUS * Math.max(0, Math.min(1, t)); | |
| } | |
| const WIKI_PPL_CAP = 500; | |
| const wikiScoreLogs = models | |
| .filter(m => m.wiki !== null && typeof m.wiki === 'number' && m.wiki > 0) | |
| .map(m => Math.log(Math.min(m.wiki, WIKI_PPL_CAP))); | |
| const wikiMinLog = Math.min(...wikiScoreLogs); | |
| const wikiMaxLog = Math.max(...wikiScoreLogs); | |
| function getWikiScore(m) { | |
| if (m.wiki === null || typeof m.wiki !== 'number' || m.wiki <= 0 || wikiMinLog === wikiMaxLog) return null; | |
| const cappedLog = Math.log(Math.min(m.wiki, WIKI_PPL_CAP)); | |
| const normalized = 1 - ((cappedLog - wikiMinLog) / (wikiMaxLog - wikiMinLog)); | |
| return Math.max(0, Math.min(1, normalized)) * 100; | |
| } | |
| function getScore(m) { | |
| const wikiScore = getWikiScore(m); | |
| const hasBlimp = typeof m.blimp === 'number'; | |
| const hasArc = typeof m.arc === 'number'; | |
| const hasWiki = wikiScore !== null; | |
| if (!hasBlimp && !hasArc && !hasWiki) return -1; | |
| const blimpScore = hasBlimp ? m.blimp : 0; | |
| const arcScore = hasArc ? m.arc : 0; | |
| const wikiVal = hasWiki ? wikiScore : 0; | |
| return (blimpScore + arcScore + wikiVal) / 3; | |
| } | |
| function getEfficiencyScore(m) { | |
| const score = getScore(m); | |
| if (score <= 0) return -1; | |
| return score * getSizeMultiplier(m); | |
| } | |
| function orgTint(orgKey, alpha) { | |
| const c = colorMap[orgKey]; | |
| const r = parseInt(c.slice(1, 3), 16); | |
| const g = parseInt(c.slice(3, 5), 16); | |
| const b = parseInt(c.slice(5, 7), 16); | |
| return `rgba(${r},${g},${b},${alpha})`; | |
| } | |
| const worstGreen = [255, 255, 255]; | |
| const bestGreen = [63, 185, 80]; | |
| function getColor(value, min, max, lowerIsBetter, useLog = false) { | |
| if (value === null || isNaN(value) || min === max) return ''; | |
| let v = value, mn = min, mx = max; | |
| if (useLog) { v = Math.log(v); mn = Math.log(mn); mx = Math.log(mx); } | |
| let p = (v - mn) / (mx - mn); | |
| if (lowerIsBetter) p = 1 - p; | |
| const a = Math.pow(Math.max(0, Math.min(1, p)), 2.5); | |
| const r = Math.round(worstGreen[0] + (bestGreen[0] - worstGreen[0]) * a); | |
| const g = Math.round(worstGreen[1] + (bestGreen[1] - worstGreen[1]) * a); | |
| const b = Math.round(worstGreen[2] + (bestGreen[2] - worstGreen[2]) * a); | |
| return `color:rgb(${r},${g},${b})`; | |
| } | |
| /* βββ Stats ββ */ | |
| function renderStats() { | |
| const orgs = new Set(models.map(m => m.org)); | |
| const blimps = models.filter(m => m.blimp).map(m => m.blimp); | |
| const arcs = models.filter(m => m.arc).map(m => m.arc); | |
| const acis = models.filter(m => typeof m.aci === 'number').map(m => m.aci); | |
| const bestB = Math.max(...blimps); | |
| const bestA = Math.max(...arcs); | |
| const bestACI = acis.length ? Math.max(...acis) : null; | |
| document.getElementById('stat-row').innerHTML = ` | |
| <div class="stat-pill"><div class="label">Models</div><div class="value">${models.length}</div><div class="sub">On leaderboard</div></div> | |
| <div class="stat-pill"><div class="label">Organizations</div><div class="value">${orgs.size}</div><div class="sub">Contributing</div></div> | |
| <div class="stat-pill"><div class="label">Best BLiMP</div><div class="value" style="color:var(--green)">${bestB}%</div><div class="sub">${models.find(m => m.blimp === bestB).name}</div></div> | |
| <div class="stat-pill"><div class="label">Best ARC-E</div><div class="value" style="color:var(--green)">${bestA}%</div><div class="sub">${models.find(m => m.arc === bestA).name}</div></div> | |
| ${acis.length ? `<div class="stat-pill"><div class="label">Best ACI</div><div class="value" style="color:var(--green)">${bestACI.toFixed(2)}%</div><div class="sub">${models.find(m => m.aci === bestACI).name}</div></div>` : ''} | |
| `; | |
| document.getElementById('model-count-badge').textContent = `${models.length} models`; | |
| } | |
| /* βββ Filters βββ */ | |
| let activeFilter = 'all'; | |
| let activeSort = 'efficiency'; | |
| const sortComparators = { | |
| score: (a, b) => getScore(b) - getScore(a), | |
| wiki: (a, b) => { | |
| if (a.wiki == null) return 1; | |
| if (b.wiki == null) return -1; | |
| return a.wiki - b.wiki; | |
| }, | |
| blimp: (a, b) => { | |
| if (a.blimp == null) return 1; | |
| if (b.blimp == null) return -1; | |
| return b.blimp - a.blimp; | |
| }, | |
| arc: (a, b) => { | |
| if (a.arc == null) return 1; | |
| if (b.arc == null) return -1; | |
| return b.arc - a.arc; | |
| }, | |
| aci: (a, b) => { | |
| if (typeof a.aci !== 'number') return 1; | |
| if (typeof b.aci !== 'number') return -1; | |
| return b.aci - a.aci; | |
| }, | |
| efficiency: (a, b) => getEfficiencyScore(b) - getEfficiencyScore(a), | |
| params: (a, b) => parseParams(a.params) - parseParams(b.params), | |
| date: (a, b) => { | |
| if (!a.releaseDate) return 1; | |
| if (!b.releaseDate) return -1; | |
| return new Date(b.releaseDate) - new Date(a.releaseDate); | |
| } | |
| }; | |
| function sizeBucket(params) { | |
| const n = parseParams(params); | |
| if (isNaN(n) || n < 1e6) return 'small'; | |
| if (n < 1e7) return 'medium'; | |
| return 'large'; | |
| } | |
| let searchQuery = ''; | |
| function matchesSearch(m) { | |
| if (!searchQuery) return true; | |
| const q = searchQuery.toLowerCase(); | |
| return m.name.toLowerCase().includes(q) || (orgNameMap[m.org] || '').toLowerCase().includes(q); | |
| } | |
| function matchesFilter(m) { | |
| if (activeFilter === 'all') return true; | |
| if (activeFilter === 'small' || activeFilter === 'medium' || activeFilter === 'large') { | |
| return sizeBucket(m.params) === activeFilter; | |
| } | |
| return m.org === activeFilter; | |
| } | |
| function getFilteredModels() { | |
| return models.filter(m => matchesFilter(m) && matchesSearch(m)); | |
| } | |
| function setupSearch() { | |
| const box = document.getElementById('model-search'); | |
| if (!box) return; | |
| box.addEventListener('input', e => { | |
| searchQuery = e.target.value.trim(); | |
| renderFilteredViews(); | |
| }); | |
| } | |
| function setupSortControl() { | |
| const sel = document.getElementById('sort-select'); | |
| if (!sel) return; | |
| sel.value = activeSort; | |
| sel.addEventListener('change', e => { | |
| activeSort = e.target.value; | |
| renderTable(); | |
| }); | |
| } | |
| function renderFilteredViews() { | |
| renderTable(); | |
| buildLegend(); | |
| renderTimeline(); | |
| if (activeView === 'charts') buildMetricChart(); | |
| if (activeView === 'efficiency') buildEfficiencyChart(); | |
| } | |
| function buildFilters() { | |
| const tb = document.getElementById('org-filters'); | |
| if (!tb) return; | |
| const sizeChips = [ | |
| { key: 'all', label: 'All' }, | |
| { key: 'small', label: '< 1M' }, | |
| { key: 'medium', label: '1β10M' }, | |
| { key: 'large', label: '10M+' } | |
| ]; | |
| sizeChips.forEach(({ key, label }) => { | |
| const c = document.createElement('div'); | |
| c.className = 'filter-chip' + (key === 'all' ? ' active' : ''); | |
| c.dataset.filter = key; | |
| c.textContent = label; | |
| tb.appendChild(c); | |
| }); | |
| const sep = document.createElement('div'); | |
| sep.className = 'tl-sep'; | |
| tb.appendChild(sep); | |
| const orgs = [...new Set(models.map(m => m.org))]; | |
| orgs.forEach(org => { | |
| const c = document.createElement('div'); | |
| c.className = 'filter-chip'; | |
| c.dataset.filter = org; | |
| c.innerHTML = `<span class="dot" style="background:${colorMap[org]}"></span>${orgNameMap[org]}`; | |
| tb.appendChild(c); | |
| }); | |
| tb.addEventListener('click', e => { | |
| const chip = e.target.closest('.filter-chip'); | |
| if (!chip) return; | |
| tb.querySelectorAll('.filter-chip').forEach(c => c.classList.remove('active')); | |
| chip.classList.add('active'); | |
| activeFilter = chip.dataset.filter; | |
| renderFilteredViews(); | |
| }); | |
| } | |
| /* βββ Table βββ */ | |
| function formatDate(dateStr) { | |
| if (!dateStr) return 'β'; | |
| const date = new Date(dateStr); | |
| return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }); | |
| } | |
| function renderTable() { | |
| const tbody = document.getElementById('leaderboard-body'); | |
| const cmp = sortComparators[activeSort] || sortComparators.score; | |
| const filtered = getFilteredModels().sort(cmp); | |
| document.getElementById('model-count-badge').textContent = | |
| filtered.length === models.length | |
| ? `${models.length} models` | |
| : `${filtered.length} of ${models.length} models`; | |
| const blimps = models.filter(m => m.blimp).map(m => m.blimp); | |
| const arcs = models.filter(m => m.arc).map(m => m.arc); | |
| const wikis = models.filter(m => m.wiki).map(m => m.wiki); | |
| const effs = models.filter(m => getEfficiencyScore(m) >= 0).map(m => getEfficiencyScore(m)); | |
| const bMin = Math.min(...blimps), bMax = Math.max(...blimps); | |
| const aMin = Math.min(...arcs), aMax = Math.max(...arcs); | |
| const wMin = Math.min(...wikis), wMax = Math.max(...wikis); | |
| const acis = models.filter(m => typeof m.aci === 'number').map(m => m.aci); | |
| const aciMin = Math.min(...acis), aciMax = Math.max(...acis); | |
| const eMin = Math.min(...effs), eMax = Math.max(...effs); | |
| tbody.innerHTML = filtered.map((m, idx) => { | |
| const oc = colorMap[m.org]; | |
| const orgBg = orgTint(m.org, 0.15); | |
| const isBestBlimp = m.blimp && m.blimp === bMax; | |
| const isBestArc = m.arc && m.arc === aMax; | |
| const isBestWiki = m.wiki && m.wiki === wMin; | |
| const rank = idx + 1; | |
| const rankClass = rank <= 3 ? ` rank-${rank}` : ''; | |
| return `<tr class="lb-row" onmouseenter="this.classList.add('hover')" onmouseleave="this.classList.remove('hover')"> | |
| <td class="cell-rank${rankClass}">#${rank}</td> | |
| <td class="cell-model"> | |
| <div class="model-name">${m.name}</div> | |
| </td> | |
| <td><span class="org-tag" style="background:${orgBg};color:${oc}"><span class="org-dot" style="background:${oc}"></span>${orgNameMap[m.org]}</span></td> | |
| <td>${m.params}</td> | |
| <td class="cell-metric" style="${getColor(getEfficiencyScore(m), eMin, eMax, false)}"> | |
| ${getEfficiencyScore(m) >= 0 | |
| ? `<span class="metric-val${getEfficiencyScore(m) >= eMax ? ' best' : ''}">${getEfficiencyScore(m).toFixed(2)}</span>` | |
| : '<span class="metric-na">TBD</span>'} | |
| </td> | |
| <td class="cell-metric ${m.wiki === null ? '' : ''}" style="${getColor(m.wiki, wMin, wMax, true, true)}"> | |
| ${m.wiki !== null | |
| ? `<span class="metric-val${isBestWiki ? ' best' : ''}">${m.wiki}</span>` | |
| : '<span class="metric-na">TBD</span>'} | |
| </td> | |
| <td class="cell-metric" style="${getColor(m.blimp, bMin, bMax, false)}"> | |
| ${m.blimp !== null | |
| ? `<span class="metric-val${isBestBlimp ? ' best' : ''}">${m.blimp}%</span>` | |
| : '<span class="metric-na">TBD</span>'} | |
| </td> | |
| <td class="cell-metric" style="${getColor(m.arc, aMin, aMax, false)}"> | |
| ${m.arc !== null | |
| ? `<span class="metric-val${isBestArc ? ' best' : ''}">${m.arc}%</span>` | |
| : '<span class="metric-na">TBD</span>'} | |
| </td> | |
| <td class="cell-metric" style="${typeof m.aci === 'number' ? getColor(m.aci, aciMin, aciMax, false) : ''}"> | |
| ${typeof m.aci === 'number' | |
| ? `<span class="metric-val${m.aci === aciMax ? ' best' : ''}">${m.aci.toFixed(2)}%</span>` | |
| : '<span class="metric-na">TBD</span>'} | |
| </td> | |
| <td class="cell-tokens">${m.tokens}</td> | |
| <td class="cell-date">${formatDate(m.releaseDate)}</td> | |
| <td class="cell-links"> | |
| ${m.links.card ? `<a href="${m.links.card}" target="_blank">card</a>` : '<span class="metric-na">β</span>'} | |
| ${m.links.base ? `<a href="${m.links.base}" target="_blank">base</a>` : ''} | |
| ${m.links.demo ? `<a href="${m.links.demo}" target="_blank">demo</a>` : ''} | |
| </td> | |
| </tr>`; | |
| }).join('') || `<tr><td colspan="12" class="tl-empty">No model matches that search.</td></tr>`; | |
| } | |
| /* βββ Legend βββ */ | |
| function buildLegend() { | |
| const bar = document.getElementById('legend-bar'); | |
| const orgs = [...new Set(getFilteredModels().map(m => m.org))]; | |
| bar.innerHTML = orgs.map(org => | |
| `<span class="legend-item"><span class="ldot" style="background:${colorMap[org]}"></span>${orgNameMap[org]}</span>` | |
| ).join(''); | |
| } | |
| /* βββ Chart defaults βββ */ | |
| Chart.defaults.color = '#8b949e'; | |
| Chart.defaults.borderColor = 'rgba(255,255,255,0.06)'; | |
| Chart.defaults.font.family = "-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif"; | |
| Chart.defaults.font.size = 11; | |
| Chart.defaults.plugins.legend.display = false; | |
| const tooltipStyle = { | |
| backgroundColor: '#1c2129', | |
| titleColor: '#c9d1d9', | |
| bodyColor: '#8b949e', | |
| borderColor: '#30363d', | |
| borderWidth: 1, | |
| cornerRadius: 8, | |
| padding: 10, | |
| displayColors: false | |
| }; | |
| /* βββ Timeline βββ */ | |
| function renderTimeline() { | |
| const container = document.getElementById('timeline-list'); | |
| if (!container) return; | |
| const sorted = getFilteredModels() | |
| .filter(m => m.releaseDate) | |
| .sort((a, b) => new Date(b.releaseDate) - new Date(a.releaseDate)); | |
| const monthKey = d => { | |
| const [y, m] = d.split('-'); | |
| return `${y}-${m}`; | |
| }; | |
| const monthLabel = key => { | |
| const [y, m] = key.split('-'); | |
| const dt = new Date(parseInt(y), parseInt(m) - 1, 1); | |
| return dt.toLocaleDateString('en-US', { month: 'long', year: 'numeric' }); | |
| }; | |
| const dayLabel = d => { | |
| const [y, m, day] = d.split('-').map(Number); | |
| const dt = new Date(y, m - 1, day); | |
| return dt.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); | |
| }; | |
| if (sorted.length === 0) { | |
| container.innerHTML = '<div class="tl-empty">No models match this filter.</div>'; | |
| return; | |
| } | |
| const groups = {}; | |
| sorted.forEach(m => { | |
| const k = monthKey(m.releaseDate); | |
| (groups[k] = groups[k] || []).push(m); | |
| }); | |
| container.innerHTML = Object.keys(groups).map(key => { | |
| const items = groups[key]; | |
| const rows = items.map(m => { | |
| const oc = colorMap[m.org]; | |
| const orgBg = orgTint(m.org, 0.15); | |
| return `<div class="tl-row" style="--org-color:${oc}"> | |
| <div class="tl-date">${dayLabel(m.releaseDate)}</div> | |
| <div class="tl-name"> | |
| <a href="${m.links.card}" target="_blank" rel="noopener">${m.name}</a> | |
| </div> | |
| <div class="tl-params">${m.params} params</div> | |
| <div class="tl-org" style="background:${orgBg};color:${oc}">${orgNameMap[m.org]}</div> | |
| </div>`; | |
| }).join(''); | |
| return `<div class="tl-month"> | |
| <span>${monthLabel(key)}</span> | |
| <span class="tl-month-count">${items.length} model${items.length === 1 ? '' : 's'}</span> | |
| </div>${rows}`; | |
| }).join(''); | |
| } | |
| /* βββ Bar charts βββ */ | |
| const METRICS = { | |
| blimp: { label: 'BLiMP', sub: 'Grammatical acceptability · higher is better', unit: '%', lowerBetter: false }, | |
| arc: { label: 'ARC-Easy', sub: 'Science QA accuracy · higher is better', unit: '%', lowerBetter: false }, | |
| aci: { label: 'ACI', sub: 'Attention Clarity Index by AxiomicLabs · share of attention×gradient saliency landing on relevant sentences · 50 = no preference over distractors', unit: '%', lowerBetter: false, dot: true, min: 45, max: 56 }, | |
| wiki: { label: 'WikiText-2', sub: 'Byte-level perplexity · log scale · lower is better · models above 1000 ppl omitted', unit: '', lowerBetter: true, dot: true, cap: 1000 } | |
| }; | |
| let activeMetric = 'blimp'; | |
| function setupMetricSwitch() { | |
| const box = document.getElementById('metric-switch'); | |
| if (!box) return; | |
| box.innerHTML = Object.entries(METRICS).map(([k, m]) => | |
| `<button class="metric-chip${k === activeMetric ? ' active' : ''}" data-metric="${k}">${m.label}</button>` | |
| ).join(''); | |
| box.querySelectorAll('.metric-chip').forEach(btn => { | |
| btn.addEventListener('click', () => { | |
| activeMetric = btn.dataset.metric; | |
| setupMetricSwitch(); | |
| setupTabs(); | |
| setupSearch(); | |
| buildMetricChart(); | |
| }); | |
| }); | |
| } | |
| function buildMetricChart() { | |
| const canvas = document.getElementById('metricChart'); | |
| if (!canvas) return; | |
| const existing = Chart.getChart(canvas); | |
| if (existing) existing.destroy(); | |
| const metric = activeMetric; | |
| const meta = METRICS[metric]; | |
| document.getElementById('metric-title').innerHTML = meta.label; | |
| const sorted = getFilteredModels() | |
| .filter(d => typeof d[metric] === 'number') | |
| .filter(d => (meta.cap === undefined || d[metric] <= meta.cap) && | |
| (meta.min === undefined || d[metric] >= meta.min)) | |
| .sort((a, b) => meta.lowerBetter ? a[metric] - b[metric] : b[metric] - a[metric]); | |
| // never drop a model silently: anything outside a zoomed axis is called out | |
| const off = getFilteredModels().filter(d => typeof d[metric] === 'number') | |
| .filter(d => (meta.min !== undefined && d[metric] < meta.min) || | |
| (meta.cap !== undefined && d[metric] > meta.cap)); | |
| document.getElementById('metric-sub').innerHTML = meta.sub + | |
| (off.length ? ` · off scale: ${off.map(d => `${d.name} (${d[metric]})`).join(', ')}` : ''); | |
| // one row per model, so the labels stay readable however many models there are | |
| canvas.parentElement.style.height = Math.max(220, sorted.length * 21 + 46) + 'px'; | |
| const fmt = v => meta.unit === '%' ? v.toFixed(1) + '%' : (v >= 100 ? v.toExponential(2) : v.toFixed(2)); | |
| new Chart(canvas, { | |
| type: 'bar', | |
| data: { | |
| labels: sorted.map(d => d.name), | |
| datasets: [{ | |
| // a bar from zero is meaningless on a log perplexity axis, so that | |
| // metric is drawn as a dot plot instead | |
| type: meta.dot ? 'scatter' : 'bar', | |
| data: meta.dot | |
| ? sorted.map((d, i) => ({ x: d[metric], y: i })) | |
| : sorted.map(d => d[metric]), | |
| backgroundColor: sorted.map(d => meta.dot ? colorMap[d.org] : bgMap[d.org]), | |
| borderColor: sorted.map(d => colorMap[d.org]), | |
| borderWidth: 1, | |
| borderRadius: 3, | |
| borderSkipped: false, | |
| pointRadius: 4.5, | |
| pointHoverRadius: 6.5, | |
| barPercentage: 0.82, | |
| categoryPercentage: 0.9 | |
| }] | |
| }, | |
| options: { | |
| indexAxis: 'y', | |
| responsive: true, | |
| maintainAspectRatio: false, | |
| animation: { duration: 450, easing: 'easeOutQuart' }, | |
| plugins: { | |
| tooltip: { | |
| callbacks: { | |
| label: ctx => `${fmt(ctx.parsed.x)} Β· ${sorted[ctx.dataIndex].params} params` | |
| }, | |
| ...tooltipStyle | |
| } | |
| }, | |
| scales: { | |
| x: { | |
| type: meta.lowerBetter ? 'logarithmic' : 'linear', | |
| beginAtZero: !meta.lowerBetter && meta.min === undefined, | |
| min: meta.min, | |
| max: meta.max, | |
| grid: { color: 'rgba(48,54,61,0.6)', drawBorder: false }, | |
| ticks: { color: '#8b949e', callback: v => meta.unit === '%' ? v + '%' : v } | |
| }, | |
| y: { | |
| type: 'category', | |
| grid: { display: false }, | |
| ticks: { | |
| color: '#8b949e', | |
| font: { size: 10 }, | |
| autoSkip: false, | |
| callback: function(v) { | |
| const l = this.getLabelForValue(v); | |
| return l.length > 22 ? l.slice(0, 21) + 'β¦' : l; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }); | |
| } | |
| function buildEfficiencyChart() { | |
| const canvas = document.getElementById('efficiencyChart'); | |
| const existing = Chart.getChart(canvas); | |
| if (existing) existing.destroy(); | |
| const valid = getFilteredModels() | |
| .filter(d => getScore(d) >= 0) | |
| .filter(d => d.name !== 'MicroSupra-1k') | |
| .map(d => ({ ...d, paramsNum: parseParams(d.params), avgScore: getScore(d) })) | |
| .filter(d => !isNaN(d.paramsNum) && d.paramsNum > 0); | |
| if (valid.length < 2) return; | |
| const ranked = [...valid].sort((a, b) => b.avgScore - a.avgScore); | |
| const rankMap = new Map(); | |
| ranked.forEach((m, i) => rankMap.set(m.name, i + 1)); | |
| valid.forEach(m => m.rank = rankMap.get(m.name)); | |
| const logP = valid.map(d => Math.log10(d.paramsNum)); | |
| const scores = valid.map(d => d.avgScore); | |
| const n = valid.length; | |
| const sx = logP.reduce((a, v) => a + v, 0); | |
| const sy = scores.reduce((a, v) => a + v, 0); | |
| const sxy = logP.reduce((a, v, i) => a + v * scores[i], 0); | |
| const sx2 = logP.reduce((a, v) => a + v * v, 0); | |
| const slope = (n * sxy - sx * sy) / (n * sx2 - sx * sx); | |
| const intercept = (sy - slope * sx) / n; | |
| const res = valid.map(d => d.avgScore - (intercept + slope * Math.log10(d.paramsNum))); | |
| const resStd = Math.sqrt(res.reduce((a, v) => a + v * v, 0) / n); | |
| const shift = Math.max(resStd, 3); | |
| const sorted = [...valid].sort((a, b) => a.paramsNum - b.paramsNum); | |
| const axMin = 500, axMax = 1.5e8; | |
| const regData = [], threshData = []; | |
| for (let i = 0; i <= 80; i++) { | |
| const lx = Math.log10(axMin) + (Math.log10(axMax) - Math.log10(axMin)) * (i / 80); | |
| const x = Math.pow(10, lx); | |
| regData.push({ x, y: intercept + slope * lx }); | |
| threshData.push({ x, y: intercept + slope * lx + shift }); | |
| } | |
| new Chart(canvas, { | |
| type: 'line', | |
| data: { | |
| datasets: [ | |
| { | |
| label: 'Models', | |
| data: sorted.map(d => ({ x: d.paramsNum, y: d.avgScore })), | |
| showLine: false, | |
| backgroundColor: sorted.map(d => colorMap[d.org]), | |
| borderColor: sorted.map(d => colorMap[d.org]), | |
| pointRadius: 6, | |
| pointHoverRadius: 9 | |
| }, | |
| { | |
| label: 'Trend', | |
| data: regData, | |
| showLine: true, | |
| borderColor: 'rgba(255,200,0,0.5)', | |
| borderWidth: 1.5, | |
| borderDash: [4, 4], | |
| pointRadius: 0, | |
| fill: false | |
| }, | |
| { | |
| label: 'Threshold', | |
| data: threshData, | |
| showLine: true, | |
| borderColor: 'rgba(255,200,0,0.8)', | |
| borderWidth: 2, | |
| borderDash: [6, 4], | |
| pointRadius: 0, | |
| fill: false | |
| } | |
| ] | |
| }, | |
| options: { | |
| parsing: false, | |
| responsive: true, | |
| maintainAspectRatio: true, | |
| animation: { duration: 700, easing: 'easeOutQuart' }, | |
| scales: { | |
| x: { | |
| type: 'logarithmic', | |
| min: axMin, | |
| max: axMax, | |
| title: { display: true, text: 'Parameters', color: '#8b949e' }, | |
| grid: { drawBorder: false }, | |
| ticks: { | |
| color: '#8b949e', | |
| callback: v => v >= 1e6 | |
| ? (v / 1e6).toFixed(v >= 1e7 ? 0 : 1) + 'M' | |
| : v >= 1e3 | |
| ? (v / 1e3).toFixed(v >= 1e4 ? 0 : 1) + 'K' | |
| : v.toString() | |
| } | |
| }, | |
| y: { | |
| title: { display: true, text: 'Leaderboard Score (avg of available benchmarks)', color: '#8b949e' }, | |
| min: 20, | |
| max: 80, | |
| grid: { drawBorder: false }, | |
| ticks: { color: '#8b949e', callback: v => v + '%' } | |
| } | |
| }, | |
| plugins: { | |
| legend: { display: false }, | |
| tooltip: { | |
| callbacks: { | |
| label: ctx => { | |
| if (ctx.dataset.label !== 'Models') return ''; | |
| const d = sorted[ctx.dataIndex]; | |
| return `#${d.rank} ${d.name}: ${d.params}, ${d.avgScore.toFixed(1)}%`; | |
| } | |
| }, | |
| ...tooltipStyle | |
| } | |
| } | |
| }, | |
| plugins: [ | |
| { | |
| id: 'zone', | |
| beforeDraw(chart) { | |
| const ctx = chart.ctx, xs = chart.scales.x, ys = chart.scales.y; | |
| const { left, right, top, bottom } = chart.chartArea; | |
| const lY = intercept + slope * Math.log10(Math.max(xs.min, 1)) + shift; | |
| const rY = intercept + slope * Math.log10(Math.max(xs.max, 1)) + shift; | |
| ctx.save(); | |
| ctx.beginPath(); | |
| ctx.rect(left, top, right - left, bottom - top); | |
| ctx.clip(); | |
| ctx.beginPath(); | |
| ctx.moveTo(left, ys.getPixelForValue(lY)); | |
| ctx.lineTo(left, top); | |
| ctx.lineTo(right, top); | |
| ctx.lineTo(right, ys.getPixelForValue(rY)); | |
| ctx.closePath(); | |
| ctx.fillStyle = 'rgba(255,230,0,0.06)'; | |
| ctx.fill(); | |
| ctx.restore(); | |
| } | |
| }, | |
| { | |
| id: 'rankLabels', | |
| afterDatasetsDraw(chart) { | |
| const ctx = chart.ctx; | |
| const meta = chart.getDatasetMeta(0); | |
| const medalColors = { 1: '#ffd700', 2: '#c0c0c0', 3: '#cd7f32' }; | |
| meta.data.forEach((point, i) => { | |
| const d = sorted[i]; | |
| if (d.rank <= 3) { | |
| ctx.save(); | |
| ctx.font = '700 10px -apple-system,BlinkMacSystemFont,sans-serif'; | |
| ctx.fillStyle = medalColors[d.rank]; | |
| ctx.textAlign = 'left'; | |
| ctx.textBaseline = 'middle'; | |
| ctx.fillText(`#${d.rank}`, point.x + 11, point.y - 1); | |
| ctx.restore(); | |
| } | |
| }); | |
| } | |
| } | |
| ] | |
| }); | |
| } | |
| /* βββ Org Count βββ */ | |
| /* βββ Toggle Banner βββ */ | |
| function toggleUnknownBanner() { | |
| const expand = document.getElementById('banner-expand'); | |
| const hint = document.getElementById('banner-hint'); | |
| if (!expand) return; | |
| const isOpen = expand.classList.contains('open'); | |
| expand.classList.toggle('open'); | |
| if (hint) hint.classList.toggle('rotated'); | |
| } | |
| /* βββ Views βββ */ | |
| let activeView = 'table'; | |
| function setView(view) { | |
| activeView = view; | |
| document.querySelectorAll('#tabbar .tab').forEach(t => | |
| t.classList.toggle('active', t.dataset.view === view)); | |
| const map = { table: 'table-section', charts: 'charts-section', | |
| timeline: 'timeline-section', efficiency: 'efficiency-section' }; | |
| Object.entries(map).forEach(([k, id]) => { | |
| const el = document.getElementById(id); | |
| if (el) el.hidden = k !== view; | |
| }); | |
| // Chart.js can't measure a hidden canvas, so draw on reveal | |
| if (view === 'charts') buildMetricChart(); | |
| if (view === 'efficiency') buildEfficiencyChart(); | |
| window.scrollTo({ top: 0, behavior: 'smooth' }); | |
| } | |
| function setupTabs() { | |
| document.querySelectorAll('#tabbar .tab').forEach(t => | |
| t.addEventListener('click', () => setView(t.dataset.view))); | |
| } | |
| /* βββ Init βββ */ | |
| window.addEventListener('DOMContentLoaded', () => { | |
| renderStats(); | |
| buildFilters(); | |
| setupSortControl(); | |
| setupMetricSwitch(); | |
| setupTabs(); | |
| setupSearch(); | |
| renderFilteredViews(); | |
| }); | |
| </script> | |
| </body> | |
| </html> | |