Connect with us

Kentucky

Kentucky legislature passes bill shrinking JCPS board to 5 members

Published

on

Kentucky legislature passes bill shrinking JCPS board to 5 members


play

FRANKFORT, Ky. — A revamped bill unveiled late on the final day to pass legislation in the 2026 Kentucky General Assembly with the ability to later override a veto would significantly alter the makeup of Louisville’s public school board.

The new Senate Bill 4 would cut the number of seats on the Jefferson County Board of Education from seven to five. It includes an emergency clause, meaning it would go into effect immediately if passed — Rep. Jason Nemes, R-Middletown, who introduced the new bill in the House, said the legislation includes new district maps to be used when voters head to the ballot box this year but added JCPS would be able to redraw its own maps after that.

Advertisement

The bill passed in the House on a 72-21 vote mostly along party lines, with three Republicans (Rep. Vanessa Grossl, R-Georgetown, Rep. Patrick Flannery, R-Olive Hill, and Rep. Kim Holloway, R-Mayfield) joining Democrats in opposition.

It quickly passed 25-7 in the Senate a few minutes later, with Sen. Brandon Smith, R-Hazard, and Sen. Robin Webb, R-Grayson, joining Democrats in voting no.

A copy of the bill was not immediately available.

The bill, sponsored by Sen. Stephen West, R-Paris, originally aimed to create a principal leadership and mentorship program. But after changes in the House, new provisions were added that would affect the makeup of boards for large school districts, including Jefferson County Public Schools and Fayette County Public Schools.

Advertisement

SB 4 is one of many education bills introduced this session, several of which have specifically targeted JCPS. Senate Bill 1, also passed on April 1, gives more power to JCPS’s superintendent while requiring the board to focus on long-term strategies.

The bills come as JCPS navigates an ongoing financial crisis, with a $188 million shortfall expected in the next budget. Prior to the revisions, the SB 4 would have required two new members with “expertise in finance” to be appointed by the state treasurer, Republican Mark Metcalf. That provision was removed during deliberations between the House and Senate.

In an interview after the votes, board Vice-Chair James Craig told The Courier Journal a five-member board “has made sense to me for a number of reasons.” It’s in line with every other district in the state, he said, and it can be difficult to find qualified candidates who have the bandwidth in their lives to devote enough effort to do the job right.

“I think given the realities of what the legislature could have done, how other districts are governed and the challenges that we’ve faced, Senate Bill 4 reflects a compromise that should be workable,” Craig said. “… But I have significant concerns about Senate Bill 1 and the way it interacts with Senate Bill 4.”

Advertisement

Lawmakers have listened to concerns he and other education advocates have raised, he said, removing some of the “problematic provisions” that had been floated as ones that could be included in SB 1. But the bill takes power from the elected board, he noted, and gives it to an unelected superintendent — in Louisville’s case, he added, someone who is “new to the city of Louisville in the last year.” JCPS Superintendent Brian Yearwood testified against SB 1 earlier this session in Frankfort.

“In my opinion, voters in the city of Louisville do not want a super-empowered superintendent. They want a democratically elected Board of Education that is accountable to them,” Craig added.

Board members will have a discussion with their attorney about potentially challenging SB 1 in court, he said. A similar bill passed in 2022 was struck down late last year by the state Supreme Court after previously being upheld by the high court.

JCPS leaders and board members have raised concerns about the earlier iteration of SB 4 and the removal of two board positions. Three members of JCPS board — Craig, Chair Corrie Shull and Linda Duncan — are scheduled to be up for reelection in November.

Craig does not plan to run again this year, he added.

Advertisement

“Eight years of intense, uncompensated public service have been fulfilling,” he wrote in a text message. “It is time for me to return to the full time practice of law.”

This story will be updated.

Reach Lucas Aulbach at laulbach@courier-journal.com. Reach reporter Keely Doll at kdoll@courierjournal.com or follow her on X at @keely_doll.



Source link

Advertisement
Continue Reading
Click to comment

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Kentucky

Mr. Tim Graham

Published

on

Mr. Tim Graham




Murray
| Jan. 15, 1962 | yesterday

