Connect with us

Oklahoma

Oklahoma sues company over failed campaign finance website

Published

on

Oklahoma sues company over failed campaign finance website


play

Oklahoma is suing the company that state officials blame for the failed launch of a new campaign finance website.

Advertisement

RFD & Associates, Inc. did not complete a working site, even after the Oklahoma Ethics Commission repeatedly extended deadlines, according to the suit filed by Attorney General Gentner Drummond.

The website, dubbed Guardian 2.0, was supposed to allow Oklahomans to monitor donations to candidates seeking public office. Delays tied to its launch left Oklahoma without a campaign finance site for three months as the 2026 election season got underway.

The state is seeking in excess of $800,000 to recoup the costs of the project, according to the suit, which was filed in Oklahoma County District Court.

Drummond contended that RFD failed to meet six of seven contractual milestones, on top of failing to produce the site.

Advertisement

“Timely and reliable reporting systems are essential to transparency and public trust in our elections,” Drummond said in a statement. “RFD & Associates, Inc. failed to deliver the system it promised, despite repeated opportunities to correct course and must now be held accountable.”

RFD & Associates did not respond to a request for comment about the suit or the state’s claims by publication.

Advertisement

The state had allocated $2.2 million to the new website project, and had spent a total of $960,000 on the site, Commission Executive Director Lee Anne Bruce Boone said at a recent budget meeting. The money that the Ethics Commission had not yet spent is in a revolving fund.

After officially deciding to scrap Guardian 2.0, state officials struck a three-year deal with Civix, the government software provider that built and maintained the original campaign finance site.

The contract will be for $217,000. Bruce Boone said there is a possibility the state will be able to renew the contract after three years.



Source link

Advertisement

Oklahoma

Oklahoma City artist returns with Thunder-themed window art for NBA playoffs

Published

on

Oklahoma City artist returns with Thunder-themed window art for NBA playoffs


Melissa Griggs-Hendricks and her team are back to paint Thunder-inspired designs on windows across Oklahoma City, spreading excitement for the NBA playoffs

Advertisement

Oklahoma City artist returns with Thunder-themed window art for NBA playoffs

Melissa Griggs-Hendricks and her team are back to paint Thunder-inspired designs on windows across Oklahoma City, spreading excitement for the NBA playoffs

Advertisement

WELL, OKLAHOMA CITY, IT IS ALMOST TIME FOR THE NBA PLAYOFFS AND WE ARE READY TO THUNDER UP. I’LL TELL YOU WHAT, OUR CITY SURE KNOWS HOW TO SHOW UP AND SHOW OUT. FROM WATCH PARTIES TO HOUSE DECORATIONS, OKC HAS GOT IT GOING ON AND THAT INCLUDES A LOCAL PAINTER. YOU MIGHT REMEMBER FROM LAST SEASON. OUR KOCO EVAN ONSTOT JOINING US LIVE IN THE NEWSROOM. WE HAVE THIS IN OUR NEWSROOM. EVAN, WE’RE ABOUT TO SEE BLUE AND ORANGE ALL OVER OKC. RIGHT. AND A LOT OF IT IS GOING TO BE THANKS TO ARTIST MELISSA GRIGGS HENDRICKS. WE WATCHED MELISSA AND HER TEAM CREATE THUNDER MAGIC ALL OVER OKLAHOMA LAST YEAR, AND NOW SHE IS BACK. AND MAYBE EVEN BETTER THAN BEFORE. MELISSA AND HER ASSISTANT CANDACE PAINT THUNDER IMAGES ON WINDOWS. ABBY, YOU MENTIONED WE HAD ONE RIGHT HERE IN THE KOCO NEWSROOM. AND SO THIS YEAR, THESE LADIES ARE BACK TO SPREAD SOME THUNDER EXCITEMENT. THEY SAY THEY’VE GOT EVEN MORE DESIGNS THIS YEAR AND THEY BELIEVE THEY CAN DOUBLE THE ART THIS SEASON. THEY JUST CAN’T WAIT FOR THE PLAYOFFS TO START. LAST YEAR FOR THE PLAYOFFS, WITHIN A TWO AND A HALF MONTH SPAN, WE PAINTED 157 LOCATIONS. SOME OF THOSE WERE HUGE AND SOME WERE SMALL. AS ONE WINDOW, WE HAVE A GUESS OF ABOUT 25 GALLONS. WE MAY HAVE MISSED A FEW. IT DOESN’T TAKE A TON OF PAPER FOR DESIGN TYPICALLY, BUT YEAH, ABOUT 25 GALLONS LAST YEAR. THIS YEAR I THINK WE’RE GOING TO DO A WHOLE LOT MORE. IT FEELS AMAZING TO BE BACK. I’M SO EXCITED. WE JUST HAD SUCH A GREAT TIME LAST YEAR AND I’VE REALLY MISSED THIS COMMUNITY OF JUST GETTING TO SEE EVERYBODY AND JUST BE A HUGE PART OF ALL THE EXCITEMENT FOR THE PLAYOFFS. YEAH, THEY DO INCREDIBLE WORK. NOW. MELISSA SAYS THAT IF YOU ARE INTERESTED IN HAVING ANY OF YOUR WINDOWS PAINTED, YOU JUST GOT TO CONTACT HER THROUGH EMAIL. WE’RE GOING TO POST A

