Recent Changes
This project is developed with AI assistance. Each feature shows the AI/Human contribution ratio:
- Decisions: Who drove the design choices (e.g., 30/70 = 30% AI, 70% Human)
- Code: Who wrote the implementation (e.g., 90/10 = 90% AI, 10% Human)
April 2026
Cleaner Finalized Poll View
When a poll is finalized, the admin page is now more focused:
- Results table is shown directly inside the "Poll Finalized" box
- Admin URL sharing notice is hidden (no longer needed)
- Less clutter — just the result and the calendar
Decisions: 20/80 · Code: 95/5 · App size: +20 lines
Most-Voted Dates Highlighted
Before finalizing, date columns with the most votes are now highlighted in the results table, making it easier to pick the best date.
Decisions: 30/70 · Code: 90/10 · App size: +30 lines
January 2026
Improved Help & Navigation
Several small improvements to help users find their way around:
- Login link added to landing page info box for easier access
- URL notices on admin and participant pages now mention "My Polls" as the way to find your polls later
- Participants see a reminder to verify their email for easier return visits
- Consolidated CSS for faster page loads
Decisions: 20/80 · Code: 90/10 · App size: +50 lines
Faster Startup & Better Monitoring
Infrastructure improvements for better performance and observability:
- Switched to New Relic for application monitoring
- Reduced startup time with optimized database connection pooling
- Smaller Docker image using Alpine JRE
- Parallel test execution for faster CI builds
- LightningCSS binary caching in CI
Decisions: 30/70 · Code: 85/15 · App size: +100 lines
December 2025
Log In Link for Visitors
Non-authenticated users now see a "Log in" link in the header. Clicking it takes you to a login page where you can verify your email to access your polls. For now, email is the only login method available.
Decisions: 20/80 · Code: 95/5 · App size: +50 lines
Account Icon with Log Out
Signed-in users now see a person icon in the header. Click it to see your email and a "Log out" link. Logging out clears your session and redirects you to the home page.
Decisions: 20/80 · Code: 95/5 · App size: +150 lines
My Polls: Both Admin and Participant Links
When you're both the creator and a participant of a poll, the My Polls page now shows links to both views. The main poll card links to the admin page as before, and a new "My Response" link in the corner takes you directly to your participant response. No more hunting for the right URL!
Decisions: 20/80 · Code: 95/5 · App size: +40 lines
Fourth Step in Admin Workflow
The admin progress indicator now includes a fourth step: "4. Finalize". This step becomes active when participants have voted, guiding you to choose a final date once everyone has responded. Completed when you finalize the poll.
Decisions: 30/70 · Code: 95/5 · App size: +30 lines
Delete Poll from Admin Page
You can now delete a poll directly from its admin page. A red "Delete Poll" button at the bottom of the page opens a confirmation dialog before deleting. After deletion, you're redirected to your My Polls list.
Decisions: 20/80 · Code: 90/10 · App size: +25 lines
Keyboard Shortcuts for Delete Confirmation
The delete confirmation dialog now responds to keyboard shortcuts: press Escape to cancel or Enter to confirm. Makes the delete workflow faster for keyboard users.
Decisions: 5/95 · Code: 95/5 · App size: +5 lines
Calendar Toast Visibility Fix
Fixed an issue where the "Saved" toast notification was being clipped by the calendar border. The toast now appears below the calendar where it's fully visible.
Decisions: 10/90 · Code: 95/5 · App size: +5 lines
Accessibility Improvements
Improved accessibility across all pages based on Lighthouse audit findings. Color contrast now meets WCAG standards (using darker shades for text), heading hierarchy follows proper order (h1 → h2 → h3), and all form inputs have proper labels for screen readers. Calendar day buttons now have aria-labels describing each date.
Decisions: 10/90 · Code: 95/5 · App size: +20 lines
Calendar Month Stays Put
Fixed an annoying bug where the calendar would jump back to the current month whenever you saved your name or the poll title. Now the calendar stays on whichever month you were viewing, so you can browse future months without interruption.
Decisions: 5/95 · Code: 95/5 · App size: +10 lines
Step Indicator Dynamic Updates
The admin progress steps now update in real-time as you make changes. Previously, the step indicator only showed the correct state on page load. Now when you add a title or select dates, the steps immediately reflect your progress without needing to refresh.
Decisions: 10/90 · Code: 90/10 · App size: +15 lines
Lazy Device Creation
Cookies are now only set when you actually interact with greitt (create a poll or vote). Just browsing the landing page or viewing polls won't store anything on your device. Better privacy by default.
Decisions: 20/80 · Code: 90/10 · App size: +30 lines
Static Asset Caching
Images, CSS, and JavaScript files are now cached in your browser for 1 hour. Pages load faster on repeat visits.
Decisions: 10/90 · Code: 95/5 · App size: +10 lines
Visual Progress Steps
The admin page now shows your progress with color-coded steps: "1. Name your poll → 2. Pick dates → 3. Share". Completed steps turn green with a checkmark, the current step is highlighted, and pending steps are grayed out. As you work through setting up your poll, the indicator updates automatically to show what's done and what's next.
Decisions: 30/70 · Code: 85/15 · App size: +75 lines
Enter Key Support for Text Fields
You can now press Enter to save changes in text input fields (poll title and participant name). No need to click the Save button - just type and press Enter for faster workflow.
Decisions: 5/95 · Code: 95/5 · App size: +15 lines
Calendar Overlay UX Improvement
When the calendar is disabled (before entering poll title or participant name), the overlay message now appears on top of the calendar instead of pushing it down. This prevents jarring layout shifts and makes the disabled state clearer. The overlay text is also bolder for better readability.
Decisions: 15/85 · Code: 95/5 · App size: +10 lines
My Polls Email Verification Box
Users visiting the My Polls page without verification can now enter their email directly on the page. A clear verification box appears with instructions, making it easier to access your polls without navigating away.
Decisions: 10/90 · Code: 95/5 · App size: +25 lines
Name Your Poll First
New polls now start with an empty title instead of "New Poll". Before you can pick dates, you need to give your poll a name. The calendar shows a friendly prompt until you enter a title. This helps ensure your shared links have meaningful names that participants will recognize.
Decisions: 20/80 · Code: 90/10 · App size: +30 lines
Native Mobile Sharing
You can now share polls directly to messaging apps on mobile devices. When viewing a poll (as admin or participant), there's a new "Share" button that opens your phone's native share menu - letting you send the poll link via WhatsApp, Telegram, iMessage, email, or any other app. On desktop browsers without native sharing, the Share button is hidden and you continue using the Copy Link button. This makes it faster to invite participants on mobile.
Decisions: 10/90 · Code: 95/5 · App size: +60 lines
Clearer Post-Voting Instructions
After voting, participants now see clearer instructions about what happens next. The "What happens next?" section explains that the poll creator will review everyone's availability and let you know when a date is decided. This reduces uncertainty about the next steps in the process.
Decisions: 20/80 · Code: 95/5 · App size: +5 lines
Cleaner Name Input After Save
After you enter your name on the participant page, the Save Name button disappears. The name input stays visible so you can edit it later - changes auto-save when you click away or press Enter. This reduces visual clutter and makes it clearer that your name was saved.
Decisions: 5/95 · Code: 100/0 · App size: +10 lines
My Polls Card Layout
Poll cards on the My Polls page now have consistent widths. The delete icon is positioned inside the card (top-right corner) rather than in a separate column. This means non-admin poll cards look the same as admin cards.
Decisions: 10/90 · Code: 95/5 · App size: +5 lines
Robots.txt and Privacy Protection
Poll URLs are now protected from search engine indexing. The robots.txt file blocks all poll-specific paths, and poll pages include a noindex meta tag. AI training bots (GPTBot, CCBot, Claude, etc.) are blocked entirely to protect user data.
Decisions: 10/90 · Code: 95/5 · App size: +50 lines
Improved Form Styling
The Save Name button on the participant page is now full-width to match the input field above it, creating better visual alignment. Buttons that follow input fields now have proper spacing for a cleaner form appearance.
Decisions: 10/90 · Code: 95/5 · App size: +10 lines
Browse Dates Before Entering Name
Participants now see the calendar immediately when opening a poll link. You can browse all available dates before entering your name. The calendar is read-only until you provide your name, then you can click dates to vote. This lets you quickly see if any dates work before committing.
Decisions: 10/90 · Code: 95/5 · App size: +40 lines
Cleaner Admin Page Share Section
The admin page now has a cleaner share section that combines the admin notice with the share link. Instead of a separate warning banner, there's now a subtle warning below the share link: "Your current URL is the admin link — don't share it unless you want others to edit this poll." This reduces clutter while keeping the important distinction clear.
Decisions: 10/90 · Code: 90/10 · App size: -10 lines (removed separate admin notice)
Participant Cards in Admin Results
Participant responses on the admin page now display in styled cards with light gray backgrounds, subtle borders, and rounded corners. This provides better visual separation between participants and matches the card styling used on the My Polls page.
Decisions: 10/90 · Code: 95/5 · App size: +30 lines
Week Numbers in Calendar
The calendar now shows ISO week numbers on the left side. A "Wk" header appears above the week column, and each row shows the week number (1-53). This helps with "week 47" style scheduling common in European business contexts.
Decisions: 10/90 · Code: 95/5 · App size: +50 lines
Date Selection Shortcuts
Admins can now quickly select all weekdays, weekends, or all days in a month with one click. Shortcut buttons appear below the calendar grid with a "Select:" label. Clicking a shortcut toggles those dates - click again to deselect. Great for setting up recurring meetings!
Decisions: 30/70 · Code: 85/15 · App size: +80 lines
Share Button for Participants
Participants can now share the poll link with others directly from the calendar page. A "Share This Poll" section appears below the calendar with a copy-to-clipboard button. Share away!
Decisions: 10/90 · Code: 95/5 · App size: +20 lines (refactored to reuse admin share code)
Clickable Logo
The greitt logo in the header now links back to the home page.
Decisions: 0/100 · Code: 100/0 · App size: +5 lines
Landing Page
The home page now shows an informative landing page instead of immediately creating a poll. You'll see a brief explanation of what greitt does and a prominent "Create Poll" button. This reduces accidental poll creation and gives new users a better first impression.
Decisions: 20/80 · Code: 85/15 · App size: +40 lines
Shorter Share URLs
Poll share links are now shorter and cleaner. Instead of long UUID-based URLs, share links now use compact nanoid identifiers (e.g., /s/b0dP92eUH1cW). The short URL redirects to the full poll page.
Decisions: 30/70 · Code: 90/10 · App size: +60 lines
Remove Participant
Admins can now remove participants from a poll. A trash icon appears next to each participant in the results section. Clicking it shows a confirmation modal before removing the participant.
Decisions: 20/80 · Code: 95/5 · App size: +50 lines
Improved Delete Confirmation
Poll deletion now uses a custom styled modal instead of the browser's default confirmation dialog. The modal provides a cleaner experience with clear Cancel/Delete buttons.
Decisions: 20/80 · Code: 90/10 · App size: +100 lines
Multiple Admin Emails
Polls can now have multiple admin email addresses. Additional admins automatically receive notification when a verified user accesses the admin page.
Decisions: 30/70 · Code: 85/15 · App size: +80 lines
Autosave Feedback
When you make changes, you now get visual confirmation:
- Calendar dates: Green outline animation and "Saved" toast when clicking dates
- Text fields: "Saved" indicator appears after editing title and other inputs
These visual cues confirm your changes were recorded without interrupting your workflow.
Decisions: 30/70 · Code: 80/20 · App size: +50 lines
Changes Page
View recent changes at /changes - this page! Markdown rendered to HTML using commonmark.
Decisions: 50/50 · Code: 90/10 · App size: +80 lines
Inactive Poll Expiration
Polls now automatically expire based on inactivity to keep the database clean:
- Polls without admin email: Expire after 30 days of inactivity
- Polls with admin email or finalized: Expire after 90 days of inactivity
Any activity (title changes, date selections, new votes) resets the clock.
Decisions: 20/80 · Code: 85/15 · App size: +200 lines
My Polls Improvements
- Dual role icons: Shows both crown (admin) and person (participant) when you have both roles on a poll
- Finalized indicator: Completed polls now show a green "Finalized" badge
- Smart redirects: Verified users are automatically redirected to their existing response instead of creating duplicates
Decisions: 30/70 · Code: 80/20 · App size: +100 lines
Participant Email Verification
- Participants can optionally verify their email to easily return and edit responses
- Verified users get their email auto-populated when joining new polls
- Same verification system used for both admin and participant features
Decisions: 25/75 · Code: 75/25 · App size: +150 lines
Abandoned Poll Cleanup
Polls that were created but never configured (no dates selected) are automatically deleted after 24 hours.
Decisions: 40/60 · Code: 90/10 · App size: +80 lines
Modern UI Design System
- Unified green theme across all components
- Complete design token system with CSS variables
- Improved card styling, buttons, and form inputs
- Updated logo to match the green theme
Decisions: 30/70 · Code: 70/30 · App size: +200 lines
Device-Based Authentication
Your device is now automatically recognized when you return to greitt. No need to enter your email every time - your polls and responses are linked to your browser. You can still verify your email to access your polls from other devices.
Decisions: 30/70 · Code: 85/15 · App size: +300 lines
Toast Notifications
Visual feedback when actions complete: a brief "Saved" message slides in and fades out after saving poll titles, names, or date selections. Helps confirm your changes without interrupting your workflow.
Decisions: 20/80 · Code: 90/10 · App size: +60 lines
June 2025
Modern Design Overhaul
Complete visual redesign with a new logo, modern styling, and cohesive color scheme. Admin and participant pages received updated layouts with improved card designs and better visual hierarchy.
Decisions: 30/70 · Code: 70/30 · App size: +400 lines
PostCSS Integration
Added runtime CSS processing using GraalJS and Webpack. CSS is now processed with PostCSS plugins for better browser compatibility and smaller file sizes. Later replaced with LightningCSS for better performance.
Decisions: 40/60 · Code: 80/20 · App size: +300 lines
Copy URL Button
Added a "Copy Link" button next to the share URL input field, making it easy to copy poll links to your clipboard with one click.
Decisions: 10/90 · Code: 95/5 · App size: +20 lines
Real-Time Title Updates
Poll titles now update in real-time using HTMX. As you type, the title is saved automatically without needing to click a button or refresh the page.
Decisions: 20/80 · Code: 85/15 · App size: +50 lines
Share Link for Participants
Participants can now see and share the poll link directly from the calendar page. A dedicated section shows the shareable URL with a copy button.
Decisions: 10/90 · Code: 90/10 · App size: +30 lines
Calendar Component Refactoring
The calendar rendering logic was restructured into separate, focused components. This improves code maintainability and makes it easier to add new calendar features.
Decisions: 50/50 · Code: 85/15 · App size: ~0 lines (refactor)
May 2025
Participant Date Selection Limit
Participants can now only select from dates that the admin has marked as available. The calendar clearly shows which dates are selectable and which are not.
Decisions: 20/80 · Code: 90/10 · App size: +40 lines
Admin Date Marking
Admins can click calendar dates to mark them as available for the poll. Selected dates are visually highlighted so you can see your selection at a glance.
Decisions: 20/80 · Code: 85/15 · App size: +60 lines
Controllable Clock for Testing
Tests now use a controllable clock, enabling reliable date-based testing without depending on the current system time.
Decisions: 40/60 · Code: 90/10 · App size: +80 lines
January 2025
Initial Release
greitt launches with core scheduling functionality:
- Create polls with selectable date ranges
- Share polls via unique URLs
- Participants vote on available dates
- Admin view shows all responses
- HTMX-powered real-time updates
- Kotlin/Ktor backend with PostgreSQL storage
- Selenium-based E2E testing
Decisions: 60/40 · Code: 60/40 · App size: ~3000 lines