| layout | default |
|---|---|
| title | Releases & Changelog |
| description | Latest updates across ABC mods, packs, and resources. |
| permalink | /changelog/ |
Sorted by latest update time
No releases found yet. Add entries to
data/mods.json or data/modpacks.json.${item.short_description || item.description || 'No description available.'}
${versions || 'All versions'}
${categories}
Updated ${updated}
${(item.downloads || 0).toLocaleString()} downloads
${(item.followers || 0).toLocaleString()} followers
${item.download ? ` View Project` : ''}
${item.source_url ? ` Source` : ''}
`;
}
async function fetchJson(url) {
try {
const res = await fetch(url);
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
return await res.json();
} catch (err) {
console.warn('Changelog fetch failed', err);
return [];
}
}
async function loadChangelog() {
const [mods, modpacks] = await Promise.all([
fetchJson('{{ '/data/mods.json' | relative_url }}'),
fetchJson('{{ '/data/modpacks.json' | relative_url }}')
]);
const items = [...mods, ...modpacks].map(item => ({
...item,
updated: item.updated || item.date_modified || item.published || null,
})).filter(item => item);
if (!items.length) {
emptyEl.style.display = 'block';
countEl.textContent = '';
return;
}
items.sort((a, b) => {
const dateA = new Date(a.updated || 0).getTime();
const dateB = new Date(b.updated || 0).getTime();
return dateB - dateA;
});
listEl.innerHTML = items.map(renderCard).join('');
countEl.textContent = `${items.length} releases`;
}
loadChangelog();
});
</script>