Rybalka Club

Fishing community, bite forecast and an AI assistant

A live fishing radar for Ukraine — spot map, bite forecast, social feed of catches, an 80-species fish handbook, and an AI assistant grounded in a curated knowledge base. Built on a single Elasticsearch cluster, with embeddings-powered semantic search and RAG answers that cite their sources.

Sector
Community · Ukraine
Stack
Next.js 16 · Symfony 7.4 · Elasticsearch · TEI + Claude / GPT
Rybalka Club — Desktop Version
In numbers
Fish Species
80+
Vector Dimensions
1024
Map Layers
4
SQL Databases
0
01 — About the Project

Living Radar for Every Fisherman

Ukrainian fishermen needed a single place to see where the bite is on, log their catches, swap tips, and check the rules for their oblast — without an English-language Western app that has no idea their lake exists. We built it.

Every feature, from the Leaflet map with bite forecast to the AI assistant that answers in Ukrainian with source citations, runs on a Symfony 7.4 API talking to a single Elasticsearch cluster (no SQL). RAG search uses multilingual e5-large embeddings via Hugging Face TEI, and OpenAI or Claude for the final answer.

02 — The Challenge

Build a fishing community that does seven things well — map, forecast, social feed, reels, handbook, AI assistant, and admin moderation — on a single Hetzner server, with one storage engine, no SQL, and answers in Ukrainian that cite the source.

03 — The Solution

Elasticsearch as the only datastore (every index r_-prefixed), Symfony 7.4 + PHP 8.4 for the API, Next.js 16 with App Router on the front, Leaflet for the radar, Recharts for the admin analytics, and a thin AiClient that fronts both OpenAI and Claude. Embeddings from Hugging Face TEI (1024-dim e5-large) drive hybrid BM25 + kNN + RRF search.

04 — Key Features

Built for Real Fishermen

  1. 01

    Live Spot Radar

    Leaflet-powered map with catches, spots, heatmap, water-body and depth layers; dark/satellite/relief basemaps and place-search geocoding included.

  2. 02

    Bite Forecast

    Per-spot prediction combining pressure, wind, water temperature, moon phase, solunar, Kp index, and river level — pulled live and presented as a single readable score.

  3. 03

    AI Assistant (RAG)

    Answers fishing questions in Ukrainian by retrieving from r_knowledge with e5-large embeddings, then citing sources [n] in the response. Built to never hallucinate a spot.

  4. 04

    Single-Engine Backend

    One Elasticsearch cluster holds everything — posts, spots, users, embeddings, analytics. No SQL. Indices are r_-prefixed, migrations are additive only.

  5. 05

    Social + Gamification

    Posts, comments, likes, reels (Wave), challenges with auto-tracked tasks, badges, XP and levels. Catch +30, post +10, comment +5.

  6. 06

    Privacy-Aware Analytics

    middleware.ts logs every navigation to r_analytics — no IPs, no PII. Admin dashboard separates humans vs bots, content type, countries (7/30/90-day ranges).

05 — Screenshots

See It in Action

Rybalka Club — Desktop Version
Desktop Version
Rybalka Club — Mobile Version
Mobile Version
06 — Technology

Under the Hood

One Elasticsearch cluster, one Symfony API, one Next.js front-end, one box at Hetzner. Cloudflare in front, TEI for embeddings, Hetzner S3 for media. Boring on purpose — fast, cheap, and easy to reason about.

Next.js 16
App Router + SSR/RSC
Symfony 7.4
PHP 8.4 API
Elasticsearch
Only datastore, r_ prefix
TEI + Claude / GPT
RAG with citations

Building Community + AI?

From community-first portals to RAG-powered AI assistants, we ship platforms that combine real users, real content, and AI that knows its sources. Boring stack, exciting outcomes.

Next projectFintech · SaaS

Settle

Non-custodial crypto invoicing in stablecoins

New projects

Let’s talk.

[email protected]

Tell us what you’re building. You’ll get a reply and a first estimate within 24 hours.

Fill in the brief →
Cartagena, Spain
Europe & Latin America
+34 624410817