Mr. Tim Graham, age 64, of Dexter, Kentucky passed away on Saturday, April 4, 2026, at his home.
          Mr. Graham was born on January 15, 1962, in Murray, Kentucky to the late Jerry Graham and Janice (Staples) McCuiston. He worked in the construction industry.
          Survivors include two sisters, LaDon Haley Berlin of Evansville, Indiana and Kristi Hopkins and husband Chris of Murray, Kentucky; one niece, Emily Don Hopkins of Murray, Kentucky; three nephews, Adam Haley of Springfield, Illinois, Jason Haley of Evansville, Indiana, and Zachery Hopkins of Murray, Kentucky; one great niece, Audrey Haley of Paducah, Kentucky; as well as one great nephew, Weston Haley of Okawville, Illinois.

          A memorial visitation will be held from 5:00 p.m. – 7:00 p.m., Wednesday, April 8, 2026, at the J.H. Churchill Funeral Home & Cremation Services. A private family service will be held.
          Expressions of sympathy can be made to the Humane Society of Calloway County, 607 Poplar Street, Suite A1, Murray, Kentucky 42071.
          Online condolences can be made at, www.jhchurchill.com
 



Source link

Continue Reading

Kentucky

A Kentucky Derby fixture steps away: Mike Battaglia retires as oddsmaker

Published

on

A Kentucky Derby fixture steps away: Mike Battaglia retires as oddsmaker


LOUISVILLE, Ky. (AP) — Mike Battaglia, who set the morning-line odds for every Kentucky Derby since 1974, is retiring ahead of next month’s 152nd edition.

Battaglia correctly identified the Kentucky Derby favorite 39 times in 51 runnings for a success rate of 76.5%.

He also served as Churchill Downs’ announcer from 1977-97 and later as simulcast host from 1997-2007.

Advertisement

“I’m very appreciative of everyone at Churchill Downs for the opportunity over the years,” Battaglia said Friday in a release from the track. ”It’s been a great run, but I felt like it was the right time to step away and let someone else take it forward.”

The track has named Nick Tammaro to succeed Battaglia. Tammaro currently works in a variety of industry roles: morning-line oddsmaker at Keeneland, track announcer at Sam Houston racetrack, and handicapper at TwinSpires.

“It’s an honor to take over for Mike,” Tammaro said. “He’s a legend in our industry and someone I’ve looked up to for a long time. I just hope to do his line justice.”


AP horse racing: https://apnews.com/hub/horse-racing

Top Sports Stories on WDRB.com

Advertisement

Copyright 2026 The Associated Press. All rights reserved. This material may not be published, broadcast, rewritten or redistributed without permission.



Source link

Continue Reading

Kentucky

Kentucky Derby Festival Block Party returns to Norton Healthcare Sports & Learning Center

Published

on

Kentucky Derby Festival Block Party returns to Norton Healthcare Sports & Learning Center


Kentucky Derby Festival Block Party returns to Norton Healthcare Sports & Learning Center

Advertisement

Advertisement

Kentucky Derby Festival Block Party returns to Norton Healthcare Sports & Learning Center

Updated: 9:28 PM EDT Apr 4, 2026

Editorial Standards

Advertisement

The Kentucky Derby Festival Block Party returned to the Norton Healthcare Sports & Learning Center Saturday.Guests were able to stop by and enjoy an afternoon filled with of food, live entertainment, and family-friendly activities.The party also featured over 50 minority-owned businesses from MELANnaire Marketplace that were showing off the items they had for sale.”Well, here you get local makers, who are making all types of fascinators. They make clothing, artwork. We got a food drive, I mean everything. It’s all kinds of amazing products, and we’re so happy to be able to showcase them,” said Nachane Trapue, the founder of MELANnaire Marketplace.Norton Healthcare was also on site providing wellness tips, and the Heuser Hearing Institute offered free hearing screenings.

The Kentucky Derby Festival Block Party returned to the Norton Healthcare Sports & Learning Center Saturday.

Guests were able to stop by and enjoy an afternoon filled with of food, live entertainment, and family-friendly activities.

Advertisement

The party also featured over 50 minority-owned businesses from MELANnaire Marketplace that were showing off the items they had for sale.

“Well, here you get local makers, who are making all types of fascinators. They make clothing, artwork. We got a food drive, I mean everything. It’s all kinds of amazing products, and we’re so happy to be able to showcase them,” said Nachane Trapue, the founder of MELANnaire Marketplace.

Norton Healthcare was also on site providing wellness tips, and the Heuser Hearing Institute offered free hearing screenings.

Advertisement
Advertisement

