How I Built a Free Weather Radio Programming Site for Hixson
Learn how to scrape free weather radio programming for Thursday in Hixson, parse the data, and integrate a weather API. A quick guide for devs.
I was scrolling through the local news on Thursday when I saw a notice about free weather radio programming in Hixson. It got me thinking: why not turn that schedule into a tiny web app that anyone can query? In this post I walk through how I fetched the raw broadcast list, turned it into JSON, and layered a live weather API on top—all with tools I already have in my dev toolbox.
Why this matters: If you’re building any public‑facing service that aggregates broadcast schedules, you need a reliable pipeline from raw source to user‑ready UI.
#Fetching the Thursday Schedule with a Simple Scraper
The first hurdle was pulling the schedule from the local news site. The page is static HTML, so a lightweight Node.js script with node-fetch and cheerio does the trick.
import fetch from 'node-fetch';
import cheerio from 'cheerio';
const URL = 'https://local3news.com/hixson-weather-radio';
const response = await fetch(URL);
const html = await response.text();
const $ = cheerio.load(html);
// Assume each program is in a <li class="program">
const programs = [];
$('li.program').each((_, el) => {
const time = $(el).find('.time').text().trim();
const title = $(el).find('.title').text().trim();
programs.push({ time, title });
});
console.log(JSON.stringify(programs, null, 2));On line 9 above, I target the list items that contain the schedule. If the site changes its markup, you’ll need to adjust the selectors accordingly.
Tip: To avoid reinventing the wheel for cost planning, I used Estimate Website Cost to get a quick budget snapshot before I started building the UI.
#Parsing the Radio Feed into Structured JSON
The raw strings from the scraper look like "08:00 AM – Sunrise Weather Update". I wrote a tiny parser that normalizes the time into ISO format and splits the title.
interface Program {
start: string; // ISO 8601
title: string;
}
function parseProgram(raw: { time: string; title: string }): Program {
const [hour, minute, period] = raw.time.match(/(\d{1,2}):(\d{2})\s*(AM|PM)/)!.slice(1);
let hourNum = Number(hour);
if (period === 'PM' && hourNum !== 12) hourNum += 12;
if (period === 'AM' && hourNum === 12) hourNum = 0;
const isoTime = `2026-10-14T${hourNum.toString().padStart(2, '0')}:${minute}:00Z`;
return { start: isoTime, title: raw.title };
}
// Example usage
const structured = programs.map(parseProgram);
console.log(structured);#Handling Edge Cases in Time Formats
- Midnight (
12:00 AM) needs to be converted to00:00. - Noon (
12:00 PM) stays as12:00. - Some entries omit the period; in that case, assume 24‑hour time.
Note: Always validate the parsed dates before storing them; a malformed time will break downstream sorting.
#Displaying the Free Weather Radio Programming on a Map
With the schedule in hand, I built a minimal React component that shows each program next to a Leaflet map of Hixson. The map gives users a geographic context for the broadcast towers.
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';
import 'leaflet/dist/leaflet.css';
function RadioSchedule({ programs }: { programs: Program[] }) {
return (
<div className="schedule">
{programs.map((p) => (
<div key={p.start} className="item">
<strong>{new Date(p.start).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}</strong> – {p.title}
</div>
))}
<MapContainer center={[35.1, -84.9]} zoom={12} style={{ height: 300, marginTop: 20 }}>
<TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<Marker position={[35.1, -84.9]}>
<Popup>Hixson Radio Tower</Popup>
</Marker>
</MapContainer>
</div>
);
}Warning: Leaflet requires the map container to have explicit width/height; otherwise the map won’t render.
#Integrating a Weather API for Real‑Time Alerts
To make the app truly useful, I layered current conditions from the OpenWeatherMap API. The free tier is sufficient for a low‑traffic hobby project.
curl "https://api.openweathermap.org/data/2.5/weather?q=Hixson,US&appid=YOUR_KEY&units=imperial"The response includes temperature, wind speed, and a brief description—perfect for appending to each program entry.
async function enrichWithWeather(programs) {
const weatherRes = await fetch(
`https://api.openweathermap.org/data/2.5/weather?q=Hixson,US&appid=${process.env.OWM_KEY}&units=imperial`
);
const weather = await weatherRes.json();
return programs.map((p) => ({
...p,
weather: `${weather.main.temp}°F, ${weather.weather[0].description}`
}));
}I then displayed the weather snippet beneath each program line, giving listeners a quick glance at current conditions.
Note: Respect the API’s rate limits; cache the weather data for at least five minutes to avoid hitting the quota.
#Deploying and Estimating Costs
After wiring everything together, I pushed the repo to Vercel for instant previews. The static site costs almost nothing, but if you decide to add server‑side rendering or a database for user‑generated playlists, the budget can grow quickly. That’s why I ran the final estimate through Estimate Website Cost to confirm the numbers stayed within my personal budget.
#Quick checklist before launch
- Verify the scraper respects the site’s
robots.txt. - Add error handling for network failures.
- Cache weather responses to stay under API limits.
- Write unit tests for the time‑parsing logic.
- Set up a CI pipeline that runs linting and builds the app.
#Closing Thoughts
Building a free weather radio programming viewer for Hixson turned out to be a fun weekend project that touched web‑scraping, data parsing, UI mapping, and API integration. The core pattern—fetch → normalize → enrich → display—applies to many broadcast‑oriented services. If you’re planning a similar site, start small, validate the data source, and use tools like Estimate Website Cost early to keep the scope realistic. Happy coding!
Related posts
- Link to article5 min read
Building a Free Weather Radio Scheduler for Hixson
I walk through building a Node.js service that scrapes free weather radio programming for Hixson, parses the schedule, and serves a simple API. Learn the steps and pitfalls.
- Link to article5 min read
General Conference Special Programming: A Developer’s Guide
Learn how to architect, API‑design, and display General Conference special programming tracks. Get data‑model tips, front‑end rendering tricks, and budgeting advice with a conference schedule API.