Science Timeline
The org card can't display JS HTML embedded in the markdown. So the workaround is to render it in a model card (here) and export the rendered HTML. Steps:
- Edit the
const releases section in embedded HTML here with the new release data
- Export the static HTML with the buttons below
- If you are nice, prettify the resulting HTML
- Copy-paste the result into the Org README
- Tada!
<style>
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; }
.timeline-container { max-width: 1000px; margin: 20px auto; padding: 20px; background: white; border-radius: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
.timeline-row { display: flex; margin-bottom: 20px; min-height: 120px; position: relative; }
.timeline-row.reverse { flex-direction: row-reverse; }
.month-box { flex: 1; padding: 10px; text-align: center; position: relative; }
.month-arrow { width: 0; height: 0; border-top: 8px solid transparent; border-bottom: 8px solid transparent; border-left: 12px solid #666; margin: 0 auto 8px; }
.reverse .month-arrow { border-left: none; border-right: 12px solid #666; }
.month-title { font-weight: 600; font-size: 12px; color: #666; text-transform: uppercase; margin-bottom: 8px; }
.event-list { font-size: 11px; color: #333; }
.event-item { margin: 3px 0; padding: 2px 4px; background: #f8f9fa; border-radius: 3px; }
.timeline-row::before { content: ''; position: absolute; top: 12px; left: 0; right: 0; height: 1px; background: #ddd; z-index: 1; }
.month-box { z-index: 2; background: white; }
</style>
<!-- ADD THESE BUTTONS WHEREVER YOU WANT THEM -->
<div style="margin: 20px 0;">
<button onclick="exportStaticHTML()" style="background: #007bff; color: white; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer; margin-right: 10px;">๐ Export Static HTML</button>
<button onclick="copyToClipboard()" style="background: #28a745; color: white; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer;">๐ Copy to Clipboard</button>
</div>
<div id="static-output" style="display: none;"></div>
<div id="snake-timeline-container" style="max-width: 1000px; margin: 20px auto; padding: 20px; background: white; border-radius: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
Loading timeline...
</div>
<script>
// Release data with links
const releases = [
{ month: "2024-01", name: "๐ฅ Warming up", link: null },
{ month: "2024-02", name: "โ๏ธ Nanotron Release", link: "https://github.com/huggingface/nanotron/" },
{ month: "2024-02", name: "โ
Lighteval Release", link: "https://github.com/huggingface/lighteval/" },
{ month: "2024-02", name: "โ๏ธ Datatrove Release", link: "https://github.com/huggingface/datatrove/" },
{ month: "2024-02", name: "โญ๏ธ The Stack v2", link: "https://huggingface.co/datasets/bigcode/the-stack-v2" },
{ month: "2024-02", name: "โญ๏ธ StarCoder2", link: "https://huggingface.co/bigcode/starcoder2-15b" },
{ month: "2024-03", name: "๐ช Zephyr Gemma", link: "https://huggingface.co/HuggingFaceH4/zephyr-7b-gemma-v0.1" },
{ month: "2024-03", name: "๐ช Cosmopedia", link: "https://huggingface.co/datasets/HuggingFaceTB/cosmopedia" },
{ month: "2024-04", name: "๐ท FineWeb", link: "https://huggingface.co/datasets/HuggingFaceFW/fineweb" },
{ month: "2024-04", name: "๐ต๏ธ JAT Agent", link: "https://huggingface.co/blog/jat" },
{ month: "2024-04", name: "๐ช Zephyr Mixtral", link: "HuggingFaceH4/zephyr-orpo-141b-A35b-v0.1" },
{ month: "2024-04", name: "๐ถ Idefics 2", link: "https://huggingface.co/HuggingFaceM4/idefics2-8bb" },
{ month: "2024-04", name: "๐ Community Leaderboards", link: "https://huggingface.co/blog/leaderboard-medicalllm" },
{ month: "2024-05", name: "๐ฆพ LeRobot Release", link: "https://github.com/huggingface/lerobot" },
{ month: "2024-05", name: "๐ WSD Analysis", link: "https://arxiv.org/abs/2405.18392" },
{ month: "2024-06", name: "๐ท FineWeb Report", link: "https://huggingface.co/spaces/HuggingFaceFW/blogpost-fineweb-v1f" },
{ month: "2024-06", name: "๐ท FineWeb-Edu", link: "https://huggingface.co/datasets/HuggingFaceFW/fineweb-edu" },
{ month: "2024-06", name: "๐บ Florence 2 Blog", link: "https://huggingface.co/blog/finetune-florence2" },
{ month: "2024-06", name: "๐ Open LLM Leaderboard v2", link: "https://huggingface.co/spaces/open-llm-leaderboard/blog" },
{ month: "2024-06", name: "๐ฉโ๐ซ Stanford CS25", link: "https://www.youtube.com/watch?v=jm2hyJLFfN8" },
{ month: "2024-07", name: "๐ Ring attention", link: "https://x.com/Haojun_Zhao14/status/1815419356408336738" },
{ month: "2024-07", name: "๐ฆพ LeRobot TeleOps", link: "https://x.com/RemiCadene/status/1805583409382932620" },
{ month: "2024-07", name: "๐ฅ Win AIMO", link: "https://x.com/_lewtun/status/1808898804822720769" },
{ month: "2024-07", name: "๐ถ Docmatix", link: "https://huggingface.co/blog/docmatix" },
{ month: "2024-07", name: "๐ค SmolLM", link: "https://huggingface.co/blog/smollm" },
{ month: "2024-08", name: "๐ฆพ LeRobot Tutorial", link: "https://github.com/huggingface/lerobot/blob/main/examples/7_get_started_with_real_robot.md" },
{ month: "2024-08", name: "๐ฃ Speech-to-Speech", link: "https://github.com/huggingface/speech-to-speech" },
{ month: "2024-08", name: "๐ถ Idefics 3", link: "https://huggingface.co/HuggingFaceM4/Idefics3-8B-Llama3" },
{ month: "2024-08", name: "๐ค Instant SmolLM", link: "https://huggingface.co/spaces/HuggingFaceTB/instant-smollm" },
{ month: "2024-09", name: "๐ฆพ LeRobot Video", link: "https://x.com/alibert_s/status/1828760527730082024" },
{ month: "2024-09", name: "๐ฅ FineVideo", link: "https://huggingface.co/spaces/HuggingFaceFV/FineVideo-Explorer" },
{ month: "2024-09", name: "๐ฃ Speech-to-Speech Multilingual", link: "https://x.com/andi_marafioti/status/1830862304906268725" },
{ month: "2024-10", name: "๐ LLM Evaluation Guidebook", link: "https://github.com/huggingface/evaluation-guidebook" },
{ month: "2024-10", name: "๐ฆพ LeRobot Hackathon", link: "https://x.com/Thom_Wolf/status/1851557379294286176" },
{ month: "2024-10", name: "๐บ๏ธ FineTasks", link: "https://huggingface.co/spaces/HuggingFaceFW/blogpost-fine-tasks" },
{ month: "2024-10", name: "โ
Lighteval now Multilingual", link: "https://x.com/nathanhabib1011/status/1849160216438587466" },
{ month: "2024-11", name: "๐ค SmolLM2", link: "https://huggingface.co/HuggingFaceTB/SmolLM2-1.7B-Instruct" },
{ month: "2024-11", name: "๐ค SmolVLM", link: "https://huggingface.co/HuggingFaceTB/SmolVLM-Instruct" },
{ month: "2024-12", name: "๐ข Number Tokenization Blog", link: "https://huggingface.co/spaces/huggingface/number-tokenization-blog" },
{ month: "2024-12", name: "๐ฅ FineWeb 2", link: "https://huggingface.co/datasets/HuggingFaceFW/fineweb-2" },
{ month: "2024-12", name: "๐ Scaling Test Time Compute", link: "https://huggingface.co/spaces/HuggingFaceH4/blogpost-scaling-test-time-compute" },
{ month: "2024-12", name: "๐ค Picotron", link: "https://github.com/huggingface/picotron" },
{ month: "2024-12", name: "๐ FineMath", link: "https://huggingface.co/datasets/HuggingFaceTB/finemath" },
// 2025
{ month: "2025-01", name: "๐งฎ Math Verify", link: "https://x.com/HKydlicek/status/1881734376696041659" },
{ month: "2025-01", name: "๐ณ Open-R1", link: "https://github.com/huggingface/open-r1" },
{ month: "2025-01", name: "๐ ๏ธ SmolAgents", link: "https://huggingface.co/docs/smolagents" },
{ month: "2025-02", name: "๐ฅ SmolVLM2", link: "https://huggingface.co/blog/smolvlm2" },
{ month: "2025-02", name: "๐ช Ultra-Scale Playbook", link: "https://huggingface.co/spaces/nanotron/ultrascale-playbook" },
{ month: "2025-02", name: "๐ OpenR1-Math-220k", link: "https://huggingface.co/datasets/open-r1/OpenR1-Math-220k" },
{ month: "2025-02", name: "๐บ DABstep", link: "https://huggingface.co/blog/dabstep" },
{ month: "2025-02", name: "๐ Open Deep Research", link: "https://huggingface.co/blog/open-deep-research" },
{ month: "2025-02", name: "๐ SmolLM2 report", link: "https://huggingface.co/papers/2502.02737" },
{ month: "2025-02", name: "๐ค Pi0 Integration", link: "https://x.com/RemiCadene/status/1886823939856589296" },
{ month: "2025-03", name: "๐ SmolDocling", link: "https://huggingface.co/ds4sd/SmolDocling-256M-preview" },
{ month: "2025-03", name: "๐งโ๐ DCLM-edu", link: "https://huggingface.co/datasets/HuggingFaceTB/dclm-edu" },
{ month: "2025-03", name: "๐พ Stack-edu", link: "https://huggingface.co/datasets/HuggingFaceTB/stack-edu" },
{ month: "2025-03", name: "๐
Olympic Coder", link: "https://huggingface.co/open-r1/OlympicCoder-7B" },
{ month: "2025-03", name: "๐
Leaderboard Sunset", link: "https://x.com/clefourrier/status/1900280339613860057" },
{ month: "2025-03", name: "๐ Find a Leaderboard", link: "https://huggingface.co/spaces/OpenEvals/find-a-leaderboard" },
{ month: "2025-03", name: "๐ LeKiwi", link: "https://x.com/RemiCadene/status/1896535455325442390" },
{ month: "2025-04", name: "๐ช YourBench", link: "https://huggingface.co/spaces/yourbench/demo" },
{ month: "2025-04", name: "๐ฆพ SO-101", link: "https://x.com/RemiCadene/status/1916751964807057515" },
{ month: "2025-04", name: "๐งโ๐ DeepLearning AI Agent Course", link: "https://x.com/DeepLearningAI/status/1915081924302839984" },
{ month: "2025-05", name: "๐ค nanoVLM", link: "https://github.com/huggingface/nanoVLM" },
{ month: "2025-05", name: "๐ OpenR1-Codeforces", link: "https://huggingface.co/datasets/open-r1/codeforces" },
{ month: "2025-05", name: "๐ง Mixture of Thoughts", link: "https://huggingface.co/datasets/open-r1/Mixture-of-Thoughts" },
{ month: "2025-05", name: "๐ป Open Computer Agent", link: "https://huggingface.co/spaces/smolagents/computer-agent" },
{ month: "2025-05", name: "๐ฃ Reachy Mini", link: "https://x.com/Thom_Wolf/status/1928103448970473962" },
{ month: "2025-06", name: "๐ค LeRobot Hackathon", link: "https://x.com/RemiCadene/status/1917118988959813699" },
{ month: "2025-06", name: "๐ค SmolVLA", link: "https://huggingface.co/collections/lerobot/smolvla-683c072ec3ef6ab0fcb87e60" },
{ month: "2025-06", name: "๐ฅ๏ธ ScreenSuite", link: "https://github.com/huggingface/screensuite" }
];
function createSnakeTimeline() {
// Group by month
const grouped = {};
releases.forEach(item => {
if (!grouped[item.month]) grouped[item.month] = [];
grouped[item.month].push(item);
});
const months = Object.keys(grouped).sort().reverse(); // Reverse to show latest first
// Create rows of 4 months each
const rows = [];
for (let i = 0; i < months.length; i += 4) {
rows.push(months.slice(i, i + 4));
}
let html = '<div style="font-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', sans-serif; position: relative;">';
rows.forEach((row, rowIndex) => {
const isReverse = rowIndex % 2 === 1;
// For reverse rows, we need to reverse the month order, not the display order
const displayRow = isReverse ? [...row].reverse() : row;
const isLastRow = rowIndex === rows.length - 1;
// Row container - the flex direction should always be normal
html += `<div style="display: flex; margin-bottom: 32px; min-height: 140px; position: relative;">`;
// Horizontal connecting line (aligned with arrows)
html += `<div style="position: absolute; top: 8px; left: 0; right: 0; height: 1px; background: #e0e0e0; z-index: 1;"></div>`;
displayRow.forEach((monthKey, monthIndex) => {
const [year, month] = monthKey.split('-');
const monthName = new Date(year, month - 1).toLocaleString('en', { month: 'short' }).toUpperCase();
const events = grouped[monthKey] || [];
const isYearMarker = month === '01';
// Month container
html += `<div style="flex: 1; padding: 0 15px; text-align: center; position: relative; z-index: 2;">`;
// Arrow (positioned to align with horizontal line) - flipped for reverse chronological order
const arrowStyle = isReverse
? 'width: 0; height: 0; border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-left: 10px solid #666; margin: 2px auto 12px;'
: 'width: 0; height: 0; border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-right: 10px solid #666; margin: 2px auto 12px;';
html += `<div style="${arrowStyle}"></div>`;
// Month title
const titleStyle = isYearMarker
? 'font-weight: 600; font-size: 14px; color: #1a1a1a; background: #f0f0f0; padding: 4px 12px; border-radius: 12px; margin-bottom: 16px; display: inline-block;'
: 'font-weight: 500; font-size: 13px; color: #666; text-transform: uppercase; margin-bottom: 16px; letter-spacing: 0.5px;';
const titleText = isYearMarker ? `${monthName} ${year}` : monthName;
html += `<div style="${titleStyle}">${titleText}</div>`;
// Events
html += `<div style="font-size: 12px; color: #4a4a4a; max-width: 180px; margin: 0 auto; display: flex; flex-direction: column; gap: 6px;">`;
events.forEach(event => {
if (event.link && event.link !== '#') {
// Clickable event with link
html += `<a href="${event.link}" target="_blank" style="text-decoration: none; color: inherit;">
<div style="padding: 6px 8px; background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; line-height: 1.4; transition: all 0.2s ease; box-shadow: 0 1px 2px rgba(0,0,0,0.05); cursor: pointer;" onmouseover="this.style.transform='translateY(-1px)'; this.style.boxShadow='0 2px 4px rgba(0,0,0,0.1)'; this.style.background='#e3f2fd'" onmouseout="this.style.transform='translateY(0)'; this.style.boxShadow='0 1px 2px rgba(0,0,0,0.05)'; this.style.background='#f8f9fa'">${event.name}</div>
</a>`;
} else {
// Non-clickable event
html += `<div style="padding: 6px 8px; background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; line-height: 1.4; color: #6c757d;">${event.name}</div>`;
}
});
html += `</div>`;
html += `</div>`; // Close month container
});
// Add vertical connector if not the last row
if (!isLastRow) {
const connectorStyle = isReverse
? 'position: absolute; width: 1px; height: calc(100% + 32px); background: #e0e0e0; top: 8px; left: 0; z-index: 1;'
: 'position: absolute; width: 1px; height: calc(100% + 32px); background: #e0e0e0; top: 8px; right: 0; z-index: 1;';
html += `<div style="${connectorStyle}"></div>`;
}
html += `</div>`; // Close row
});
html += '</div>';
// Insert the timeline
const container = document.getElementById('snake-timeline-container');
if (container) {
container.innerHTML = html;
}
return html;
}
// Export functions - ADD THESE TO YOUR EXISTING SCRIPT
function exportStaticHTML() {
const staticHTML = createSnakeTimeline();
const output = document.getElementById('static-output');
if (!output) {
// Create output div if it doesn't exist
const outputDiv = document.createElement('div');
outputDiv.id = 'static-output';
outputDiv.style.cssText = 'background: #f8f9fa; border: 1px solid #ddd; padding: 15px; border-radius: 6px; font-family: monospace; font-size: 12px; max-height: 300px; overflow-y: auto; white-space: pre-wrap; word-break: break-all; margin-top: 15px;';
document.body.appendChild(outputDiv);
}
output.style.display = 'block';
output.textContent = `<div id="snake-timeline-container" style="max-width: 1000px; margin: 20px auto; padding: 20px; background: white; border-radius: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.1);">
${staticHTML}
</div>`;
}
function copyToClipboard() {
const output = document.getElementById('static-output');
if (output && output.textContent) {
navigator.clipboard.writeText(output.textContent).then(() => {
alert('โ
Static HTML copied to clipboard!');
});
} else {
alert('โ ๏ธ Please export first!');
}
}
// Run with multiple fallbacks
setTimeout(createSnakeTimeline, 100);
setTimeout(createSnakeTimeline, 500);
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', createSnakeTimeline);
} else {
createSnakeTimeline();
}
</script>