Case study · Rybalka Club

How the bite forecast works

Rybalka Club tells anglers when the fish will bite. No black box: it’s a transparent, weighted heuristic over real weather data — and it’s honest about what science backs and what’s just folklore. Here’s exactly how I built it.

The bite-forecast algorithm page on Rybalka Club
The public “how it works” page — every factor and weight is shown openly.
Per-species July forecast — optimal water temperature, baits and best times
Per-species activity for the month: each fish has its own optimum and best times.
The 12-month fishing bite calendar
A full-year bite calendar, month by month.
The idea

Two numbers, honestly computed

The forecast is two things: one score for the day and place, and one activity level per fish species. Both are shown with the factors behind them — nothing hidden.

The bite index (0–100)

The daily score is a weighted sum of factors, capped at 100. Weather does the heavy lifting (~78 points); the moon and solunar periods are only a nudge (~12).

Index = min(100, Σ fᵢ)
Factors and their maximum weight
Atmospheric pressureup to 28optimum 1010–1025 hPaWeather
Pressure trend (6h)up to 18a drop before a front = feeding frenzyWeather
Air temperatureup to 12optimum 15–25 °CWeather
Windup to 10light beats a squallWeather
Cloud coverup to 5light cloud beats clear skyWeather
Precipitationup to 5light rain is a plusWeather
Time of dayup to 5dawn / duskWeather
Geomagnetic (Kp)up to 5calm is betterWeather
Moon phaseup to 6traditional guideMoon
Solunar (major/minor)up to 6traditional guideMoon

The strongest block is pressure and its trend (46 points) — fish switch on when pressure moves ahead of a weather front.

Per-species activity

On top of the day’s index I apply two multipliers, individual to each species — so on the same day a pike and a catfish read differently:

Activity = DayIndex × tempFit × seasonW
  • tempFit — how close the water temperature is to the species’ optimum (pike likes it cool, carp and catfish warm).
  • seasonW — the species’ seasonal activity by month (peak = 1, neighbouring months lower) from the handbook.

Only species that are actually caught at that spot are shown.

Data

Where the numbers come from

Real, open data — no invented signals. Everything is tied to the spot’s coordinates.

Open-MeteoHourly forecast weather — pressure, wind, temperature, cloud, precipitation, sunrise/sunset — several days ahead.
NOAA GFSThe animated wind on the radar: u/v surface-wind components on a 0.25° grid, shown as-is.
Water temperatureEstimated from near-surface air temperature with thermal inertia — a proxy, not a direct measurement.
Moon & solunarAstronomical calculation of moon phase and major/minor periods for the coordinates.
Kp indexGeomagnetic activity from NOAA.
Honest

The evidence base

The forecast is a weighted heuristic, not a promise. The factors differ in how well science actually backs them — so I weight them accordingly.

Well supported
  • Atmospheric pressure and its sharp changes
  • Water temperature
  • Season and time of day (dawn / dusk)
Weakly supported
  • Moon phase and solunar periods — controlled studies show no consistent effect
  • Wind direction — mostly an angler’s folk sign
Under the hood

How it’s built

A small, cached Symfony service on top of open weather data — fast, transparent, and easy to reason about.

Symfony 7.4 serviceElasticsearch (only datastore)Redis cache · 3hOpen-Meteo + NOAANext.js frontend72h / 7-day forecast

Want something like this?

A scoring model, a forecast, or any feature that has to be transparent and defensible — tell me the problem and I’ll build it so you can explain every number.

© 2026 Vitalii KindrakevychBuilt in Cartagena · Available worldwideSee it live