CHANGELOG.md

Changelog

All notable changes to RentNGo are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. From v2.4.0 onward, version sections below the [Unreleased] heading are generated automatically by release-please from Conventional Commits.

[Unreleased]

Infrastructure

  • Dev environment: develop branch now deploys to a dedicated Convex deployment (develop, same project) and is served at dev.rngo.ro; upgraded convex to 1.42.1 and @convex-dev/resend to 0.2.5
  • Non-production deployments are excluded from search indexing (robots.txt + noindex meta), and dev emails are visibly differentiated (env-driven sender name, [DEV] subject prefix, site-URL-aware logo)

[2.4.0] - 2026-06-02

Added

  • Google Tag Manager: wired in root layout via @next/third-parties/google GoogleTagManager, configured by NEXT_PUBLIC_GTM_ID

    • Only renders when env var is set
    • Direct Google Ads gtag removed from app/layout.tsx — Ads conversions are now configured as a tag inside the GTM container (NEXT_PUBLIC_GOOGLE_ADS_ID no longer used by app code)
  • Bilingual blog support: blogs now have separate Romanian and English content

    • Schema: title_ro/en, description_ro/en, content_ro/en, readingTime_ro/en
    • Public queries accept locale arg, return locale-resolved fields
    • Admin queries return both language variants for editing
    • Admin create/edit dialogs have RO/EN content tabs
    • Preview tab has locale toggle
    • Static generation and sitemap work with locale-aware queries
    • Migration script: npx convex run migrations/bilingualBlogs
  • SEO overhaul: comprehensive SEO improvements following Next.js best practices

    • Created shared buildMetadata() helper (lib/metadata.ts) eliminating duplicated metadata across all pages
    • Added jsonLdScriptContent() utility with XSS escaping for all JSON-LD structured data
    • Dynamic <html lang> attribute based on locale (was hardcoded to "ro")
    • Added x-default hreflang to all page alternates
    • Moved JSON-LD structured data from client components to server-rendered layouts (transfers, contact, about)
    • Added generateStaticParams for car detail and blog detail pages
    • Added breadcrumb JSON-LD schema for car detail pages
    • Added noindex metadata for transactional pages (reservation, profile)
    • Fixed blog keywords type (was string, now string[])
  • Barrel import optimization: Added optimizePackageImports to next.config.ts

    • Configured for lucide-react (80 files) and date-fns (8 files)
    • Reduces cold start by 200-800ms, speeds up dev server boot
    • Automatically transforms barrel imports to direct imports at build time
  • Dynamic import admin dialogs: Converted 10 admin dialogs to lazy-load with next/dynamic

    • CreateVehicleDialog, EditVehicleDialog
    • CreateBlogDialog, EditBlogDialog
    • CreateReservationDialog, EditReservationDialog, ReservationEmailDialog
    • CreateSeasonDialog, EditSeasonDialog
    • TransferPricingDialog, CreateClassDialog
    • Dialogs now load on-demand when opened, reducing initial page bundle
  • Memoize expensive components: Applied React.memo() and useMemo() optimizations

    • Components wrapped with React.memo(): VehicleCard, TransferVehicleCard, BlogCard, FilterCheckboxItem, VehiclePricingCard, TransferBookingFloatingCard
    • Calculations memoized with useMemo(): pricing tip in VehiclePricingCard, vehicle grouping in VehicleListDisplay, reservation pricing hook, pagination in UserReservationsTable, featured vehicles hook
    • Prevents unnecessary re-renders in list-rendered components and expensive calculations

[2.3.0] - 2026-01-20

Added

  • Transfer vehicle seats configuration: Added transferSeats field for accurate passenger capacity filtering
    • New transferSeats field on vehicles schema (optional number)
    • Field only visible in admin when "Is Transfer Vehicle" is checked
    • Filtering logic: uses transferSeats if set, otherwise falls back to seats - 2
    • Transfer vehicle cards and emails show transferSeats ?? seats
    • Admin dialogs show regular seats value as placeholder for reference

Changed

  • Transfer vehicle filtering now uses effective capacity (transferSeats ?? (seats - 2)) instead of adding +2 buffer
  • Transfer confirmation emails pass effective seats for vehicle info section
  • Transfer vehicle list component now passes transferSeats to vehicle cards

Fixed

  • Removed cursor-pointer from terms acceptance text on transfer booking page (only checkbox and links are clickable)

[2.2.0] - 2026-01-20

Added

  • Transfer booking Terms & Privacy links: Added links to Terms & Conditions and Privacy Policy
    • Links open in new tab with proper rel="noopener noreferrer"
    • Locale-based translations (Romanian/English)
    • Styling matches the reservation page implementation
    • Added border-top separator for visual distinction from payment methods

[2.1.0] - 2026-01-20

Added

  • Transfer email vehicle details: Added full vehicle information to transfer confirmation emails
    • Extended TransferVehicleInfo type with type, seats, transmission, fuelType
    • Reused VehicleInfoSection component from reservation emails
    • Both user and admin transfer emails now display vehicle details
    • Includes Romanian and English translations for vehicle section labels

[2.0.0] - 2026-01-20

Added

  • Vehicle class transfer multiplier UI: Admin can now edit transfer multiplier per class
    • Added "Transfer Pricing" section to class detail page (/admin/vehicles/classes/[classId])
    • Includes Base Fare and Rate Multiplier fields with inline editing
    • Separated pricing settings into "Rental Pricing" and "Transfer Pricing" sections