`;
}

function refreshWeatherIframe(containerId) {
var iframeId = ‘weather-iframe-‘ + containerId;
var iframe = document.getElementById(iframeId);
if (iframe && iframe.src) {
var originalSrc = iframe.src;
iframe.src = originalSrc + (originalSrc.indexOf(‘?’) > -1 ? ‘&’ : ‘?’) + ‘t=” + Date.now();
}
}

function initializeWeatherBox(container) {
var containerId = container.getAttribute(“data-container-id’);
var isWeatherBoxV2 = containerId === ‘home-weather-v2’;

function switchWeatherTab(tabName, clickedElement) {
container.querySelectorAll(‘[data-tab-id]’).forEach(function(tab) {
tab.classList.remove(‘open’);
tab.setAttribute(‘aria-selected’, ‘false’);
});

clickedElement.classList.add(‘open’);
clickedElement.setAttribute(‘aria-selected’, ‘true’);

Advertisement

container.querySelectorAll(‘[data-content-id]’).forEach(function(content) {
content.style.display = ‘none’;
content.setAttribute(‘hidden’, ‘true’);
});

var targetContent = container.querySelector(‘[data-content-id=”‘ + tabName + ‘”]’);
if (targetContent) {
targetContent.style.display = ‘block’;
targetContent.removeAttribute(‘hidden’);
}
}

function loadWeatherData() {
// If weather data is already being loaded, wait for it
if (window.weatherDataPromise) {
window.weatherDataPromise.then(function(data) {
if (data && data.data) {
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
}
});
return;
}

var location = { zip: window.DEFAULT_ZIPCODE };

try {
var storedLocations = localStorage.getItem(‘hrst.zip.history’);
if (storedLocations) {
var locations = JSON.parse(storedLocations);
if (locations && locations.length > 0) {
location = locations[0];
}
}
} catch (e) {}

Advertisement

var apiUrl = (window.DEWY_HOSTNAME || ”) + ‘/api/v1/weather/full/’ + location.zip;

if (window.fetch) {
window.weatherDataPromise = fetch(apiUrl)
.then(function(response) { return response.json(); })
.then(function(data) {
if (data && data.data) {
var article = container.closest(‘.article–wrapper’);
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
return data;
}
})
.catch(function(error) {
console.error(‘Error loading weather:’, error);
// Reset to unknown background on error
updateWeatherBackground(‘unknown’);
});
}
}

function updateWeatherAlertsBar(weatherData) {
var weatherWatchHeader = container.querySelector(‘.weather-watch-header’);
if (!weatherWatchHeader) return;

var weatherWatchText = weatherWatchHeader.querySelector(‘.weather-watch-text’);
var weatherWatchLink = weatherWatchHeader.querySelector(‘.weather-watch-link’);

if (weatherData.alerts_count > 0) {
weatherWatchHeader.className=”weather-watch-header has-alerts”;
if (weatherWatchText) {
weatherWatchText.textContent = `Weather Alerts (${weatherData.alerts_count})`;
}
if (weatherWatchLink) {
if (!weatherWatchLink.getAttribute(‘data-initial-href’)) {
weatherWatchLink.setAttribute(‘data-initial-href’, weatherWatchLink.getAttribute(‘href’));
weatherWatchLink.setAttribute(‘data-initial-onclick’, weatherWatchLink.getAttribute(‘onclick’) || ”);
}
weatherWatchLink.setAttribute(‘href’, “https://www.wlky.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘mobile-weather’, “https://www.wlky.com/alerts”);”);
}
} else {
weatherWatchHeader.className=”weather-watch-header”;
if (weatherWatchText) {
weatherWatchText.textContent = containerId === ‘home-weather-v2’ ? ‘Watch Latest Forecast’ : ‘Latest Forecast’;
}
if (weatherWatchLink) {
var initialHref = weatherWatchLink.getAttribute(‘data-initial-href’);
var initialOnclick = weatherWatchLink.getAttribute(‘data-initial-onclick’);
if (initialHref) {
weatherWatchLink.setAttribute(‘href’, initialHref);
}
if (initialOnclick) {
weatherWatchLink.setAttribute(‘onclick’, initialOnclick);
}
}
}
}

Advertisement

function updateCurrentWeather(weatherData) {
if (weatherData.current) {
var tempValue = weatherData.current.temp_f || ”;
var skyValue = weatherData.current.sky || ”;
var feelsLikeValue = weatherData.current.feels_like_f || weatherData.current.temp_f || ”;

var tempEl = container.querySelector(‘.weather-grid–current-temp-value’);
if (tempEl) {
tempEl.textContent = tempValue;
tempEl.setAttribute(‘aria-label’, tempValue + ‘ degrees Fahrenheit’);
}

var iconEl = container.querySelector(‘.weather-grid–current-icon’);
if (iconEl && weatherData.current.icon_name) {
iconEl.className=”weather-grid–current-icon weather-current-icon icon icon-weather-” + weatherData.current.icon_name;
}

var skyEl = container.querySelector(‘.weather-grid–sky’);
if (skyEl) {
skyEl.textContent = skyValue;
skyEl.setAttribute(‘aria-label’, ‘Current condition: ‘ + skyValue);
}

var feelsEl = container.querySelector(‘.weather-grid–feels’);
if (feelsEl) {
feelsEl.textContent = feelsLikeValue + ‘°F’;
feelsEl.setAttribute(‘aria-label’, feelsLikeValue + ‘ degrees Fahrenheit’);
}

Advertisement

var weatherContainer = container.querySelector(‘.weather-temp-container’);
if (weatherContainer) {
var summary = ‘Current temperature ‘ + tempValue + ‘ degrees Fahrenheit, ‘ +
skyValue + ‘, feels like ‘ + feelsLikeValue + ‘ degrees’;
weatherContainer.setAttribute(‘aria-label’, summary);
}

updateWeatherBackground(weatherData.current.icon_name);
}
}

function updateWeatherBackground(iconName) {
try {
var bgPath = weatherImages.backgrounds[iconName] || weatherImages.backgrounds.unknown;
container.style.backgroundImage=”url(” + bgPath + ‘)’;
} catch (e) {
console.log(‘Error updating weather background:’, e);
}
}

function updateForecastTabs(weatherData) {
var visibleItems = isWeatherBoxV2 ? 6 : 5;

if (weatherData.hourly) {
var hourlyContainer = container.querySelector(‘.weather-hourly-forecast’);
if (hourlyContainer) {
var html=””;
var maxHours = Math.min(visibleItems, weatherData.hourly.length);

Advertisement

for (var i = 0; i 0 ? currentIndex – 1 : tabs.length – 1;
tabs[prevIndex].focus();
break;
case ‘ArrowRight’:
e.preventDefault();
var nextIndex = currentIndex

`;
}

