Skip to content

Technigo Final Project: BADA - Real-time beach water quality web app with maps & favorites#136

Open
govargas wants to merge 300 commits into
Technigo:mainfrom
govargas:main
Open

Technigo Final Project: BADA - Real-time beach water quality web app with maps & favorites#136
govargas wants to merge 300 commits into
Technigo:mainfrom
govargas:main

Conversation

@govargas

@govargas govargas commented Nov 3, 2025

Copy link
Copy Markdown

🎓 Web dev spring 2025 Final Project Submission

This is my final project for the Technigo Fullstack JavaScript Bootcamp. BADA is a web application that helps people in Sweden find safe beaches with real-time water quality data.

🎯 What I Built

A full-stack application featuring:

  • Frontend: React + TypeScript, MapLibre maps, i18next multi-language support
  • Backend: Express API with MongoDB, JWT authentication, caching layer
  • Features: Interactive beach map, geolocation, favorites with drag-drop sorting, dark mode
  • Lighthouse Scores: 100% Accessibility, SEO, and Best Practices

🚀 Key Achievements

  • Integrated official Swedish Agency for Marine and Water Management (Havs- och vatten­myndigheten) API with intelligent caching
  • Built custom React hooks for geolocation, dark mode, and outside-click detection
  • Implemented server-side caching to reduce API load and improve performance
  • Achieved full accessibility compliance (WCAG standards)
  • Created seamless UX with search autocomplete, toast notifications, and smooth animations
  • Deployed frontend (Netlify) and backend (Vercel) with CI/CD

💡 Technical Highlights

  • Type Safety: Full TypeScript implementation across frontend and backend
  • State Management: Zustand for global state, TanStack Query for server state
  • Performance: Optimized API calls with intelligent caching and query invalidation
  • Accessibility: Keyboard navigation, ARIA labels, screen reader support
  • UX Polish: Dark mode, i18n (Swedish/English), error boundaries, loading states

🎨 Design Decisions

  • Mobile-first responsive design with Tailwind CSS
  • Clean, minimal, easy to read and navigate UI
  • Consistent design tokens for colors, spacing, and typography
  • Dark mode that respects system preferences

📚 What I Learned

Building BADA taught me how to architect a real-world full-stack application, integrate external APIs, implement authentication, and focus on user experience and accessibility. I'm proud of the result and I'm looking forward to read your feedback!


Live Demo: https://badaweb.netlify.app/
Test Account: [email protected] / Test1234

See README.md for full documentation and setup instructions.

govargas and others added 30 commits June 29, 2026 17:44
On this site _redirects rules win over netlify.toml, and its /* catch-all
shadowed the signed API proxy (which only netlify.toml supports). Move all
routing (signed /api proxy + SPA fallback) into netlify.toml and remove
_redirects so the signed rule actually fires.
Signed proxy verified working (x-nf-sign validates, hardened mode active).
Remove the /api/proxy-check endpoint, the netlify.toml test paths, and the
marker header.
HaV returns dissuasion as an array of objects
{description, dissuasionTypeText, startdate, type}, but the frontend
typed it as string[] and rendered each entry directly, throwing
React error Technigo#31 on any beach with an active advisory.

Type dissuasion correctly and render its fields as text, with a
guard tolerating a bare string for older/cached shapes.
Label and pill color were derived by two separate mappers
(getClassificationKey + a qualityClass duplicated across
BeachDetailPage and FavoritesPage), which could drift.

Introduce getQualityCategory as the single source of truth and
derive both the i18n label key and the KPI tone class from it, so a
beach's wording and color can never disagree. deriveClassificationCode
now delegates to it too.
A beach can have an active swimming advisory (dissuasion) due to
observed algae while its last routine sample read 'no bloom'. The
page showed both the red advisory and a green 'safe to swim' verdict
from the sample, contradicting each other.

Suppress the algae safety verdict when an advisory is active (swim
safety is owned by the top verdict + advisory box), and add a note
explaining the advisory is precautionary and stays until conditions
clearly improve.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants