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


- Fish Species
- 80+
- Vector Dimensions
- 1024
- Map Layers
- 4
- SQL Databases
- 0
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.
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.
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.
Built for Real Fishermen
- 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.
- 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.
- 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.
- 04
Single-Engine Backend
One Elasticsearch cluster holds everything — posts, spots, users, embeddings, analytics. No SQL. Indices are r_-prefixed, migrations are additive only.
- 05
Social + Gamification
Posts, comments, likes, reels (Wave), challenges with auto-tracked tasks, badges, XP and levels. Catch +30, post +10, comment +5.
- 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).
See It in Action


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.
Settle
Non-custodial crypto invoicing in stablecoins

Let’s talk.
Tell us what you’re building. You’ll get a reply and a first estimate within 24 hours.
Fill in the brief →