Fish Tracker
Nov 2025 - Present
The Rébénacq fish farms currently manage their operations mainly through manual processes based on Excel and daily paper logs.
Overview
Role
Fullstack Developer, UI/UX Designer
Full Stack Web Application Development, UI/UX Design, Frontend and Backend Development
Platform
Web
Timeline
Nov 2025 - Present
Status
Shipped to Production
Deliverables
Full Stack Web Application with a production-ready.
Overview
We provide digital solutions through dedicated business applications to simplify daily operations, improve data reliability, and enhance the ability to anticipate and manage trout farming effectively. A Site represents a physical farm location composed of multiple Pools, each further divided into Pool Subdivisions. These subdivisions serve as internal compartments that allow water flow while controlling fish movement. Each site also tracks available feed, which is deducted during usage, while restocking and stock transfers are handled separately through the Inventory Management system.
Highlights
The Problems
Weekly manual transcription of paper logs, causing delays and a high risk of errors.
No real-time centralization or visibility over ponds, fish batches, and sites.
Non-automated stock and supply management, with manual tracking of consumption and needs.
Difficulty anticipating risks related to fish health, environmental conditions, and weather events (floods, oxygen drop, etc.).
Strategic Needs
Provide a real-time monitoring tool to centralize and simplify the management of ponds, batches, and stocks.
Improve global visibility on the state of the farms to better manage resources and supplies..
Anticipate risks related to fish health and environmental conditions (water quality, weather, etc.).
Offer a predictive view to adjust feeding rations and stock requirements several weeks in advance.
Operational Needs
Enable simple daily entry of field data (feeding, mortality, temperature, transfers) without relying on paper.
Deliver smart alerts regarding stock thresholds and supply needs.
Visualize historical trends (average weight, mortality, temperature, oxygen levels) to detect and explain anomalies.
Provide a simple and accessible interface for field teams.
Domain Model
A Site is a physical location containing several Pools, each of which is further divided into Pool Subdivisions. These subdivisions act as internal compartments that allow water to pass through while restricting fish movement. A site also contains information about the amount of food available at that location, but it is only decremented here. Restocking and stock transfer operations are done in a separate Inventory Management Brick.
The Solution
A centralized platform to manage Sites, Pools, Subdivisions, Batches, and Fish Populations in one place
Daily digital entry of field data including feeding, mortality, temperature, and fish transfers — eliminating paper dependency.
A GraphQL API backend (NestJS + TypeORM) paired with a Nuxt/NuxtUI frontend for a smooth, accessible interface.
Role-based access control (field workers, managers, admins) to ensure data integrity at every level.
Integration with a separate Fish Transfer Brick and Inventory Management Brick for a fully composable system.
Key Features
Real-time dashboard — Mortality rates, average daily food consumption, temperature trends, and site-level food availability displayed with smart alerts.
Event logging — Feeding and mortality events are fully editable with a complete audit trail; no silent overwrites or hard deletes.
Twice-daily temperature recording — Enforced morning and afternoon readings with alerts for missing entries.
Population management — Fish counts auto-update when mortality events are recorded, edited, or deleted; composite populations supported for fish temporarily split across subdivisions.
Smart alerts — Notifications for overfeeding, abnormal mortality, low food stocks, and missing temperature readings.
Role-based permissions — Read access for all authenticated users; write access controlled by manager/admin roles; batch creation restricted to admins only.
Mobile-responsive UI — Designed for use by field technicians on smartphones directly on-site
Internationalization — Supports French and English out of the box via @nuxtjs/i18n.
My Contributions
Led the end-to-end development of the Fish Tracker Brick, including UI/UX design, frontend implementation, and backend API development.
Designed and implemented the domain model and database schema to support complex relationships between sites, pools, subdivisions, batches, and populations.
Implemented role-based access control to ensure data integrity while providing appropriate permissions for different user roles.
Collaborated closely with field teams to gather feedback and iteratively improve the user interface for optimal usability in real-world conditions.
Integrated the Fish Tracker with separate Bricks for inventory management and fish transfers to create a cohesive ecosystem of composable applications.
What I Mistakes
Stock & Feed Management Complexity — Initially, I planned to reduce stock whenever a feeding event occurs. However, I realized this approach could lead to serious inconsistencies. For example, if there are network issues or a server crash during the feeding process, the feeding event might be recorded while the stock update fails causing inaccurate data. To prevent this, I am researching and implementing database transactions using TypeORM. This ensures that both the feeding event and stock update happen atomically either both succeed or both fail maintaining data consistency.
GraphQL Query Performance — I initially implemented nested GraphQL queries to fetch related data (e.g., fetching a site with its pools and subdivisions). However, this led to performance issues due to the N+1 query problem. To address this, I am implementing DataLoader to batch and cache database requests, significantly improving query performance and reducing server load.
GraphQL Caching Strategy — At the beginning, I didn’t implement any caching, which led to an increase in unnecessary server calls. For example, after updating a feeding event, the entire feeding list had to be fetched again manually, resulting in repeated server requests. To optimize this, instead of refetching all data, I can directly update the local cache of the feeding list. This reduces redundant network calls and improves overall performance and responsiveness.
Scalability considerations — Designing the system to handle potentially large datasets and complex queries led to insights on optimizing database schema and query performance.
How Did I Complete It?
Our system designer design the domain model and database schema, and I implemented the backend API using NestJS and TypeORM. I then designed the frontend UI/UX in Figma, focusing on simplicity and accessibility for field workers. The frontend was built using Nuxt.js and NuxtUI, with a mobile-responsive design. I implemented role-based access control to ensure data integrity while providing appropriate permissions for different user roles. Finally, I integrated the Fish Tracker with separate Bricks for inventory management and fish transfers to create a cohesive ecosystem of composable applications.
Reflections
Modular by design — The tracker is intentionally scoped to population tracking only. Subdivision management and inventory restocking are delegated to separate Bricks, keeping each module focused and reusable.
Data integrity over convenience — All edits to feeding and mortality events preserve history through an audit trail, prioritizing traceability over simplicity.
Read-only subdivisions — This Brick deliberately exposes no create/edit/delete controls for subdivisions, respecting the single-responsibility boundary with the Fish Transfer Brick.
Scalability considerations — DataLoader is recommended for nested GraphQL queries, and dashboard metrics are computed and cached rather than persisted in the database to keep the schema clean.
Field-first UX — The interface prioritizes simplicity and accessibility for non-technical field workers, with inline validation, friendly error messages, and ARIA-compliant components.
Design Process
Stack
Closing Note
The Fish Farm Population Tracker marks an important step forward in modernizing the Rébénacq fish farm operations. By replacing fragmented paper logs and Excel sheets with a centralized, real-time digital system, this tool empowers every team member — from field workers to managers — to make faster, more informed decisions.
Built on Brickcode's modular philosophy, this solution is not just a standalone application. It is a living component of a broader Digital Brain that can grow alongside the business — connecting seamlessly with inventory management, fish transfers, and future operational needs.
With a strong foundation in data integrity, role-based access, and field-friendly design, the tracker is built not only for today's challenges but for tomorrow's scale.
Thank you for Reading 👻