Changed

  • Class detail page pricing UI reorganized for better clarity
    • "Rental Pricing" section: Extra 50km Price
    • "Transfer Pricing" section: Base Fare, Rate Multiplier

[1.9.0] - 2026-01-20

Added

  • Vehicle slug URLs: SEO-friendly car detail page URLs
    • Added slug field to vehicles schema with unique index
    • Car detail pages now use /cars/[slug] instead of /cars/[id]
    • Admin dialogs include slug input with auto-generate button (sparkle icon)
    • Slug format: {make}-{model}-{year} (e.g., bmw-x5-2024)
    • Added getBySlug query with uniqueness validation
    • Added generateVehicleSlug() and validateVehicleSlug() utilities

Changed

  • Vehicle cards now link to slug-based URLs (falls back to _id for backwards compatibility)
  • Reservation page back button uses slug-based URL
  • Sitemap generates slug-based URLs for vehicles

[1.8.1] - 2026-01-20

Removed

  • Email components consolidation: Removed unused legacy email system
    • Deleted components/shared/email/ directory (10 files) - legacy code from before Convex migration
    • Deleted deprecated /api/send/request-confirmation route (only consumer of shared/email)
    • Production email system lives in convex/emails/ (self-contained with 4 templates and 8 components)
    • Kept /api/send/reservation-email route (used by admin for manual resends, has inline HTML)

[1.8.0] - 2026-01-20

Changed

  • Component directory restructuring: Reorganized ~130 components from type-based to feature-based structure
    • Created shared/ directory with auth/, search-filters/, providers/, navigation/
    • Created features/ directory with vehicles/, reservations/, transfers/, blog/, landing/
    • Reorganized admin/ into resource-based subdirectories: vehicles/, reservations/, transfers/, vehicle-classes/, seasons/, blog/
    • Moved 14 scattered top-level components to proper locations
    • Added barrel exports (index.ts) for cleaner imports
    • Updated all import paths across the codebase

[1.7.0] - 2026-01-19

Removed

  • payments table from schema (never implemented)
  • vehicles.class field (replaced by classId)
  • vehicles.pricePerDay field (replaced by pricingTiers)
  • by_class index from vehicles table
  • hooks/useSeasonalPricing.ts (replaced by useDateBasedSeasonalPricing)
  • VehicleClass type export from types/vehicle.ts
  • ~20 lines of TODO comments from convex/reservations.ts
  • Legacy pricePerDay fallbacks from pricing utilities

Added

  • convex/migrations/clearDeprecatedClassField.ts - Migration to clear deprecated class field
  • convex/migrations/clearDeprecatedPricePerDay.ts - Migration to clear deprecated pricePerDay field

Changed

  • Admin vehicle dialogs now use useDateBasedSeasonalPricing hook
  • vehicles-table.tsx now looks up class name via classId reference
  • Pricing logic in types/vehicle.ts now requires pricingTiers (no fallback)
  • Transfer page titles: removed "VIP" keyword from translations (en/ro)

[1.6.0] - 2026-01-19

Removed

  • 19 unused component files (~2,500 lines of code):
    • Vehicle: edit-vehicle-form, create-vehicle-form, vehicle-image-carrousel (typo), 4 skeletons
    • UI (shadcn): input-otp, navigation-menu, display-cards, slideshow, collapsible, drawer, progressive-blur
    • Admin: team-switcher, nav-projects
    • Top-level: location-search-input, rental-details-skeleton, login-form

Changed

  • Updated components/vehicle/index.ts to remove stale exports

[1.5.0] - 2026-01-19

Added

  • Sticky glassmorphic booking card on transfer vehicle selection page
  • Card uses CSS position: sticky to stay at bottom while scrolling
  • TransferBookingFloatingCard component with glass effect styling
  • onVehiclesLoaded callback to TransferVehicleList component

Changed

  • Transfer vehicle selection page uses full-width vehicle grid
  • Continue button always visible via sticky card at bottom of container

[1.4.0] - 2026-01-19

Changed

  • Renamed admin vehicle classes section from "ordering" to "classes"
  • Button: "Manage Ordering" → "Manage Classes"
  • Page title: "Class Ordering" → "Vehicle Classes"
  • URL: /admin/vehicles/ordering → /admin/vehicles/classes

[1.3.0] - 2026-01-19

Added

  • Tiered transfer pricing system with admin-configurable km ranges
  • Transfer base fare per vehicle class
  • Transfer pricing tiers management in admin panel

Changed

  • Transfer pricing now uses: base_fare + (extra_km × tier_price × class_multiplier)
  • Simplified client-facing transfer pricing display (distance + total only)

[1.2.0] - 2026-01-18

Added

  • Sequential calendar flow: return date calendar auto-opens after selecting pickup date

Changed

  • Applied sequential calendar behavior to all reservation pages

[1.1.0] - 2026-01-18

Changed

  • Default pickup and return time set to 10:00

[1.0.0] - 2026-01-18

Added

  • Initial PRD documentation
  • Vehicle reservations with tiered pricing
  • VIP transfer booking with Mapbox integration
  • Seasonal pricing system
  • Admin dashboard for vehicles, reservations, transfers, seasons, blogs
  • Email notifications via Resend
  • Romanian and English language support