Advertisement

Oklahoma City artist returns with Thunder-themed window art for NBA playoffs

Melissa Griggs-Hendricks and her team are back to paint Thunder-inspired designs on windows across Oklahoma City, spreading excitement for the NBA playoffs

Updated: 7:52 PM CDT Apr 10, 2026

Editorial Standards

Advertisement

Oklahoma City is preparing for the NBA playoffs, and artist Melissa Griggs-Hendricks is bringing Thunder spirit to life with her signature window art. >> Download the KOCO 5 app | Subscribe to KOCO 5’s YouTube channel | Sign up for KOCO 5’s Morning NewsletterGriggs-Hendricks, along with her assistant Candace, is painting Thunder-themed images on windows throughout the city, including one at the KOCO newsroom. “Last year for the playoffs, within a two-and-a-half-month span, we painted 157 locations. Some of those were huge and some were small as one window,” Griggs-Hendricks said. “We have a guess of about 25 gallons. We may have missed it. It doesn’t take a ton of paint for a design. Typically, they get about 25 this year. I think we’re going to do a whole lot more.” She expressed her enthusiasm for returning this season. “It feels amazing to be back. I’m so excited. We just had such a great time last year, and I really miss this community of just getting to see everybody and just be a huge part of all the excitement for the playoffs,” Griggs-Hendricks said. Get the latest news stories of interest by clicking here.Griggs-Hendricks and her team say they have even more designs planned this year and believe they can double their output from last season. Top HeadlinesWoman dies after being hit by a train in Pauls Valley, OHP saysOut-of-this-world playlist: Here’s what the Artemis II astronauts have been listening in spaceOHP releases details of deadly crash involving Oklahoma State softball team’s busRollover crash involving multiple vehicles causes significant traffic on SB I-35 near GoldsbyPennsylvania woman’s Ring camera captures machete-wielding neighbor

Oklahoma City is preparing for the NBA playoffs, and artist Melissa Griggs-Hendricks is bringing Thunder spirit to life with her signature window art.

Advertisement

>> Download the KOCO 5 app | Subscribe to KOCO 5’s YouTube channel | Sign up for KOCO 5’s Morning Newsletter

Griggs-Hendricks, along with her assistant Candace, is painting Thunder-themed images on windows throughout the city, including one at the KOCO newsroom.

“Last year for the playoffs, within a two-and-a-half-month span, we painted 157 locations. Some of those were huge and some were small as one window,” Griggs-Hendricks said. “We have a guess of about 25 gallons. We may have missed it. It doesn’t take a ton of paint for a design. Typically, they get about 25 this year. I think we’re going to do a whole lot more.”

Advertisement

She expressed her enthusiasm for returning this season.

“It feels amazing to be back. I’m so excited. We just had such a great time last year, and I really miss this community of just getting to see everybody and just be a huge part of all the excitement for the playoffs,” Griggs-Hendricks said.

Get the latest news stories of interest by clicking here.

Griggs-Hendricks and her team say they have even more designs planned this year and believe they can double their output from last season.


Top Headlines

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.koco.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘mobile-weather’, “https://www.koco.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.koco.com/alerts”);
weatherWatchLink.setAttribute(‘onclick’, “return handleWeatherLinkClick(event, ‘click_alerts’, ‘click’, ‘sidelist-weather’, “https://www.koco.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

Oklahoma

Oklahoma City man claiming to be financial investor charged with fraud

Published

on

Oklahoma City man claiming to be financial investor charged with fraud


A federal grand jury has charged an Oklahoma City man with dozens of counts of wire fraud, money laundering, and aggravated identity theft.

From June 2021 through December 2025, officials say 36-year-old Matthew Mclain Veazey presented himself as a successful financial investment professional. Public records indicate that Veazey encouraged friend and family to send him money by claiming he had special access to favorable investment opportunities due to his connections.

However, authorities say Veazey kept the money for himself and used it for personal expenses.

Court records allege that investors gave Veazey $2.38 million, but those funds were never repaid. Authorities say Veazey fabricated text messages and email communications from real people to convince victims that his investment activities were real.

Advertisement

This week, a federal grand jury returned a 30-count indictment charging Veazey with 21 counts of wire fraud, five counts of money laundering, and four counts of aggravated identity theft.

Comment with Bubbles

BE THE FIRST TO COMMENT

If convicted, Veazey faces up to 20 years in federal prison and fines up to $250,000 for each count of wire fraud, up to 10 years in federal prison and fines up to $250,000 for each count of money laundering.



Source link

Advertisement
Continue Reading

Oklahoma

PORTAL TARGET BREAKDOWN: Oklahoma State guard Amari Whiting

Published

on

PORTAL TARGET BREAKDOWN: Oklahoma State guard Amari Whiting


Portal season is just getting underway. The Iowa Women’s Basketball team suffered five losses to the transfer portal, leaving them, at this moment, with six players on next year’s roster, including just two guards. For the first time since the portal became commonplace in college sports, the Hawkeyes, led by head coach Jan Jensen are […]



Source link

Continue Reading

Trending