fdaudens's picture
fdaudens HF staff
Update index.html
dedcdf5 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🤗 Open-source AI: year in review 2024</title>
<style>
body {
font-family: system-ui, -apple-system, sans-serif;
background: #f8f9fa;
margin: 0;
padding: 20px;
min-height: 100vh;
}
h1 {
color: #1a1a1a;
margin-bottom: 20px;
}
.intro {
max-width: 800px;
margin: 0 auto 40px;
text-align: center;
line-height: 1.6;
color: #374151;
}
.calendar {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.card {
aspect-ratio: 1;
background: #6B7280;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
font-weight: bold;
color: white;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.card.active {
background: #FFD21E;
transform: translateY(-2px);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
.card.opened {
background: #FF9D00;
}
.card-content {
display: none;
padding: 20px;
text-align: center;
}
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
z-index: 1000;
justify-content: center;
align-items: center;
}
.modal-content {
background: white;
padding: 40px;
border-radius: 12px;
max-width: 800px;
width: 90%;
max-height: 90vh;
overflow-y: auto;
position: relative;
}
.close-button {
position: absolute;
top: 20px;
right: 20px;
background: none;
border: none;
font-size: 24px;
cursor: pointer;
}
.responsive-iframe-container {
position: relative;
width: 100%;
height: 500px; /* Default height */
transition: all 0.3s ease;
}
.responsive-iframe-container iframe {
width: 100%;
height: 100%;
border: none;
}
.browser-fullscreen {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 9999;
background: white;
}
</style>
</head>
<body>
<div class="intro">
<h1>🤗 Open-source AI: year in review 2024</h1>
<p>We're excited to share what's been happening in AI this year—with a twist! In collaboration with <a href="https://aiworld.eu" target="_blank">aiworld.eu</a>, starting December 2, we'll release fresh content daily to share insights on what happened in open-source AI in 2024. Like the space to be notified when we release the next data! <img src="logos/huggingface_logo-noborder.svg" width="20"> <img src="logos/aiworld.svg" width="20"></p>
</div>
<div class="calendar">
<!-- Cards will be generated here -->
</div>
<div class="modal">
<div class="modal-content">
<button class="close-button">&times;</button>
<div class="modal-body"></div>
</div>
</div>
<script>
const calendar = document.querySelector('.calendar');
const modal = document.querySelector('.modal');
const modalContent = document.querySelector('.modal-body');
const closeButton = document.querySelector('.close-button');
// Add the cardContents object here
const cardContents = {
1: `
<h2>Day 1 - Six Predictions for AI in 2025 (and a review of how my 2024 predictions turned out)</h2>
<div style="display: flex; align-items: center; margin-bottom: 20px;">
<img src="https://cdn-avatars.huggingface.co/v1/production/uploads/1583857146757-5e67bdd61009063689407479.jpeg" style="width: 60px; height: 60px; border-radius: 50%; margin-right: 15px;">
<div>
<strong><a href="https://huggingface.co/clem" style="color: inherit; text-decoration: underline;">Clément Delangue</a></strong><br>
<em>Hugging Face CEO</em>
</div>
</div>
<h3>Predictions for 2025</h3>
<ol>
<li>There will be the first major public protest related to AI</li>
<li>A big company will see its market cap divided by two or more because of AI</li>
<li>At least 100,000 personal AI robots will be pre-ordered</li>
<li>China will start to lead the AI race (as a consequence of leading the open-source AI race)</li>
<li>There will be big breakthroughs in AI for biology and chemistry</li>
<li>We will begin to see the economic and employment growth potential of AI, with 15M AI builders on Hugging Face</li>
</ol>
<h3>2024 Predictions Review</h3>
<ul>
<li>A hyped AI company will go bankrupt or get acquired for a ridiculously low price<br>
✅ (Inflexion, AdeptAI,...)</li>
<li>Open-source LLMs will reach the level of the best closed-source LLMs<br>
✅ with QwQ and dozens of others</li>
<li>Big breakthroughs in AI for video, time-series, biology and chemistry<br>
✅ for video 🔴for time-series, biology and chemistry</li>
<li>We will talk much more about the cost (monetary and environmental) of AI<br>
✅Monetary 🔴Environmental (😢)</li>
<li>A popular media will be mostly AI-generated<br>
✅ with NotebookLM by Google</li>
<li>10 millions AI builders on Hugging Face leading to no increase of unemployment<br>
🔜currently 7M of AI builders on Hugging Face</li>
</ul>
<p style="margin-top: 30px;"><i>Join the conversation about Clem's predictions for 2025:</i></p>
<ul style="list-style-type: none; padding-left: 0;">
<li><a href="https://huggingface.co/posts/clem/703679306559358" style="color: inherit; text-decoration: underline;" target="_blank">Hugging Face</a></li>
<li><a href="https://x.com/ClementDelangue/status/1863576648253091934" style="color: inherit; text-decoration: underline;" target="_blank">X</a></li>
<li><a href="https://www.linkedin.com/in/clementdelangue/" style="color: inherit; text-decoration: underline;" target="_blank">LinkedIn</a></li>
<li><a href="https://bsky.app/profile/clem.hf.co/post/3lcdceiv7vk2h" style="color: inherit; text-decoration: underline;" target="_blank">Bluesky</a></li>
</ul>
`,
2: `
<h2>Most liked and downloaded models, from 2022 to today</h2>
<p>Explore the community's favourite models, ranging from tasks, likes to downloads, since 2022. What we're seeing: smol models are on the rise.📈👀</p>
<p><em style="font-size: 0.8em;">💡Tip: Click the small square icon in the top right corner to access full screen view!</em></p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/model/treemap" allowfullscreen></iframe>
</div>
`,
3: `
<h2>Fast & Furious model releases</h2>
<p>This race chart shows cumulative likes for models over the first 48 weeks of 2024, with Meta (US), Stability (UK) and Black Forest Labs (GER) leading the pack.</p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/author/racechart" allowfullscreen></iframe>
</div>
`,
4: `
<h2>Zero to One (Million Models)</h2>
<p>This exponential growth chart tracks the Hugging Face community's journey from just a few thousand models in 2022 to surpassing the million-model milestone today.</p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/tag/stacked-model-count-other" allowfullscreen></iframe>
</div>
`,
5: `
<h2>The HF Network: What your likes say about you</h2>
<p>Network connections between users’ favourite models.</p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/model/network-small" allowfullscreen></iframe>
</div>
`,
6: `
<h2>33 Months of Models, per Task</h2>
<p>Over the last 33 months, more than 1.1M models have been created for 53 specialized tasks. Watch until the end to see which task reigns supreme. 👀 <em>(Hint: this task makes up nearly half the models on the Hub.)</em></p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/pipeline/racechart2" allowfullscreen></iframe>
</div>
`,
7: `
<h2>The global top 500 model creators on the Hub</h2>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/map_country_data" allowfullscreen></iframe>
</div>
`,
8: `
<h2>Average daily downloads for the top 100 trending models for Dec 9 2024</h2>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/model/treemap-top-100-trending" allowfullscreen></iframe>
</div>
`,
9: `
<h2>NeurIPS Noel: Unwrapping the Keywords of AI's Holiday Spirit</h2>
<p>Analyzing keywords from 4,495 papers accepted at NeurIPS 2024 and how the top 40 words co-occur within the same papers.</p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/model/model/keywords-neurips" allowfullscreen></iframe>
</div>
`,
10: `
<h2>The Great AI Bake-Off: Which Field is Rising?</h2>
<p>This stacked chart shows the evolution of the number of research papers on Hugging Face</p>
<div class="responsive-iframe-container">
<button onclick="toggleBrowserFullscreen(this.parentElement)" style="position: absolute; top: 10px; right: 10px; z-index: 10; padding: 8px; background: rgba(0,0,0,0.6); color: white; border: none; border-radius: 4px; cursor: pointer;"></button>
<iframe src="https://aiworld.eu/embed/api/paper/hf_papers_stacked" allowfullscreen></iframe>
</div>
`,
11: `
<h2>Day 11</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
12: `
<h2>Day 12</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
13: `
<h2>Day 13</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
14: `
<h2>Day 14</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
15: `
<h2>Day 15</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
16: `
<h2>Day 16</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
17: `
<h2>Day 17</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
18: `
<h2>Day 18</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
19: `
<h2>Day 19</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
20: `
<h2>Day 20</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
21: `
<h2>Day 21</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
22: `
<h2>Day 22</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
23: `
<h2>Day 23</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`,
24: `
<h2>Day 24</h2>
<p>Wondering what tomorrow’s visualization will be? Like the space to get notified when we reveal it 🤗</p>
<img src="/images/day3-teaser.png" style="width: 100%; margin: 20px 0;">
`
};
// Update the getCardLink function
function getCardLink(day) {
const rootUrl = "https://huggingface.co/spaces/huggingface/open-source-ai-year-in-review-2024";
return `${rootUrl}?day=${day}" target="_blank`;
}
// Add this object before the card creation loop to define custom text labels
const cardLabels = {
1: "🔮<br>Clem's2025 predictions",
2: "❤️<br>Most liked & downloaded models",
3: "🏎️<br>Fast & Furious model releases",
4: "🚀<br>Zero to One (Million Models)",
5: "🤗<br>What your likes say about you?",
6: "🏷️<br>Tasks on tasks on tasks",
7: "🌍<br>Global top 500 model creators",
8: "📈<br>Average daily downloads",
9: "🎄<br>NeurIPS Noel",
10: "🎂<br>The Great AI Bake-Off",
// Add more custom labels as needed
// 3: "Custom Text",
// 4: "Another Label",
};
// Modify the card creation loop
for (let i = 1; i <= 24; i++) {
const card = document.createElement('div');
card.className = 'card';
card.dataset.day = i;
card.dataset.link = getCardLink(i);
// Define a condition to use a thumbnail for specific cards
const useThumbnail = [].includes(i);
// Get custom label if it exists, otherwise use the number
const cardContent = useThumbnail
? `<img src="images/${i}.png" style="width: 75%; height: 75%; object-fit: cover; border-radius: 12px;">`
: `<div style="text-align: center; margin: 0 20%;">${cardLabels[i] || i}</div>`;
card.innerHTML = `
${cardContent}
<div class="card-content">
${cardContents[i]}
<div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #eee;">
<p><em style="font-size: 0.8em;">💡Tip: Click the small square icon in the top right corner to access full screen view!</em></p>
<p style="font-size: 0.8em;">🔗 Share this card:</p><input type="text" value="${getCardLink(i)}" readonly style="width: 100%; padding: 8px; margin: px 0; border: 1px solid #ddd; border-radius: 4px; background: #f5f5f5; font-size: 0.8em;" onclick="this.select(); document.execCommand('copy');">
</div>
</div>
`;
calendar.appendChild(card);
}
// Handle card clicks
const cards = document.querySelectorAll('.card');
const activeDays = [1,2,3,4,5,6,7,8,9,10]; // Add the day numbers you want to highlight
cards.forEach(card => {
const day = parseInt(card.dataset.day);
// Only add active class to specific cards
if (activeDays.includes(day)) {
card.classList.add('active');
}
// Keep click functionality for all cards
card.addEventListener('click', () => {
card.classList.add('opened');
modalContent.innerHTML = card.querySelector('.card-content').innerHTML;
modal.style.display = 'flex';
});
});
// Close modal
closeButton.addEventListener('click', () => {
modal.style.display = 'none';
});
modal.addEventListener('click', (e) => {
if (e.target === modal) {
modal.style.display = 'none';
}
});
// Add fullscreen function
function toggleBrowserFullscreen(container) {
container.classList.toggle('browser-fullscreen');
}
// Add this code after your existing event listeners
// Handle direct links to cards
window.addEventListener('load', () => {
const params = new URLSearchParams(window.location.search);
const day = params.get('day');
if (day) {
const card = document.querySelector(`[data-day="${day}"]`);
if (card) {
card.click(); // Automatically open the modal for the linked card
}
}
});
</script>
</body>
</html>