All notable changes to Sakeenah will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Name input lock: Guest name field automatically disabled when detected from invitation URL/localStorage to prevent impersonation (afc8be6)
- Inline error messages: Beautiful animated error banners replacing browser alert() dialogs for better UX (5155c57)
- AlertCircle icon for error state visualization in wishes form (5155c57)
- Wish form errors now display as inline rose-colored banners instead of blocking alert() dialogs (5155c57)
- Error messages auto-dismiss after 5 seconds with manual close option (5155c57)
- Name input styling updated to show disabled state with gray background and reduced opacity (afc8be6)
- Simplified UX by removing explanatory helper text from disabled name input (f341de1)
- Non-intrusive error handling that doesn't block UI interaction (5155c57)
- Clear visual feedback for locked/unlocked name input states (afc8be6)
- Enhanced spam prevention by disabling name modification when guest is identified from invitation (afc8be6)
- Multi-layer protection against fake wishes: frontend lock + backend validation + database constraint (afc8be6)
2.1.0 - 2026-02-05
- Comprehensive Zod validation schemas in src/server/schemas.js for all API endpoints (23c87eb)
- Automatic input sanitization and transformation through Zod middleware (23c87eb)
- Regex validation for wedding UID format enforcement (lowercase, numbers, hyphens only) (23c87eb)
- Detailed validation error messages for better debugging and user feedback (23c87eb)
- Click-outside detection for attendance dropdown in Wishes form for better UX
- Guest name persistence in Wishes form after submission for improved user experience
- Spam prevention: Unique constraint preventing duplicate wishes from same guest name per invitation
- Database migration: Migration script (001-add-unique-wish-constraint.sql) for adding unique wish constraint to existing databases
- UX improvement: Thank you message displayed after successful wish submission preventing re-submission
- Auto-update invitations: System automatically updates localStorage when guest opens different invitation link (0b104ad)
- Console logging: Debug logs when switching between different wedding UIDs or guest names (0b104ad)
- Refactored all API endpoints to use zValidator middleware for type-safe request validation (23c87eb)
- Replaced manual validation code with declarative Zod schemas across invitation and wishes endpoints (23c87eb)
- Enhanced pagination validation with automatic string-to-number transformation (23c87eb)
- Wish creation endpoint now checks for duplicate submissions before inserting
- Error messages improved to clearly indicate when a guest has already submitted a wish
- Invitation context priority: URL parameters now take precedence over localStorage for invitation data (0b104ad)
- Automatic data override: Opening new invitation link updates stored wedding UID and guest name (0b104ad)
- BREAKING: All source filenames converted to kebab-case for consistency (4a24aa2)
- Components: BottomBar.jsx → bottom-bar.jsx, EventsCard.jsx → events-card.jsx, Layout.jsx → layout.jsx
- Pages: Hero.jsx → hero.jsx, Events.jsx → events.jsx, Wishes.jsx → wishes.jsx, etc.
- Context: InvitationContext.jsx → invitation-context.jsx
- Hooks: useConfig.js → use-config.js
- Lib: formatEventDate.js → format-event-date.js, invitationStorage.js → invitation-storage.js
- Utils: generateInvitationLink.js → generate-invitation-link.js
- Root: App.jsx → app.jsx
- All import statements automatically updated
- CRITICAL: Fixed dynamic Tailwind class generation in hero.jsx FloatingHearts component that would fail at build time (hero.jsx:89-95)
- CRITICAL: Fixed SSR crash caused by accessing window.innerWidth before component mount in hero.jsx (hero.jsx:71)
- CRITICAL: Fixed invalid CSS grid class
md:grid-row-2tomd:grid-cols-2in location.jsx (location.jsx:56) - Later reverted per user request - Fixed missing
calculateTimeLeftfunction in useEffect dependency array causing stale closure in hero.jsx countdown timer (hero.jsx:41) - Fixed misleading helper text in wishes.jsx form that showed "detected from invitation" for manually typed names (wishes.jsx:281-286)
- Fixed attendance dropdown not closing when clicking outside the dropdown area (wishes.jsx:300-354)
- Implemented one-wish-per-guest limit to prevent spam and duplicate submissions
- Added database-level constraint ensuring data integrity for wish uniqueness
- Enhanced error handling for duplicate wish attempts with proper HTTP 409 status codes
- Added zod@4.3.6 for schema validation (23c87eb)
- Added @hono/zod-validator@0.7.6 for Hono integration (23c87eb)
- Updated wrangler from 4.51.0 to 4.62.0 (09a761a)
2.0.0 - 2026-02-04
- localStorage utility for secure wedding UID and guest name storage with automatic 30-day expiration (bc8b4ee)
- Automatic URL sanitization that cleans sensitive parameters after data extraction (bc8b4ee)
- Comprehensive anti-scraping meta tags in App.jsx to prevent Wayback Machine and search engine archiving (bc8b4ee)
- Enhanced robots.txt with specific directives to block web crawlers and archive bots (bc8b4ee)
- Detailed security and privacy documentation in README.md explaining new URL behavior (bc8b4ee)
- Data persistence mechanism that maintains invitation state across browser sessions for 30 days (bc8b4ee)
- BREAKING: URLs now automatically clean to root path (/) after initial load, hiding wedding UID and guest parameters (bc8b4ee)
- InvitationContext now prioritizes localStorage over URL parameters for data retrieval (bc8b4ee)
- Hero page updated to retrieve guest names from localStorage instead of URL query parameters (bc8b4ee)
- Wishes page updated to retrieve guest names from localStorage instead of URL query parameters (bc8b4ee)
- README.md personalized invitations section completely rewritten with new security-focused workflow (bc8b4ee)
- Security & Compliance section enhanced with localStorage security, URL sanitization, and anti-scraping details (bc8b4ee)
- Wedding UIDs and guest names now hidden from URL history and browser bookmarks after initial load (bc8b4ee)
- Prevents URL injection attacks by removing sensitive data from visible URL (bc8b4ee)
- Blocks Wayback Machine and web archive services from scraping invitation data (bc8b4ee)
- Implements automatic data expiration to limit privacy exposure (bc8b4ee)
- Adds cache-control and no-archive meta directives for enhanced privacy protection (bc8b4ee)
For users upgrading from v1.x:
-
URL Behavior Change: After guests open their personalized invitation link, the URL will automatically clean to
https://yourdomain.com. This is expected behavior. -
Bookmarks: Previous bookmarks with full paths will still work on first load, but URLs will clean automatically.
-
Data Persistence: Invitation data now persists in browser localStorage for 30 days. Clearing browser data will require guests to click their original link again.
-
No Server Changes: This is entirely a client-side change. No backend or database modifications required.
1.1.0 - 2026-02-04
- Comprehensive contribution guidelines in CONTRIBUTING.md covering development workflow, coding standards, database migrations, and cultural guidelines for Islamic content (a442235)
- Community Code of Conduct establishing behavioral standards and Islamic values for contributors (a442235)
- GitHub pull request template with extensive checklist for code quality, testing, database changes, and cultural considerations (a442235)
- GitHub issue templates for bug reports, feature requests, documentation improvements, and questions (a442235)
- Preview image display in README.md showcasing the platform interface (9810fec)
- Updated README.md contributing section to reference detailed CONTRIBUTING.md guide (a442235)
- Enhanced package.json with proper project metadata, description, keywords, and repository information (93c9e06)
- Improved installation guide with clearer step-by-step instructions and accurate implementation details (1240d9d)
- Upgraded README.md to enterprise-grade SaaS documentation with comprehensive feature descriptions, architecture diagrams, and deployment guides (834f41a)
- Broken link to non-existent PERSONALIZED-INVITATIONS.md documentation file (f2c33e5)
1.0.0 - 2025-12-01
- Backend API server using Hono framework for lightweight, edge-compatible request handling (1ae15a4)
- PostgreSQL database integration with connection pooling for multi-tenant wedding data storage (1ae15a4)
- REST API endpoints for wedding invitations, wishes, and attendance statistics (1ae15a4)
- Multi-tenant architecture supporting unlimited wedding invitations from single deployment (1ae15a4)
- Database schema with invitations, agenda, banks, and wishes tables (1ae15a4)
- SQL templates for database schema creation and wedding data insertion (1ae15a4)
- Zod schema validation for API request validation and type safety (ae62dd9)
- CORS configuration for cross-origin API access from frontend (ac4c677)
- Asia/Jakarta timezone standardization for event date handling (d4549f3)
- Conditional rendering for gifts section when bank account data is unavailable (12e07fa)
- Migrated from static configuration to database-driven wedding data management (1ae15a4)
- Updated API routes to support UID-based wedding routing for multi-tenancy (7ddfc36)
- Improved error handling and response formatting in API endpoints (2be1fd0)
- Enhanced database connection management with proper pooling (a8ce3ab)
0.9.0 - 2025-08-29
- General updates to codebase and dependencies (cc639c9)
0.8.0 - 2025-06-29
- Updated README.md documentation (7a861c1)
0.7.0 - 2025-05-05
- Vercel deployment configuration and related files (02f59af)
0.6.0 - 2025-05-02
- New audio files and assets for wedding invitation experience (c689704)
- Updated static configuration in config.js (cea022d)
0.5.0 - 2025-04-01
- Deprecated nature sound audio file (f12b3f7)
- Updated Vercel deployment configuration (2e6a135)
- Improved robots.txt for SEO (6212966)
- Enhanced Vercel button deployment setup (9d27a21)
- Optimized GitHub Actions workflows (593113f)
- Updated README.md with better documentation (bf5a9de)
0.4.0 - 2025-03-15
- Custom GitHub Actions workflows for deployment automation (f702e93)
- Comprehensive JSDoc documentation for configuration and components (d552836, b5147b7)
- Event date formatting and display issues (93573f2)
- Updated README.md documentation (0328b35, c71b0af)
0.3.0 - 2025-02-20
- Updated wedding couple information and data (9692004, b2abfd3, 9506fbf)
- Converted interface language to Bahasa Indonesia (29b79a0)
- GitHub Sponsors funding configuration (4138948, 05420c1)
0.2.0 - 2025-01-10
- Complete page revamp for all components using modern design patterns (c461a25, 8fcfaea, 2dd7984, 0638b4d, 58d49aa, 09b5c82, e046326, a78f508, db91826, 6ef79f3, bf35c84, 2ca91f1, 8e01923, 48455a5)
- Improved UI/UX across Hero, Events, Wishes, Location, and Gifts pages
- Enhanced responsive design for mobile devices
- Updated animation transitions using Framer Motion
- README.md documentation updates (b147ea4, a3f8e5b, 537b384, bb8c256)
0.1.0 - 2024-12-01
- Initial project setup and foundation (b121746)
- React 18 frontend with Vite build tooling
- Tailwind CSS for utility-first styling
- Framer Motion for animations and transitions
- React Router v7 for client-side navigation
- TanStack Query for server state management
- Lucide React icons
- Landing page with personalized guest greetings
- Hero section with countdown timer
- Events page with wedding agenda display
- Wishes page with message submission and attendance tracking
- Location page with Google Maps integration
- Gifts page with digital envelope and bank account details
- Background music controls with autoplay support
- Confetti effects for celebration moments
- Mobile-first responsive design
- Base64 URL encoding for personalized guest invitations
This project uses Semantic Versioning:
- MAJOR version (X.0.0): Incompatible API changes or major architectural changes
- MINOR version (0.X.0): New features added in backward-compatible manner
- PATCH version (0.0.X): Backward-compatible bug fixes
- Added: New features or functionality
- Changed: Changes to existing functionality
- Deprecated: Soon-to-be removed features
- Removed: Removed features or files
- Fixed: Bug fixes
- Security: Vulnerability fixes
Each change entry includes the short commit hash in parentheses (e.g., a442235) for traceability. Full commit details can be viewed using:
git show <commit-hash>