Update this file at natural checkpoints: before a commit, before a PR, or when explicitly asked.
Format: ## YYYY-MM-DD — [Feature / Fix / Refactor] followed by bullet points.
- Replaced the speaker talk intake Topic text field with the shared app dropdown, using the same Frontend, Backend, DevOps, AI/ML, and related topic choices as the public CFP flow.
- Preserved already-prefilled custom topics as selectable current values so existing intake links keep showing their stored topic accurately.
- Summarized long Program abstracts in organizer talk cards by default, with an explicit toggle to review the full submitted abstract without changing stored speaker content.
- Summarized long published talk descriptions on public event and archive pages so detailed speaker submissions do not overwhelm attendee-facing pages.
- Collapsed duplicate Accept and Publish controls on Program talk cards into one primary status action with visible saving and success/error feedback.
- Reworked Organizer Access pagination so the allowlist keeps five row slots without the oversized blank min-height that caused the page scrollbar and empty space on shorter pages.
- Tightened Organizer Access vertical spacing so the five-row allowlist and pagination controls fit the intended desktop viewport more cleanly.
- Made one-time speaker talk intake links render as standalone forms without the public app navigation, breadcrumbs, feedback launcher, or organizer/community chrome.
- Removed the manual talk-entry form and on/off speaker-form toggle from Legacy Backfill so the page focuses on generated speaker archive links.
- Added a persistent Backfill Link Shelf: newly generated links remain copyable/openable from Legacy Backfill, show active/used/expired status, and can be removed by organizers.
- Disabled expiry-duration options that already have active backfill links, and blocked duplicate active links for the same duration on both the UI and API.
- Blocked CFP opening and direct public CFP submissions for past or non-monthly events, keeping CFP available only for upcoming monthly meetups.
- Paginated the Organizer Access allowlist at five rows per page with a stable page height so long access lists no longer stretch or jump the admin security page.
- Moved selected-speaker slides links into one Proposals shelf: links are still private per speaker, but organizers can generate missing links and copy/open them from one place once speakers are selected.
- Removed the public My Talks/Speaker Desk route and unauthenticated talk lookup/update surface so slide collection now runs through organizer-issued private speaker links.
- Added archive event media to the public recap payload so uploaded meetup photos appear on
/archive/:eventId, not only on/events/:slug. - Hid the empty Published Talks section for quarterly recap pages when there are no published talks, since quarterly meetups are recap/media-first.
- Added raw
shared_linkssupport for quarterly meetup recap links, gave organizers a quarterly-only Shared links editor on the event overview page, and seeded the July quarterly recap with the six links shared during the room. - Routed completed quarterly meetups to Feedback instead of Attendance and hid attendance checklist/access points from quarterly event workspaces for now.
- Replaced the monthly CFP/program checklist with a two-item quarterly meetup checklist: create the event shell, then update it with the G-Meet link from Edem.
- Removed Back to Home navigation from closed/submitted speaker one-off links so the flow ends without sending speakers into the app.
- Pinned local Google organizer sign-in to
http://localhost:5173, blocking OAuth launches from other local origins so testing ports do not bounce organizers into the deployed console.
- Split Talk Management into nested CFP, Proposals, Program, and Legacy Backfill routes under the existing Talks event tab.
- Made
/talksredirect to the CFP setup step so the permanent CFP-to-program flow is the default path. - Kept Legacy Backfill separate and explicitly temporary so last-month cleanup no longer competes with the lasting CFP workflow.
- Stabilized switching between Talk Management workflow sections and replaced the nested pills with a wide sliding segmented control.
- Refined expanded proposal details into readable abstract/bio sections with a separate metadata panel for submitted date, email, and GitHub.
- Added per-row selected-speaker slides link generation so organizers can create, copy, and open the confirmation link from the selected speaker list.
- Changed speaker-link copy feedback from a toast to a temporary inline Copied/checkmark button state.
- Split public CFP interest from confirmed talks so proposals land in a speaker-submissions inbox before organizers select or reject them.
- Added selected-speaker confirmation links that reuse the expiring one-time intake form without confusing them with archive backfill links.
- Stopped requiring public CFP submitters to already be on the approved speaker list.
- Moved CFP open/close controls into Talk Management, kept checklist CFP rows as process visibility, and collapsed the empty Talks page into one combined program empty state.
- Reworked the CFP control panel into a compact status-and-share strip with copy/open actions and grouped state controls.
- Improved the public CFP form with required field validation, red required markers, side-by-side contact/topic fields, searchable custom topics, and word-count limits for abstracts and speaker bios.
- Kept CFP URLs public and shareable after organizers close submissions, showing visitors a polished closed-state message instead of an unavailable form.
- Made the public CFP route standalone by hiding the app navigation/feedback chrome and replacing the plain submitted state with a more polished proposal receipt.
- Added a manual refresh action to the organizer CFP inbox and compressed speaker proposals into single-open list rows with slim accordion detail previews.
- Removed the redundant proposal Details button so the row itself opens the inline proposal detail.
- Changed selected-speaker links into a slides-only flow that creates the confirmed talk from the original CFP proposal, while archive-backfill links keep the full details form.
- Split generated link output so archive-backfill links stay in the archive panel and selected-speaker slides links appear in the CFP inbox context.
- Hid the primary header nav's internal scrollbar and clipped vertical overflow so organizer reloads no longer flash a black scrollbar thumb beside the mode/sign-out actions.
- Vertically centered the paused My Talks and Leaderboard content on normal-height phone screens while keeping short phone screens top-safe.
- Reworked page skeleton loaders into first-viewport previews on mobile so they show useful structure without creating fake loading-page scroll.
- Prevented organizer route skeletons from making the desktop organizer work area scroll while loading, then restored normal scrolling after content loads.
- Added a mobile-only 45-degree coming-soon ribbon to the speaker My Talks form so the paused state remains visible when the compact phone layout hides the larger masthead.
- Centered the admin sign-in card in the mobile viewport instead of pinning it near the top below the app header.
- Gated feedback QR access by event date so future events no longer expose the QR action even when their feedback window is already open.
- Removed the remaining inline success banner from Talk Management so speaker-link generation, copy, manual talk creation, and reminders all use app toasts.
- Added a phone-only organizer ops surface that shows current/next event cards, public/registration/source links, and feedback QR access when feedback is open.
- Blocked full organizer workspaces on phone-width routes while keeping organizer login/auth and feedback QR display available.
- Aligned the mobile app-shell breakpoint with the organizer phone-view breakpoint so community and organizer routes use the same compact header/menu treatment through 767px.
- Added mobile tap-action handling for pressable controls so phone interactions feel immediate without changing desktop behavior.
- Lazy-loaded Vue route components so public visitors and mobile organizers do not download every page workspace in the initial app bundle.
- Reused cached event data for organizer breadcrumbs and fell back to a single-event fetch, avoiding repeated full event-list requests while moving between event workspaces.
- Added follow-up technical-debt notes requiring the
$thumb-firstsuite for mobile/header artifact investigation, performance QA, and the structured organizer code-review/audit checklist.
- Moved the one-time speaker-link generated confirmation from the full-width inline success banner to the app toast system, keeping the generated link card focused on copy/open actions.
- Moved the speaker-link copied confirmation to the same toast system and kept the copy button label stable so the Talk Management panel does not shift after copying.
- Added
APP_DATA_SOURCEso local/dev runs default to JSON data and local password auth even when Supabase credentials exist, while the deployed Worker explicitly keeps Supabase enabled.
- Kept event attendance CSV import locked until the actual meetup has ended, so next-month events no longer become uploadable just because the previous month reached its last Saturday.
- Applied the same event-completion gate to Attendance Hub rows so future meetup months show as not open and do not expose upload actions early.
- Scoped Supabase organizer OAuth PKCE storage to the current browser tab so parallel organizer sign-in attempts cannot overwrite each other's verifier before callback.
- Removed the redundant open-state badge from Feedback Hub event rows while keeping preview and QR actions as the explicit ways to access forms.
- Routed upcoming-event
Prepareactions to the event overview instead of the paused quiz page so the Overview tab is highlighted after navigation. - Increased spacing between event-list primary actions and the destructive Remove control so organizers are less likely to misclick while reviewing events.
- Let organizers disable incomplete milestones on unpublished event checklists while keeping those rows visible and excluded from progress.
- Replaced the audit log filter selects with the shared app dropdown component, removed the actor email search field, and added a grouped-by-email view toggle.
- Kept the audit log filter bar sticky inside the organizer scroll area and paginated recent audit rows into compact pages for dense owner-only activity reviews.
- Kept the audit activity summary and table header sticky under the filter controls while reviewing long owner-only logs.
- Reduced audit-log page height with a smaller page size, compact row spacing, fixed table columns, and truncated summaries so pagination remains visible without horizontal overflow.
- Aligned Feedback Hub event-row actions beside the response metrics on wide screens so the buttons no longer drop beneath the
Attend againstat. - Removed the unused Feedback Hub reports side column so event rows get the full card width and their action buttons stay beside the metrics.
- Disabled
View responseson published event feedback rows with zero responses while leaving Configure and QR actions available where relevant. - Preserved the selected event-feedback month when drilling into an event's responses, so
Back to Feedback Hubreturns to the same period. - Reduced the attendance ledger page height with compact rows, truncated cells, and smaller pages so its pagination stays visible in the viewport.
- Moved the feedback form remove action into the Community Link controls and removed the separate rare-action card.
- Removed the duplicate Recent Responses sidebar card from the feedback form setup page because response review already lives in the main responses view.
- Restored the public home Top Regulars card by including attendance regulars in
/api/public/homeand wiring the dashboard to that payload. - Ranked attendance regulars by check-ins first, then attendance rate, registration count, recency, and name so perfect repeat attendance wins tied check-in counts.
- Removed organizer-only check-in counts and attendance percentages from the public Top Regulars card.
- Added the original Luma source link to the organizer About Page card when an event was imported from Luma.
- Matched the Audit Log skeleton loader to the current sticky filters, activity summary, fixed-column table, and pagination layout.
- Capped and compacted organizer and community skeleton loaders so loading states no longer create their own page scrollbars.
- Opened attendance CSV import for same-month events once the specific event has ended, while keeping future current-month events locked.
- Clarified the public archive system-design source action so the prompt deck or source sheet link reads as a clickable action instead of a decorative label.
- Added a data-source health endpoint so local and deployed runtimes can confirm whether Supabase-backed domains share the same project and which remaining domains still use runtime-local JSON.
- Fixed the Feedback Hub monthly response counts to use the same configured event-feedback store as the event detail page, so Supabase attendee submissions are counted in both places.
- Smoothed Feedback Hub state changes with coordinated pane, row, and count transitions so stream switches, period changes, and response-count updates feel less abrupt.
- Added an organizer manual talk form for confirmed or past talks, with optional slide links and immediate archive publishing.
- Added public speaker archive form links from Talk Management so organizers can generate month-scoped, expiring, one-time links for speakers to fill the same post-event details form.
- Made the speaker form the default backfill mode and collapsed manual entry behind a toggle, with disabled controls and a short accordion/collapse transition.
- Slowed the manual-entry collapse state and moved the speaker-link validity picker onto the shared app dropdown component.
- Kept the event-admin tab rail sticky while organizer pages scroll, including the mobile fixed-header offset.
- Kept manual talk entry aligned with speaker access by creating the speaker allowlist row when needed.
- Kept the speaker My Talks lookup and event speaker-access management surfaces visually present but disabled with the coming-soon treatment.
- Made the event checklist derive visible milestones from currently available features, hiding paused CFP, speaker-access, talk-material, quiz, and manual event-day-start work while keeping event creation, publishing, system design, completion, attendance, feedback, and archive tasks available.
- Made the
Publish archivechecklist milestone explicitly publish the event to the public site and mark it completed, so published talks from speaker-intake links appear in the public archive without relying on paused workflows. - Documented the active URL-only slide-link flow and the backfill workflow for pre-app events.
- Disabled the empty-state quiz creation button in the organizer quiz builder and marked the action with a coming-soon tag while the quiz workflow remains paused.
- Standardized coming-soon labels onto the diagonal yellow corner-ribbon treatment used by paused panels and mastheads.
- Gave paused event tabs such as Speakers and Quiz a disabled visual state instead of active or badge-style treatment.
- Made non-production auth redirects prefer the current localhost request origin over deployed public origins, so local Google sign-in callbacks stay on the dev server instead of jumping to the Pages URL.
- Documented the Supabase redirect allowlist entries needed when local development runs on a non-default port.
- Extended the organizer Program outline editor with a one-click monthly system-design scenario row.
- Added outline description and primary resource fields so organizers can save Google Slides prompt decks as structured
system_designschedule resources. - Show saved outline descriptions and resource links in the event overview before publishing them to the public meetup page.
- Kept timing ownership in the Program outline by removing the time field from the dedicated System Design artifact editor while preserving existing outline times on save.
- Added a full-width draft generator for public system-design notes so organizers can prefill readable scenario copy from the title, facilitator, and prompt link before replacing it with the actual post-event recap.
- Replaced the generic system-design draft placeholder with a server-backed Google Slides parser that reads public presentation text exports, infers a title, and generates a concrete recap draft from the actual deck content.
- Simplified the dedicated System Design editor by removing the separate prompt-label field and making public/archive scenario titles themselves open the linked prompt deck.
- Tightened shared button disabled states so in-progress actions stop showing hover/press affordances, and locked the System Design editor's sibling actions while draft generation is running.
- Added a proper saved state to the dedicated System Design page so saved scenarios show a clear stored indicator plus explicit edit and remove actions instead of leaving organizers in an always-open form.
- Kept public system-design discovery inside each meetup archive entry: public meetup system-design links now return to the parent archive page, archive search stays event-based, and archive meetup pages show the recap copy plus prompt-deck links inline.
- Synced the dedicated System Design editor back into existing outline slots, so when an event already has a
System Design sessionrow the scenario title, recap, facilitator, and prompt-deck link now attach to that row instead of creating a duplicateTBDsystem-design entry. - Sent past-meetup
View recapCTAs directly to the monthly archive entry and removed the duplicate standalone system-design recap block from the public meetup page so recap content now lives in one place. - Normalized stale event lifecycle statuses from event dates on server reads, so published meetups that already ended now show up in archive/dashboard flows as
completedeven if an organizer left the stored row onliveor another earlier phase. - Gated non-public API routes behind organizer authentication so only
/api/public/meetups*remains open for unauthenticated website consumption, with auth routes left available for sign-in. - Added narrow public home and archive APIs, moved the public dashboard/archive pages off
/api/overview, and reduced public feedback form responses to attendee-safe event, campaign, and talk labels.
- Archived the old
Elvis020/devCon-commGitHub repository now thatdevcongress/events-managementis the active home. - Confirmed Cloudflare Pages production deployments are still coming from
main, with the latest listed source commit present in the new repository, while documenting the historicaldevcon-commPages project name. - Updated the contributor setup path from the old local folder name to
events-managementand re-ran the deployed public meetup API verifier against the final Pages URL.
- Switched this checkout's
originremote and branch tracking todevcongress/events-managementnow that the new repo is the active home. - Re-ran the public meetup API contract verifier against
https://events-management.pages.devand confirmed the deployed Cloudflare app passes. - Cleared the remaining Turnstile migration blocker after verifying both the floating feedback bot and the standalone
/feedbackroute can submit on the final Pages hostname.
- Updated repository configuration and docs to point at the new DevCongress Cloudflare Pages and Worker deployment URLs.
- Renamed the Wrangler Worker target from
devcongress-comm-apitoevents-managementand updated the Pages API proxy origin. - Marked the completed GitHub, Pages, Worker URL, Worker secrets, Supabase Auth, Google OAuth, health-check, auth-mode, Turnstile hostname, and README-link migration tasks in the repository migration checklist.
- Recorded the remaining Turnstile feedback-form blocker: the live
/feedbackwidget returns client error110200for the compiled site key on the new Pages hostname. - Renamed the package metadata to
events-managementand restored the public meetup API's cache/CORS headers so the website integration verifier can pass after redeploy. - Collapsed both the floating feedback bot and the standalone
/feedbackroute into a high-contrast receipt-only state after a browser sends feedback or enters the cooldown window.
- Added a central checklist for moving active development from
Elvis020/devCon-commtodevcongress/events-management, covering GitHub, Cloudflare, Supabase Auth, Google OAuth, Turnstile, docs, and final smoke checks. - Linked the checklist from the documentation map for integrators and maintainers.
- Shortened the root README into a contributor-friendly entry point that links into the centralized
docs/folder instead of duplicating detailed product, setup, and feature guidance. - Kept quick-start commands, key capabilities, documentation tables, technology stack, contribution guidance, security, and license information in the root file.
- Released the mobile app shell from the desktop inner-scroll layout on every route, including organizer/admin pages, so Android Chrome can scroll the document normally.
- Added a coarse-touch fallback so Pixel/Android devices still get document scrolling even when Chrome reports a viewport wider than the small-screen breakpoint.
- Kept the desktop fixed-shell behavior intact while adding a minimum-height guard to the main scroll container.
- Added
System designas a first-class program outline item type so monthly architecture scenarios can sit alongside talks, panels, workshops, and discussion slots. - Added an organizer System Design tab for each full event workflow, letting organizers maintain the monthly scenario title, facilitator, public recap notes, and prompt link over time.
- Exposed system design rows on public meetup and archive pages so people who missed the in-person event can still read what was discussed and open the original scenario prompt.
- Added a checklist milestone for preparing the monthly system design scenario, with existing checklists backfilled when they are loaded.
- Added an optional Program outline editor to the organizer event overview so events can store structured time/title/type/lead rows when a run of show exists, while leaving events with no outline unchanged.
- Saved outlines into the existing
event.schedulefield so public meetup schedules and feedback activity drafts can reuse the same structured event flow. - Added a paste parser for plain text program outlines, including
PROGRAM OUTLINEheadings, final time ranges,by Speaker, and- Speakerlead formats. - Updated fresh event feedback campaigns to generate and persist per-activity questions from the saved program outline instead of leaving organizers on the generic default campaign.
- Moved event feedback campaign, question, and submission persistence onto Supabase in deployed environments so Luma-imported Supabase events can create feedback forms without hitting the JSON mock store.
- Updated the Cloudflare Pages worker so stale
/assets/*.jsrequests no longer receiveindex.htmlastext/html, preventing strict module MIME failures after a deploy or during organizer sign-in redirects. - Refreshed the shared admin-session query immediately after local or Google organizer sign-in completes, preventing stale unauthenticated cache state from sending admins back through sign-in a second time.
- Added hover and keyboard-focus detail popovers to the organizer event lifecycle legend so each status explains the stage purpose, expected organizer move, and next action without expanding the page chrome.
- Added an explicit event
series_type(monthly,quarterly, orspecial) across the organizer flow so event behavior no longer depends on whether the wordquarterlyappears in the title. - Updated the Luma import review step to ask organizers which series the event belongs to before import, and threaded that choice into both organizer-side import and public preview payloads.
- Added a simple series-type editor on the organizer event overview page so an imported event can be corrected later without renaming it.
- Replaced the old title-based monthly/quarterly checks in organizer tabs and attendance logic with the new shared field, while keeping a safe fallback for older rows until the Supabase migration is applied.
- Added an organizer feedback QR display page plus a
Show QRaction on live event-feedback rows, so organizers can open a TV-safe screen that attendees can scan directly into the published feedback form.
- Reworked the organizer Feedback Hub around two clear categories: website feedback from the floating widget, and event feedback from monthly, quarterly, or one-off event forms.
- Replaced the heavy yellow route-feedback block with quieter paper-toned panels, restrained metrics, and simpler empty/loading states that match the existing DevCongress palette without dominating the page.
- Made the two feedback category cards the primary entry points, hiding detailed website and event feedback sections until an organizer explicitly opens one.
- Disabled automatic website-feedback inbox fetching on the Feedback Hub; organizers now load or refresh that inbox manually.
- Loosened the event report header layout so the explanatory copy and period/configuration controls no longer crowd each other.
- Removed the redundant selected-month banner from event feedback reports so the event rows start immediately after the period summary.
- Simplified the event report body by showing only active event periods, labeling period buttons by event count instead of response count, and removing aggregate month metrics from the hub so per-event rows carry the work.
- Smoothed event-period switching with a keyed fade/slide transition while letting the report container resize to the selected month.
- Changed the desktop event-period picker to six columns so a complete year stays within two rows.
- Removed the redundant report-level configure action because each event row already links to its own feedback configuration.
- Defaulted event reports to the current month when it exists, and redesigned each event row into a calmer summary with inline status, a compact response stat strip, and cleaner right-aligned actions.
- Trimmed event rows again so the left column stays lighter, the stats own a full desktop strip, and the action sits in a dedicated far-right slot instead of compressing the summary.
- Split event feedback row status tags into their own left-aligned column and muted zero-response counts for draft or unconfigured forms that have not been published.
- Generated event-aware draft questions for the June 2026 feedback campaign, using optional per-session 1-5 ratings for the Fido talks, discussions, and demos instead of the generic default copy.
- Added a final-activity workspace to the event feedback configure screen so organizers can remove skipped sessions, add last-minute activities, generate per-activity rating questions, and preview the draft form before saving.
- Added a standard
Other commentstext question as the final prompt on event feedback forms, with a conservative comment-length cap to stay inside the current Supabase submission limit. - Reworked public event-feedback question cards so prompts sit fully inside each card as readable sans titles with a two-line cap, giving long talk, demo, and session labels a consistent layout without relying on border text treatment.
- Changed published event-feedback rows to send organizers straight into a dedicated responses workspace, removing the old configure/preview actions once a form is live and replacing the cramped sidebar summary with full submission cards.
- Removed the navbar prefetch path and kept route changes immediate, letting pages swap on-screen first and then show their own skeleton loaders while data resolves.
- Reworked organizer route protection to reuse the cached admin session for in-console navigation, then refresh
/api/auth/sessionin the background so organizer nav no longer waits on that request before switching pages. - Moved the public Events page onto the shared TanStack Query cache so later revisits can reuse the same meetup payload instead of always waiting for a fresh mount-time fetch.
- Added a dedicated audit-log skeleton so every top-level organizer destination now has an on-route loading state instead of a text-only wait message.
- Added a clearer organizer remove flow for event rows, including imported-event labeling plus confirmation copy that makes it obvious an imported Luma event can be removed and re-imported if it came in wrong.
- Fixed organizer event list pagination after a removal so deleting the last row on a page snaps back to a valid page instead of leaving the list on an empty page.
- Made organizer event rows themselves the primary next-step navigation target, so hovering anywhere on a row signals clickability and clicking or pressing Enter/Space opens the event's next organizer page without needing the far-right action text.
- Limited quarterly meetup event tabs to Overview and Feedback so the organizer surface matches the lighter quarterly workflow instead of showing monthly-only sections.
- Reworked Luma import preview so organizers can open the real public meetup page shell before import, while the preview page clearly explains that schedule, speakers, gallery, and recap details can be added later.
- Added an organizer-side About editor on the event overview page so organizers can update the public meetup description copy in place without leaving the control screen.
- Removed the back-link affordance from Luma preview mode so the public preview opens as a clean standalone page in its own tab, without import-flow navigation copy.
- Locked the top Luma URL field and
Preview eventaction once a preview is available, so the import flow stays focused onPreview event page,Import event, orClear. - Changed Luma import so it creates an organizer-only draft instead of publishing immediately, and added an explicit publish action on the draft event overview that pushes the event into the public community meetup list.
- Updated the shared confirmation dialog so event deletion can show
Removing...instead of the genericWorking...while the request is in flight. - Added lightweight cross-tab refresh for the public Events list so community tabs refetch after organizer-side publish and About-copy updates, without needing a manual sync button.
- Moved the public meetup detail page onto TanStack Query as well, added same-tab refresh signaling for organizer-side publish and About-copy edits, and disabled browser caching on public meetup API reads so description and publish changes appear immediately instead of hanging on stale responses.
- Made imported-event removal final for Luma matches by deleting every Supabase row tied to the same external id or registration URL, and changed Luma import to refuse silent reuse of published matches in favor of an explicit
Remove and re-importorganizer path that creates a fresh draft. - Simplified the organizer event lifecycle guide into a compact status legend so the event list gets priority and the page no longer spends a full panel explaining the workflow.
- Added compact month and event-type filters to the organizer event table, covering monthly, quarterly, and special events while keeping pagination counts in sync with the filtered rows.
- Refined the shared dropdown treatment with a compact density for table filters, softer menus, lighter trigger borders, and quieter scrollbars.
- Replaced hosted organizer magic-link sign-in with Supabase Google OAuth while keeping the existing app-owned
admin_sessionscookie model andadmin_membershipsallowlist. - Changed the organizer login screen to launch Google directly and disabled the hosted
/api/auth/admin/loginmagic-link path, while preserving the local shared-password fallback for non-Supabase environments. - Moved the hosted organizer callback completion fully onto
/api/auth/admin/callback, and repurposed the old frontend callback route as a safe recovery page for stale magic-link returns. - Fixed the PKCE callback handoff so the browser keeps the Supabase code verifier across the Google redirect, exchanges the code, then clears the browser Supabase session after the app-owned cookie is created.
- Fixed split-origin Cloudflare callbacks so the API Worker forwards browser-facing OAuth returns to the Pages frontend origin from
PUBLIC_APP_URLinstead of its own Worker origin. - Reused the organizer session fetched by the route guard so owner-only nav items render immediately for owners, and redirected non-owners away from owner-only organizer routes.
- Relaxed organizer access management so organizers can add or disable other organizers, while owner creation, owner updates, owner disablement, and audit log access remain owner-only.
- Softened the shared skeleton system with quieter paper-tone fills, lower-contrast surfaces, and a slower pulse so loading states feel calm across both light and dark views.
- Changed the shared toast layer to reuse a single app-status toast by default, so follow-up success and error messages replace the current toast instead of stacking multiple alerts.
- Added a router recovery path for OAuth codes that land on the public Site URL and tightened organizer route guards so protected pages re-check the app session instead of trusting prior organizer navigation.
- Updated the auth and deployment docs with Google provider setup requirements, and removed the obsolete email-link flow references.
- Added Cloudflare Worker public origin bindings to
wrangler.tomlso deploys preserve the Pages callback origin used by Supabase organizer magic links. - Added targeted Worker logging and machine-readable response codes for Supabase OTP send failures so hosted organizer sign-in errors expose the upstream status, code, and redirect origin in Cloudflare logs without leaking secrets.
- Mapped Supabase email-send rate limits to a clearer organizer sign-in message with
429andRetry-Afterinstead of the generic send-link failure. - Clarified Worker Supabase auth environment docs, including the required anon key and the split between secret keys and public origin bindings.
- Added an organizer event removal flow with a simple reusable confirmation dialog and server-side audit logging for successful deletions.
- Split public Luma event imports into preview and explicit import steps, so organizers can inspect the scraped event shell before it is added.
- Differentiated monthly and quarterly events in the organizer event list while showing the real imported event name instead of a generic meetup label.
- Added a soft anonymous one-response guard for public event feedback forms using per-event browser tokens and server-side token hashes.
- Documented the new Luma preview route and clarified that event APIs can now remove events as an admin mutation.
- Updated public meetup CTAs so upcoming meetups use
Register, past meetups useView recap, and action buttons now carry a clearer right-arrow affordance. - Made the public meetup list CTA destinations match their labels, so registration buttons open the registration URL directly when one exists instead of always routing through the detail page.
- Reworked the meetup detail hero content treatment with a taller cover, bottom-left layout, outlined status pill, app-consistent typography, and clearer metadata contrast.
- Added owner-only audit log review at
/organizer-console/audit-log, backed by Supabaseadmin_audit_logwith request context columns and filters for actor, action, and target type. - Extended server-side audit logging across organizer mutations including logout, Luma imports, event/checklist/media changes, feedback management, attendance CSV import/removal, speaker access, talk review/reminders, and quiz builder changes.
- Reworked shared skeleton loaders to use neutral grayscale surfaces instead of yellow-accented placeholders.
- Replaced the sweeping shimmer with a softer pulse animation and disabled that pulse for reduced-motion users.
- Moved the meetup detail loading state onto the shared skeleton system so it matches the rest of the app.
- Replaced hosted admin sign-in with Supabase email OTP, a token exchange endpoint, and an app-owned HTTP-only admin session cookie, while preserving the shared
ADMIN_PASSWORDfallback for local development without Supabase auth. - Added Supabase
admin_memberships,admin_sessions, andadmin_audit_logtables for organizer email allowlisting, opaque session validation, and security-sensitive action logs. - Added owner-only organizer email management at
/organizer-console/organizers, including role assignment and disable access actions. - Locked the organizer sign-in email field during link-send cooldowns and kept the submitted address visible so valid sign-in attempts cannot be edited mid-countdown.
- Moved hosted organizer magic-link returns onto a dedicated
/organizer-console/auth/callbackroute so sign-in completes before the login form can flash its resend countdown state. - Added cover-image file picking to the organizer create-event form, reusing the shared browser compression flow before the uploaded image is written to Supabase Storage.
- Added shared Zod validation for organizer event creation, disabled the create action until required fields are valid, and marked required fields with red asterisks in the form UI.
- Split public meetup viewing from the archive by adding a dedicated
/events/:slugmeetup detail route, so event cards now open the website-style meetup context while archive pages stay focused on published talks and slide links. - Reworked meetup detail photo sections from a flat grid into the homepage-style stacked print treatment, including rotating front-photo shuffles and a separate gallery action rail.
- Simplified the organizer access management screen with lighter form chrome, quieter access rows, and plain text role/status treatment.
- Replaced the organizer role picker native select with the app-native dropdown component so the menu styling stays inside the DevCongress UI system.
- Replaced the old shared page loader with route-specific skeleton components across public and organizer pages, plus a dedicated feedback inbox section skeleton where that page has nested loading states.
- Reworked the organizer route-feedback inbox into grouped New, Reviewing, and Resolved sections with quieter shared row styling, compact metadata, expandable long notes, one status dropdown per item, auto-refresh plus focus-refresh behavior with a visible manual refresh control, and a soft-archive
Clear resolvedaction that removes closed items from the active inbox without deleting them. - Fixed shared dropdown closing so archive Topic and Speaker filters cannot remain open together, and tightened the archive filter menu widths/alignment.
- Refactored the attendance overview from event rows into true month buckets, so each month appears once, empty months remain visible, and same-month events render inside that month instead of duplicating the month label.
- Tightened the attendance overview into a narrower monthly ledger with a slimmer vertical stack of visual planning cards for peak month, expected turnout, room-capacity buffer, and CSV coverage.
- Hardened organizer magic-link requests with generic success responses that no longer reveal allowlist membership, added IP/email rate limiting and resend cooldowns, and deduped login toasts so repeated attempts do not stack noisy errors.
- Disabled the Organizer Access add-email action until the email field passes Zod email validation, and mirrored the same validation on the admin organizer API.
- Added DevCongress-branded Supabase confirmation and magic-link email templates with logo, app copy, and production-safe
{{ .ConfirmationURL }}links. - Reworked the organizer create-event schedule fields into a compact two-column row and replaced the native browser date inputs with a shared app-themed calendar picker.
- Added free-tier Luma event import for organizers: public Luma event URLs can be pasted from the create-event page, imported into Supabase-backed
community_events, marked with source metadata, and deduplicated by Luma event id without requiring Luma Plus or an API key. - Split the organizer create-event screen into an active Luma URL import path and a disabled manual Event Form preview with a coming-soon badge.
- Compressed the disabled manual Event Form preview so the create-event page fits in a desktop viewport, with the coming-soon ribbon rotated across the top-left corner.
- Added a compatibility fallback so public Luma URL import still works before the
external_*metadata migration is applied, using the registration URL to detect existing imports. - Aligned meetup schedule type tags into a dedicated column and changed them from pill chips to small-radius labels so rows line up consistently without the capsule look.
- Moved the meetup detail
All meetupsback link below the hero and simplified the about section CTA to match the selected-event structure ondevcongress.org. - Replaced the feedback campaign inline saved banner with the shared app toast so successful saves do not push the form layout down.
- Documented the admin auth flow, first-owner bootstrap SQL, local fallback, role model, and deployment security notes in
docs/auth.md.
- Disabled route-feedback submission until the form has a name, an explicitly selected feedback type, a sufficiently detailed note, and a resolved Turnstile token.
- Moved public route-feedback validation into a shared Zod schema so the floating feedback bot and standalone
/feedbackroute enforce the same requirements and reset state consistently. - Raised the organizer sign-in password input back to the iOS-safe 16px mobile text size so Safari no longer zooms the admin login form on focus.
- Added
@tanstack/vue-querywith a shared query client so client-side API reads can reuse cached results instead of each view re-fetching in isolation. - Centralized common
/api/overview,/api/feedback/monthly, and/api/feedback/inboxfetchers plus shared response typing insrc/lib/api.ts. - Moved the Home and Archive routes onto the shared overview query so those screens can reuse the same cached event/talk payload and avoid duplicate loading logic.
- Moved the organizer Feedback Hub route feedback inbox onto TanStack Query with optimistic status updates and cache invalidation instead of a manual re-fetch loop.
- Replaced the app-shell route-feedback badge sync event with the shared feedback inbox query so the Feedback Hub badge and inbox stay aligned through one cache entry.
- Added optional Cloudflare Turnstile support for the feedback bot and
/feedback, including server-side Siteverify enforcement when the Worker secret is configured. - Invalidated shared event and overview queries after organizer event creation plus event-level checklist/media updates so newly created or updated meetups appear immediately instead of waiting for cache expiry.
- Kept the floating feedback bot visible after a successful submission with a "Feedback received" thank-you bubble and happy face state, plus browser-side cooldown and daily caps to discourage repeat spam from the same device.
- Added a server-side route-feedback rate limiter keyed to client network/user-agent context, returning
429plus retry timing for repeat submissions that bypass the browser cooldown. - Added an app-wide mobile keyboard dismiss control for focused inputs, textareas, and selects so iOS users can intentionally blur fields without relying on Safari's form accessory behavior.
- Refined mobile keyboard dismissal with tap-outside blur behavior and a smaller 44px edge fallback button so the control no longer blocks active form content.
- Compactly redesigned the mobile archive event detail page, including the detail card, description copy, presentation count, and empty state.
- Restored the floating public feedback bot now that mobile community pages use document scrolling.
- Tightened public mobile typography, cards, header controls, and My Talks placement so phone routes feel less oversized and the speaker email form starts in the first viewport.
- Moved mobile community pages back to normal document scrolling instead of the nested app
<main>scroller so real phone browsers own visual-viewport and address-bar scroll behavior. - Locked the app shell to the visual viewport so document/body overscroll no longer creates phantom vertical scrolling after route content ends.
- Tightened the route-stack height contract so short mobile pages fill the app scroll area instead of leaving blank space below their content.
- Replaced the desktop-style mobile nav strip with a compact hamburger header and full-screen mobile menu while preserving accessible 44px+ navigation targets.
- Tightened the full-screen mobile menu with denser navigation rows and a bottom feedback/footer area so the panel no longer ends with unused empty space.
- Compactly fitted the mobile My Talks and empty Leaderboard routes within common small-device heights, with My Talks centered on roomy phones and kept top-safe on short screens.
- Made the mobile route-feedback page center after launcher taps on roomy phones while falling back to top-safe placement when the form is taller than the viewport.
- Simplified the mobile 404 route into a centered recovery card without the desktop suggestion stack, keeping unknown routes non-scrollable on common phone sizes.
- Hard-paused the public leaderboard for phase one so seeded prototype rows and account tools cannot appear from hosted environment drift.
- Reset the internal app scroll container on route changes so feedback opens at the form instead of inheriting scroll position from a previous long page.
- Reduced feedback launcher prominence with route-view interval gating and mobile routing to a standalone
/feedbackpage instead of an overlay. - Added the
/feedbackroute to documentation and noted the mobile feedback behavior for community testers. - Made the header sticky at the top on mobile viewports only, leaving larger layouts non-sticky.
- Hardened organizer sign-in so failed JSON checks no longer leave the button stuck, compacted the mobile sign-in card typography and password field, and kept the mobile topbar fixed/reachable across routes.
- Gated attendance CSV uploads by meetup cycle: current-month uploads stay locked, next-month uploads open from this month’s last Saturday, and locked months show why in the Attendance Hub and event readout.
- Clarified that removing an attendance CSV drops that meetup from aggregate attendance statistics until a replacement is uploaded.
- Replaced the Attendance Hub's locked-month text treatment with a disabled row/action state and compact padlock icon.
- Added a GitHub Actions CI workflow that runs typecheck, tests, and production build on pushes to
mainand pull requests. - Split the README badge block into clearer groups and added the real CI workflow badge plus Cloudflare Pages and Worker deployment badges.
- Added a Cloudflare Worker entrypoint for the Hono API with Wrangler config and a
pnpm deploy:workerscript. - Added
VITE_API_BASE_URLsupport so the Cloudflare Pages frontend can call a separate Worker API origin before same-domain/api/*routing exists. - Added a Cloudflare Pages
_worker.js/api/*proxy and made same-origin API calls the default again so mobile organizer auth can use first-party cookies. - Added credentialed API CORS support for split Pages/Worker origins, controlled by
PUBLIC_FRONTEND_ORIGIN. - Deferred hosted PDF-to-quiz generation behind
ENABLE_PDF_QUIZ_UPLOADSand removed the PDF parser from the Worker top-level import path so Cloudflare can validate the API bundle. - Documented the split Cloudflare Pages + Worker deploy steps and clarified that server-only secrets belong on the Worker, not in the Pages frontend environment.
- Added a concise open-source README that explains the product, quick start, documentation map, project status, stack, contribution path, security posture, and license without overcrowding the landing page.
- Added root contribution, security, code-of-conduct, and MIT license files for public collaboration readiness.
- Added structured contributor docs under user guides, technical docs, reference docs, and feature docs so community members, organizers, integrators, and maintainers can enter at the right level of detail.
- Added a technical debt register and linked it from the README and documentation map so open-source contributors can see production-readiness risks without crowding the README.
- Added
VITE_SHOW_ORGANIZER_LINKso public deployments can hide the Organizer header button without changing route or auth behavior. - Hardened JSON mock persistence so missing files still behave as empty collections, invalid/non-array JSON fails loudly, and writes replace files through temp-file rename.
- Moved quiz phase advancement out of
GET /api/quiz/stateinto explicitPOST /api/quiz/state/advance, with shared quiz-state helpers and focused tests. - Added focused tests for mock DB persistence, Luma attendance parsing/summarization, and quiz state advancement/read behavior.
- Added standard 16px and 32px favicon assets so browser tabs can render the DevCongress icon instead of falling back to the default icon.
- Updated the static and production HTML titles to
DevCongress | Community. - Added route-aware document titles so organizer-console routes show
DevCongress | Organizers.
- Removed the event, talk, and year count cards from the public archive masthead.
- Removed the masthead count cards from the public leaderboard and My Talks pages for the same cleaner header treatment.
- Constrained the leaderboard mode-switch underline to the same width as the leaderboard table.
- Replaced the separate leaderboard coming-soon banner with a small angled masthead ribbon.
- Matched the homepage Top Members preview to the same angled coming-soon ribbon treatment.
- Removed the homepage Players coming-soon summary card and moved the Top Members preview higher.
- Removed Praise from the route feedback kind picker, replaced tester-name selection with a typed name plus Anonymous checkbox, and improved route-path contrast.
- Added capped auto-growth, internal textarea overflow, and a character counter to the route feedback textarea so longer notes are easier to write without scrolling the whole feedback panel.
- Hid the feedback launcher while the feedback panel is open so its bubble cannot overlap the submit button.
- Added a Supabase-backed App Feedback Inbox to the organizer Feedback Hub, including route-feedback tagging and admin-only status updates.
- Removed the count tiles from the public Events masthead so the page opens with a simpler archive-style header.
- Added a Supabase
community_eventsmigration modeled from the currentdevcongress.orgAstro meetup schema and seeded it with the existing website meetup YAML content. - Added a Supabase community-event repository so
/api/eventscan read/write Supabase events when configured while preserving JSON fallback during local development. - Updated
/api/public/meetups*to prefer Supabase-published community events before falling back to the local JSON event stream. - Updated fallback public meetup mapping so event photo links flow through as website-compatible
photos[]instead of substituting the cover image. - Added
/api/health/supabase/community-eventsas a focused readiness check for the new event-source table. - Extended organizer event creation with website-facing fields and a publish toggle so new rows can be tested through the public meetup endpoint.
- Added organizer event media management for direct photo links and shared gallery/folder links.
- Added Supabase Storage support for organizer-uploaded event covers and selected event photos through a public
meetup-mediabucket. - Added browser-side image compression before Supabase Storage uploads, targeting 1600px/WebP/2MB while keeping the server-side 5MB validation cap.
- Added
/api/health/supabase/storagefor checking the media bucket before testing uploads. - Documented the Supabase event-source contract and recorded the decision to make this app the meetup data owner before the Astro website repo consumes it.
- Marked quiz and leaderboard as phase-one coming-soon features while preserving their route/UI paths for later rollout.
- Kept the homepage leaderboard preview visible but de-emphasized it with coming-soon treatment.
- Kept attendance CSV imports active and added a 2MB file-size policy for Luma exports.
- Reframed speaker slide handling as link-only so the app stores public slide URLs instead of files.
- Revised the hosting recommendation around the reduced phase-one scope: Cloudflare Pages/Worker plus Supabase as target, Render plus Supabase as a temporary bridge, and Durable Objects reserved for future quiz work.
- Added a deployment runbook for the proposed Cloudflare Pages/Workers, Durable Objects, and Supabase production shape.
- Documented the current app blockers before Cloudflare deployment: JSON persistence, Bun-specific serving, local filesystem assumptions, and in-request PDF processing.
- Captured a starter cost posture showing that early testing can begin on free tiers, while public launch should budget for Cloudflare Workers Paid and Supabase Pro.
- Added a free-first deployment posture for a non-funded community group, including upload caps, delayed quiz realtime, and a Firebase cost/fit comparison.
- Added a reusable
ViewSkeletonloader system with page-shaped variants for dashboards, tables, cards, forms, ledgers, event overview, quiz builder, and quiz entry states. - Replaced full-page
LOADING...placeholders across active public and organizer Vue views with layout-preserving skeletons that respect reduced-motion preferences. - Added contextual breadcrumbs under the app shell navigation for public and organizer routes, including event-level organizer pages, so deep pages have a clear way back without relying only on the top navbar.
- Added restrained breadcrumb hover, press, and current-route motion that respects reduced-motion preferences.
- Added directional organizer event subsection transitions and a gliding active tab indicator so Overview, Talks, Speakers, Attendance, Quiz, and Feedback behave like one continuous tabbed workspace.
- Reworked the organizer event overview into a compact dashboard layout so the overview subsection fits the desktop viewport without requiring page scroll at the target wide layout.
- Refined the organizer event overview workstream UI into a compact operations list with calmer sans-serif numeric stats.
- Added a compact event lifecycle key to the organizer event list with plain-language speaker-submission and program-set stages instead of unexplained CFP/upcoming labels.
- Reworked pagination footers into a shared compact control pattern so page counts read as status text instead of a third button.
- Added a monthly attendance ledger at
[adminBase]/attendancewith import coverage, month-by-month metrics, best-month readouts, and venue-planning guidance. - Added an organizer-only attendance page at
[adminBase]/events/[eventId]/attendancefor post-event Luma attendance readouts. - Added a Vue Sonner toast foundation with a globally mounted DevCongress-themed toaster and typed
notifyhelper for future view-level usage. - Added a single-action CSV import control with real file-read and upload progress states for replacing an event's Luma guest export.
- Added a remove-file action for clearing a stored Luma attendance import from an event.
- Added JSON-backed Luma CSV import storage and summary metrics for approved registrations, check-ins, approved no-shows, check-in rate, source breakdowns, and ticket breakdowns.
- Added admin-only Hono routes for monthly attendance insights plus fetching, importing, and removing per-event Luma attendance data.
- Kept the top organizer nav focused on global sections, and moved event-specific navigation back into nested event tabs with Attendance and Feedback included.
- Preserved Attendance Hub and Feedback Hub return context when organizers open event subpages from monthly hub actions, breadcrumbs, tabs, and nested event links.
- Added Attendance to organizer event overview action rows.
- Polished the event overview operations area with consistent ops panels, aligned card tops, fixed metric/action columns, and tighter typography hierarchy.
- Moved app toasts to the bottom-right corner.
- Fixed event sub-section route changes so the event tab strip stays mounted and routed content transitions in a stacked slot instead of collapsing through a loading placeholder.
- Reworked the attendance hub ledger around the selected year, month filters, status filters, and paginated full-width rows so monthly CSV actions stay visible.
- Simplified attendance hub month rows so CSV state, action, and attendance summary read as one compact decision instead of repeated metric cards.
- Added an organizer event checklist with chronological milestones, shared JSON persistence, progress state, and milestone-driven event status updates.
- Reframed the event status dropdown as a manual correction control while the checklist becomes the primary coordination surface for monthly event work.
- Added event-scoped feedback campaigns with default post-event questions, local JSON persistence, and Supabase migration support.
- Added organizer feedback management at
[adminBase]/events/[eventId]/feedbackwith campaign status, auto-open behavior, question editing, public link copy, and recent response review. - Added a rare organizer remove action for event feedback forms, backed by
DELETE /api/events/:eventId/feedback-campaign, so organizers can reset a form while keeping existing responses available for reports. - Added public community feedback forms at
/feedback/[eventId]that render campaign questions and submit structured event answers. - Added Hono routes for feedback campaign management, public campaign lookup, and event feedback submission.
- Added feedback to the event overview and organizer event navigation.
- Time-boxed event feedback so forms auto-open from the event date and close after 3 days by default.
- Added a community archive CTA that appears only while feedback is open, and kept manual
activecampaigns open for testing regardless of the auto window. - Polished the feedback form UI by replacing native selects with the app dropdown and adding trigger-origin dropdown motion plus question-card enter/hover motion.
- Added restrained info/success design tokens and applied them to secondary status surfaces, archive stats, feedback state chips, and form focus rings.
- Added lighter operational panel/table primitives and applied them to dense organizer event, talk, speaker, and attendance surfaces.
- Reworked the organizer quiz builder and live-host screens with stronger control grouping, option labels, stage contrast, and a dedicated finished-session view.
- Added an organizer Feedback Hub with month-by-month switching, combined monthly response metrics, and event-level form status links.
- Recorded the decision to align public app surfaces with the
devcongress.orglight theme instead of keeping the dark companion theme. - Added the initial website palette notes to the design-token usage guidance.
- Added read-only
/api/public/meetups*endpoints for the.orgwebsite integration contract. - Added
pnpm verify:public-apito validate the read-only meetup API before touching thedevcongress.orgAstro integration. - Added
docs/public-meetups-api.mdas the local contract note for future website consumption. - Tightened the public meetup DTO against the current
devcongress.orgAstro meetup schema: offset datetimes,location.url, full CTA/archive URLs, non-null speaker images, and draft-event exclusion. - Added a public
/eventspage that lists all website-publishable meetups from/api/public/meetups. - Aligned the public
/eventspage with thedevcongress.orgAll Meetups layout: listing header, two-column cards, cover images, status badges, photo counts, date/location meta, and meetup CTAs. - Synced organizer pages to the
.orglight theme across event management, event overview, talks, speakers, quiz builder/live host, login, tabs, and shared number steppers. - Switched the active design tokens, app shell, feedback UI, and landing page foundation to the
.orglight palette. - Updated public dynamic routes so archive detail, CFP, and quiz-code pages use the
.orglight palette instead of legacy dark accents. - Added Inter font assets for the light-theme UI pass.
- Added a shared archive-style community masthead and applied it to Events, Leaderboard, My Talks, and Play while leaving Home distinct.
- Added Supabase JS client configuration with browser anon and server service-role helpers.
- Loaded
.env.localinto the Hono dev server so server routes can access Supabase secrets locally. - Added environment placeholders for Supabase URL, anon key, and server-only service role key.
- Added a Supabase migration for name-selected tester feedback without Supabase sessions or user auth.
- Added
/api/health/supabaseto verify server-side Supabase connectivity. - Added a public feedback bot that loads tester names from Supabase and submits route-aware feedback without tester sessions.
- Added a simple masthead switch for testing between the public community experience and the organizer console.
- Reworked the event overview operations area into a calmer program pulse and compact next-action rail.
- Reduced the stretched metric-card feel so counts, status, and actions scan together on wide screens.
- Replaced remaining native Vue dropdowns with the shared app-themed dropdown component across archive filters, event status, and quiz answer selection.
- Added an app-themed number stepper and replaced native quiz builder number inputs.
- Softened generated quiz question cards with calmer typography, lighter answer rows, and quieter edit/delete controls.
- Fixed admin shell nav highlighting so only the deepest matching event section is marked active.
- Removed redundant event back links from admin event child pages now covered by shell navigation.
- Replaced the dominant event lifecycle panel with a compact header status selector.
- Added a calmer organizer overview for talk pipeline, speaker access, quiz state, and event-specific next actions.
- Changed shared editorial pages to fill the available app shell height instead of forcing full viewport height inside the header-offset scroll area.
- Removed the phantom vertical scrollbar on admin pages when content fits the visible area.
- Added contextual admin shell navigation so event routes and the event list expose Overview, Talks, Speakers, Quiz, and Live links for the current/default event.
- Removed duplicate in-page admin event tabs now that event operations live in the admin shell navigation.
- Hid the admin Live nav item unless the selected/default event has a waiting or active quiz session.
- Updated the app header to show the public
Playnavigation item only when/api/quiz/activereports a waiting or active quiz session. - Added periodic quiz availability refresh so the
Playlink can appear during a meetup without reloading the page. - Removed the redundant "Back to events" link from the admin event detail page because Events is already reachable from the admin navbar.
- Added
@usenavii/coreand a VueNaviiAvatarcomponent so leaderboard avatars render locally as deterministic data URI images. - Seeded avatars from stable leaderboard identifiers (
user_id,device_id, then nickname/rank fallback) instead of using display names alone. - Added static 48px mascot avatars to leaderboard rows without enabling repeated avatar animation.
- Switched the app motion standard to
$ui-animationsand added shared spring, smooth, and fast motion tokens. - Replaced active Vue
transition-allusage with transform/opacity-only motion utilities for press, surface, icon, page, spinner, and quiz answer interactions. - Removed repeated decorative pulse motion, avoided layout-property transitions, and kept hover movement pointer-gated with reduced-motion fallbacks.
- Replaced the single landing hero image with a three-photo automatic meetup stack.
- Refined the meetup stack into a contact-sheet style zig-zag pile with paper borders, staggered rear prints, external captioning, and transform-only motion.
- Simplified the automatic photo rotation so only the front print shifts to the back before the stack order advances.
- Added a previous meetup photo to the landing hero's "Right now" feature panel.
- Removed the redundant current-event summary from the photo panel so the hero only shows one meetup image.
- Updated the hero photo caption to identify it as the April meetup.
- Renamed the landing leaderboard eyebrow from "Community board" to "Community Kahoot board".
- Moved organizer-facing Vue routes from the predictable
/adminprefix to a configurableVITE_ADMIN_BASE_PATH, defaulting to/organizer-console. - Updated admin navigation, auth redirects, event tabs, and admin back links to build URLs through the shared route helper.
- Added a catch-all client route so old or unknown paths recover through the branded 404 instead of exposing an admin entry point.
- Removed the event-completion gate from event feedback so campaigns can exist and stay reachable before the event ends.
- Updated the public feedback status and submission APIs to create campaigns for any event instead of waiting for completed status.
- Reworded organizer feedback surfaces so they describe always-open draft access instead of an automatic completion window.
- Simplified the organizer feedback display route by removing the visible URL and campaign-settings actions from the live QR screen.
- Increased the QR code size and widened the display layout so the screen reads better from across a room.
- Kept the unavailable state focused on returning to the feedback hub instead of exposing extra controls on the display surface.
- Added a Vue catch-all route for unknown client paths.
- Added a branded 404 page with the missing path, quick recovery links, and organizer-aware primary navigation.
- Removed the oversized hero glow so the 404 background stays quiet at wide viewport sizes.
- Reworked the app header into a compact app bar with grouped navigation and aligned status/actions.
- Simplified the header into an editorial masthead with plain text navigation and subtle active underlines.
- Removed the public "Community" header label; the masthead now only shows an organizer indicator on admin routes.
- Removed the decorative nav group separator from the public masthead.
- Reworked the public navigation active state from a solid yellow fill to a lighter tinted selection with subtler hover, press, and focus states.
- Reduced the intensity of shared editorial action button hover/active states while preserving the yellow DevCon-Comm accent.
- Removed the nav item hover lift that could clip the selected border inside the horizontal scroller.
- Redesigned the public archive from a sparse timeline into event cards with clear titles, descriptions, topic chips, and talk previews.
- Reworked year selection, summary metrics, and filters so desktop and mobile archive browsing are easier to scan.
- Replaced native archive topic/speaker selects with app-themed custom dropdown popovers.
- Removed the redundant "View issue" chip from archive cards because the full card already opens the event.
- Reduced hard-edged admin chrome with softer shared panels, controls, tabs, and inputs.
- Removed terminal-style event status decoration from the admin event overview.
- Softened quick action cards and top navigation while keeping the editorial DevCon-Comm identity.
- Simplified the event overview so tabs stay in a consistent position across Overview/Talks/Speakers and the overview no longer repeats navigation as cards.
- Simplified talk review cards into a quieter list with muted metadata and one primary action.
- Redesigned archive event details as a quieter editorial list with restrained slide links and no terminal symbols.
- Added pagination to the public leaderboard table.
- Added an admin-only PDF upload endpoint for quiz sessions that validates PDF type/size, extracts text locally, and appends rule-based draft questions to the existing quiz flow.
- Added Quiz Builder UI for uploading a paper/resource PDF, choosing draft count, viewing generation status, and editing generated questions before opening the lobby.
- Added local PDF extraction dependency and documented the new quiz-generation API surface.
- Reframed the Vue landing page as a community hub with CFP/live quiz actions, recent published talks, and top members.
- Added archive search and filters across event text, talk titles, topics, and speakers.
- Improved speaker slide workflow with visible deadlines, upload state, and organizer reminder logging.
- Added local QR-code generation to the live quiz lobby.
- Updated reputation tracking so new quiz participation increments event counts and answers add to user totals.
- Added all-time/monthly leaderboard modes and claimed-profile badges.
- Added same-origin prototype admin cookie auth with
/admin/login, route redirects, logout, and server-side guards for organizer mutations. - Added planning/status files for the autonomous community-product pass.
- Added Satoshi + IBM Plex Mono typography direction and removed the old Lato/JetBrains Mono pairing.
- Introduced editorial UI primitives for page headers, panels, labels, inputs, and actions.
- Made top navigation role-aware and added event-level admin tabs for Overview/Talks/Speakers/Quiz/Live.
- Refined major public/admin surfaces toward a more cohesive editorial tech-conference look.
- Switched package management from npm lockfile to pnpm and added
pnpm-lock.yaml. - Added Vue 3 + Vite app shell under
src/and restored the DEV::CON[] branded landing page with Lato/JetBrains Mono fonts. - Added Hono API app and Bun production server under
server/so the UI and/api/*run on one same-origin port. - Ported public Vue routes for archive, event talks, leaderboard, CFP, My Talks, quiz join, and live player gameplay.
- Ported admin Vue routes for event management, event status, talks, speakers, quiz builder, and live quiz controls.
- Added matching Hono endpoints for event CRUD, speaker allowlists, CFP, talks/slides, leaderboard/account tools, quiz sessions/questions, join/state/answer.
- Updated TypeScript, Vite, Tailwind, and docs for the new migration target while keeping the legacy Next implementation as reference.
- Updated architecture docs with current public/admin route inventory and complete API route list.
- Updated implementation docs to reflect active route-to-module mappings for CFP, speakers, talks/slides, and quiz workflows.
- Corrected API contract examples to current snake_case payloads (
/api/cfp,/api/quiz/join,/api/quiz/answer). - Added missing major endpoint coverage in docs: speaker management endpoints, quiz question
PATCH/DELETE/reorder, and/api/talks/[talkId]/upload.
- First scan of codebase; generated all 5 docs
- Project: DevCon-Comm (Next.js 14, JSON mock DB, quiz system)
Future entries go above this line.