function refreshWeatherIframe(containerId) {
var iframeId = ‘weather-iframe-‘ + containerId;
var iframe = document.getElementById(iframeId);
if (iframe && iframe.src) {
var originalSrc = iframe.src;
iframe.src = originalSrc + (originalSrc.indexOf(‘?’) > -1 ? ‘&’ : ‘?’) + ‘t=” + Date.now();
}
}

function initializeWeatherBox(container) {
var containerId = container.getAttribute(“data-container-id’);
var isWeatherBoxV2 = containerId === ‘home-weather-v2’;

function switchWeatherTab(tabName, clickedElement) {
container.querySelectorAll(‘[data-tab-id]’).forEach(function(tab) {
tab.classList.remove(‘open’);
tab.setAttribute(‘aria-selected’, ‘false’);
});

Advertisement

clickedElement.classList.add(‘open’);
clickedElement.setAttribute(‘aria-selected’, ‘true’);

container.querySelectorAll(‘[data-content-id]’).forEach(function(content) {
content.style.display = ‘none’;
content.setAttribute(‘hidden’, ‘true’);
});

var targetContent = container.querySelector(‘[data-content-id=”‘ + tabName + ‘”]’);
if (targetContent) {
targetContent.style.display = ‘block’;
targetContent.removeAttribute(‘hidden’);
}
}

function loadWeatherData() {
// If weather data is already being loaded, wait for it
if (window.weatherDataPromise) {
window.weatherDataPromise.then(function(data) {
if (data && data.data) {
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
}
});
return;
}

var location = { zip: window.DEFAULT_ZIPCODE };

Advertisement

try {
var storedLocations = localStorage.getItem(‘hrst.zip.history’);
if (storedLocations) {
var locations = JSON.parse(storedLocations);
if (locations && locations.length > 0) {
location = locations[0];
}
}
} catch (e) {}

var apiUrl = (window.DEWY_HOSTNAME || ”) + ‘/api/v1/weather/full/’ + location.zip;

if (window.fetch) {
window.weatherDataPromise = fetch(apiUrl)
.then(function(response) { return response.json(); })
.then(function(data) {
if (data && data.data) {
var article = container.closest(‘.article–wrapper’);
var weatherContainer = container.closest(‘.weather-box-container’);
if (weatherContainer) {
weatherContainer.style.display = ‘flex’;
updateCurrentWeather(data.data);
updateForecastTabs(data.data);
updateWeatherAlertsBar(data.data);
}
return data;
}
})
.catch(function(error) {
console.error(‘Error loading weather:’, error);
// Reset to unknown background on error
updateWeatherBackground(‘unknown’);
});
}
}

function updateWeatherAlertsBar(weatherData) {
var weatherWatchHeader = container.querySelector(‘.weather-watch-header’);
if (!weatherWatchHeader) return;

var weatherWatchText = weatherWatchHeader.querySelector(‘.weather-watch-text’);
var weatherWatchLink = weatherWatchHeader.querySelector(‘.weather-watch-link’);

Advertisement

if (weatherData.alerts_count > 0) {
weatherWatchHeader.className=”weather-watch-header has-alerts”;
if (weatherWatchText) {
weatherWatchText.textContent = `Weather Alerts (${weatherData.alerts_count})`;
}
if (weatherWatchLink) {
if (!weatherWatchLink.getAttribute(‘data-initial-href’)) {
weatherWatchLink.setAttribute(‘data-initial-href’, weatherWatchLink.getAttribute(‘href’));
weatherWatchLink.setAttribute(‘data-initial-onclick’, weatherWatchLink.getAttribute(‘onclick’) || ”);
}
weatherWatchLink.setAttribute(‘href’, “https://www.wlky.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘sidelist-weather’, “https://www.wlky.com/alerts”);”);
}
} else {
weatherWatchHeader.className=”weather-watch-header”;
if (weatherWatchText) {
weatherWatchText.textContent = containerId === ‘home-weather-v2’ ? ‘Watch Latest Forecast’ : ‘Latest Forecast’;
}
if (weatherWatchLink) {
var initialHref = weatherWatchLink.getAttribute(‘data-initial-href’);
var initialOnclick = weatherWatchLink.getAttribute(‘data-initial-onclick’);
if (initialHref) {
weatherWatchLink.setAttribute(‘href’, initialHref);
}
if (initialOnclick) {
weatherWatchLink.setAttribute(‘onclick’, initialOnclick);
}
}
}
}

function updateCurrentWeather(weatherData) {
if (weatherData.current) {
var tempValue = weatherData.current.temp_f || ”;
var skyValue = weatherData.current.sky || ”;
var feelsLikeValue = weatherData.current.feels_like_f || weatherData.current.temp_f || ”;

var tempEl = container.querySelector(‘.weather-grid–current-temp-value’);
if (tempEl) {
tempEl.textContent = tempValue;
tempEl.setAttribute(‘aria-label’, tempValue + ‘ degrees Fahrenheit’);
}

var iconEl = container.querySelector(‘.weather-grid–current-icon’);
if (iconEl && weatherData.current.icon_name) {
iconEl.className=”weather-grid–current-icon weather-current-icon icon icon-weather-” + weatherData.current.icon_name;
}

var skyEl = container.querySelector(‘.weather-grid–sky’);
if (skyEl) {
skyEl.textContent = skyValue;
skyEl.setAttribute(‘aria-label’, ‘Current condition: ‘ + skyValue);
}

Advertisement

var feelsEl = container.querySelector(‘.weather-grid–feels’);
if (feelsEl) {
feelsEl.textContent = feelsLikeValue + ‘°F’;
feelsEl.setAttribute(‘aria-label’, feelsLikeValue + ‘ degrees Fahrenheit’);
}

var weatherContainer = container.querySelector(‘.weather-temp-container’);
if (weatherContainer) {
var summary = ‘Current temperature ‘ + tempValue + ‘ degrees Fahrenheit, ‘ +
skyValue + ‘, feels like ‘ + feelsLikeValue + ‘ degrees’;
weatherContainer.setAttribute(‘aria-label’, summary);
}

updateWeatherBackground(weatherData.current.icon_name);
}
}

function updateWeatherBackground(iconName) {
try {
var bgPath = weatherImages.backgrounds[iconName] || weatherImages.backgrounds.unknown;
container.style.backgroundImage=”url(” + bgPath + ‘)’;
} catch (e) {
console.log(‘Error updating weather background:’, e);
}
}

function updateForecastTabs(weatherData) {
var visibleItems = isWeatherBoxV2 ? 6 : 5;

Advertisement

if (weatherData.hourly) {
var hourlyContainer = container.querySelector(‘.weather-hourly-forecast’);
if (hourlyContainer) {
var html=””;
var maxHours = Math.min(visibleItems, weatherData.hourly.length);

for (var i = 0; i 0 ? currentIndex – 1 : tabs.length – 1;
tabs[prevIndex].focus();
break;
case ‘ArrowRight’:
e.preventDefault();
var nextIndex = currentIndex

Loading more articles…



Source link

Advertisement
Continue Reading

Trending