Jake Paul and Anthony Joshua’s outlandish end of 12 months mismatch is definitely happening tonight in Miami.
The heavyweight clash headlines an evening of motion on Netflix that features legendary MMA fighters, Olympians and a historic women’s title fight. All of it takes place on the Kaseya Center, with motion starting at 4.45pm local time.
What’s your final Jake Paul vs Anthony Joshua prediction?
The professionals have had their say on 2025’s most controversial fight. Now it is time so that you can tell us how it can play out.
Former UFC champions Tyron Woodley and Anderson Silva will clash in a showcase bout on the fundamental card. But the massive headline is a co-main event between Alyicia Baumgardner and Leila Beaudoin that may be for undisputed if the WBC hadn’t refused to sanction a bout under men’s rules.
Then the fundamental event arrives as Jake Paul finally silences every considered one of his doubters by facing the two-time heavyweight champion Anthony Joshua. He was outweighed by almost 30lb at weigh-ins yesterday, and is at the very least five inches shorter than his rival.
After years of being told he only fights much older opponents who’re half his size, Paul now takes on arguably considered one of the hardest challenges in boxing pound-for-pound. And despite the bout being a monstrous mismatch, he seems confident in his abilities.
We may have live updates throughout the night from this massive fight right here on the Bloody Elbow live blog. Ensure that to enroll to Talking Points above and stay in contact throughout the night together with your opinions and predictions.
Welcome to the Bloody Elbow live blog
My name is Donagh Corby and I shall be keeping you updated throughout the night right here on Bloody Elbow. You possibly can get in contact with us via Talking Points, which you’ll be able to see above. Ensure that to comment and interact, I’ll be right there with you throughout the night.
As for the motion within the ring, we’re in for an interesting night of motion as Jake Paul finally makes the step as much as not only the world level however the true heavyweight division to tackle the two-time champion Anthony Joshua!
const postId = 280814;
let modifiedDate = “2025-12-19T19:48:09+00:00”;
// creates a timestamp cachebuster rounded to nearest 30 seconds threshold
function getLiveBlogCacheBusterTimestamp() {
const now = latest Date();
// Get current UTC time components
const minutes = now.getUTCMinutes();
const seconds = now.getUTCSeconds();
// Round as much as the closest 30 seconds
const roundedSeconds = Math.ceil(seconds / 30) * 30;
// Adjust minutes and seconds
let roundedDate = latest Date(Date.UTC(
now.getUTCFullYear(),
now.getUTCMonth(),
now.getUTCDate(),
now.getUTCHours(),
minutes,
roundedSeconds
));
// Convert to Unix timestamp
return Math.floor(roundedDate.getTime() / 1000);
}
function getPollingEndpointUrl(postId) {
const baseUrl = “/wp-json/grv-live-blog/v1/post-modified-date”;
const cacheBuster = getLiveBlogCacheBusterTimestamp();
return `${baseUrl}?post_id=${postId}&t=${encodeURIComponent(cacheBuster)}`;
}
function getUpdatedEventEndpointUrl(postId) {
const baseUrl = “/wp-json/grv-live-blog/v1/get-updated-events”;
const cacheBuster = getLiveBlogCacheBusterTimestamp();
return `${baseUrl}?post_id=${postId}&t=${encodeURIComponent(cacheBuster)}`;
}
function showRefreshButton() {
const refresh_btn = document.getElementById(“glb-btn”);
refresh_btn.style.display = “block”;
}
function hideRefreshButton() {
const refresh_btn = document.getElementById(“glb-btn”);
refresh_btn.style.display = “none”;
}
function jumpToLatestEvent() {
hideRefreshButton();
const element = document.querySelector(“.wp-block-grvmedia-grv-live-blog”);
// Scroll to the element
if (element) {
element.scrollIntoView({ behavior: “smooth”, block: “start” });
}
}
function createPointItem(item) {
// Create the
const li = document.createElement(“li”);
li.appendChild(document.createTextNode(item.headline));
const a = document.createElement(“a”);
a.href = `#${item.anchorId}`; // Set the href attribute
a.innerHTML = `View post
`; // Set the text content
li.appendChild(a);
return li;
}
function addScriptSrcToHead(src) {
let s = document.createElement(“script”);
// expectation is that that is the primary script element in the pinnacle
let insertion = document.getElementsByTagName(“script”)[0];
s.async = true;
s.src = src;
insertion.parentNode.insertBefore(s, insertion);
}
function refreshScripts( fragment ) {
let scripts = fragment.querySelectorAll(“script”);
for ( let script of scripts ) {
let freshScript = document.createElement(“script”);
// copy attributes
let attrs = script.attributes;
for ( let attr of attrs ) {
freshScript.setAttribute( attr.name, attr.value );
}
// copy inner script code. #718, #782
freshScript.innerHTML = script.innerHTML;
script.parentNode.replaceChild( freshScript, script );
}
}
function reverseEvents(updated_events){
const events = Object.entries(updated_events);
// Reverse the order of the entries
events.reverse();
// Convert the reversed entries back to an object
return Object.fromEntries(events);
}
function fetchUpdatedEvents() {
const apiUrl = getUpdatedEventEndpointUrl(postId);
fetch(apiUrl)
.then(response => response.json())
.then(updatedEvents => {
// Find the events container
let key_points = document.querySelector(“.grv-live-blog-key-points”);
// if we had no key points to begin with but have some now we’d like to create the div and ul
// for it to populate
if(updatedEvents.key_points.length > 0) {
if (!key_points) {
// Element doesn’t exist, create it
key_points = document.createElement(“div”);
key_points.className = “grv-live-blog-key-points”;
// Create and append
to the brand new element
const heading = document.createElement(“h5”);
heading.textContent = “Key points”;
key_points.appendChild(heading);
// Create and append
- to the brand new element
const ul = document.createElement(“ul”);
ul.className = “grv-live-blog-key-points-list”;
key_points.appendChild(ul);
const glb_wrapper = document.getElementById(“glb-wrapper”);
if (glb_wrapper) {
// Insert the brand new element before the wrapper
glb_wrapper.parentNode.insertBefore(key_points, glb_wrapper);
}
}
const key_points_list = document.querySelector(“.grv-live-blog-key-points-list”);
key_points_list.innerHTML = “”;
// Update the important thing points
updatedEvents.key_points.forEach(point => {
const point_item = createPointItem(point);
key_points_list.appendChild(point_item);
});
// else we have now no key points so lets remove the list
}else{
if (key_points) {
key_points.remove();
}
}
// now cope with the events themselves…
const events_container = document.querySelector(“.wp-block-grvmedia-grv-live-blog”);
// get a map of the present events keyed by id
const existingEvents = Array.from(events_container.querySelectorAll(“.wp-block-grvmedia-grv-live-blog-event”))
.reduce((map, event) => {
map[event.id] = event;
return map;
}, {});
// get the present and updated keys so we will compare
const existingKeys = Object.keys(existingEvents);
const updatedKeys = Object.keys(updatedEvents.updated_blocks);
// find events which can be in existing but not in updated
const keysToRemove = existingKeys.filter(key => !updatedKeys.includes(key));
// remove any events which have been deleted
keysToRemove.forEach(key => {
// Find the element with the corresponding id
const element = document.getElementById(key);
// Remove the element if it exists
if (element) {
element.remove();
}
});
// reverse the events in order that they are in the correct order if we add multiple…
updatedEvents.updated_blocks = reverseEvents(updatedEvents.updated_blocks);
// loop through each updated event
Object.values(updatedEvents.updated_blocks).forEach(updatedEvent => {
// create temp elem so we will hydrate it from our rendered event after which access the id etc
const parser = latest DOMParser();
const tempEvent = parser.parseFromString(updatedEvent,”text/html”);
// Select the event from our temp container
const eventElement = tempEvent.querySelector(“.wp-block-grvmedia-grv-live-blog-event”);
// Extract the id
const eventId = eventElement ? eventElement.id : null;
// Using a fraction allows us to refresh scripts before attaching to dom
let frag = document.createDocumentFragment();
if (existingEvents[eventId]) {
frag.append( …eventElement.childNodes );
} else {
frag.append( eventElement );
}
refreshScripts( frag );
// if its an existing event replace the content of the event so we dont cause a jump
if (existingEvents[eventId]) {
// get the present event
const event = document.getElementById(eventId);
event.style.minHeight = event.offsetHeight + “px”;
// update its innerHTML and sophistication incase we have now modified to featured or breaking etc
event.className = eventElement.className;
event.replaceChildren(…frag.childNodes);
const seeMore = event.querySelector(“.see-more-wrapper.lazy”);
let seeMoreSrc = seeMore?.getAttribute(“data-src”);
if (seeMoreSrc) {
if ( seeMoreSrc.indexOf(‘instagram’) != -1 && window.instgrm ) {
window.instgrm.Embeds?.process();
} else {
addScriptSrcToHead(seeMoreSrc);
}
}
// if its a brand new event add to the highest – TODO: sort order if multiple latest events
} else {
// Create a brand new event
events_container.insertBefore(frag, events_container.firstChild);
}
});
})
.catch(error => {
console.error(“Error fetching updated blocks:”, error);
});
}
document.addEventListener(“DOMContentLoaded”, function() {
function startPolling(postId) {
function fetchPostModifiedDate() {
const url = getPollingEndpointUrl(postId);
fetch(url)
.then(response => response.json())
.then(data => {
// if our post modified date has modified we have now an update
if(modifiedDate != data.modified_date) {
// update the modified time to be the brand new modified time
modifiedDate = data.modified_date;
// show the button so a user can refresh
fetchUpdatedEvents();
showRefreshButton();
}
})
.catch(error => {
console.error(“Error fetching post modified date:”, error);
});
}
// Set interval to fetch every 30 seconds
setInterval(fetchPostModifiedDate, 30000); // 30 seconds
}
// Start polling
startPolling(postId);
const refreshButton = document.getElementById(“glb-btn”);
refreshButton.addEventListener(“click”, jumpToLatestEvent);
});


Join the talk; share your insight. Use the comment button on the underside left to have your say