- Change game cover field from URL text to file upload (PocketBase migration)
- AddGameDialog now supports drag-and-drop image upload instead of URL input
- Add getGameCoverUrl() helper using pb.files.getUrl() for cover display
- Fix games listRule/viewRule: group.members.id syntax doesn't work in PB 0.22,
changed to group.members ~ @request.auth.id for correct member visibility
- Update changelog with all v0.3.5 entries
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix GroupMembersPanel join requests not loading when navigating
from homepage (onMounted timing issue), replaced with watch
- Fix GroupView pending count not syncing after reject/approve,
added requestHandled event communication between components
- Update changelog with all v0.3.5 fixes and new features
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add prominent pending join request badge on GroupView header
with pulse animation for admins/owners
- Clicking badge smoothly scrolls to request list with highlight
- Add "My Join Requests" section on Profile page
- Show status (pending/approved/rejected), timestamp, and reject reason
- Add API: getMyJoinRequests() to fetch user's full request history
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix clipboard copy error in HTTP environment with execCommand fallback
- Fix team invite page not loading user groups, always showing "join group first"
- Fix JoinGroupPage isMember check using group object instead of user ID
- Fix cancelRSVP deleting all users' RSVP records instead of current user's
- Fix event detail not loading event data itself
- Fix event comment avatar URL missing PocketBase baseUrl prefix
- Fix event creation missing endTime > startTime validation
- Fix event manage/delete permission split (creator+owner vs creator+owner)
- Fix event create button only visible to admins, now all members can create
- Fix event expand not subscribing to comments/RSVP realtime updates
- Fix event relative time not using status field
- Remove duplicate create/join group buttons from header and welcome bar
- Refactor team invite link to use API function
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Home: hide duplicate create/join buttons when user has no groups
- Invite links: /join/group/:id and /join/team/:id pages for one-click joining
- Admin: group admins field, ownership transfer, member management toggle
- Events: new events collection with RSVP (going/interested/maybe) and comments
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Each environment now runs its own PB + LiveKit + Voice Token + frontend
- UAT LiveKit: 7890, Voice Token: 7893 (separate from Dev 7880/7883)
- Remove docker-compose.backend.yml, merge into dev compose
- Delete duplicate bulletin migration files that caused PB crash on startup
- Update CLAUDE.md, nginx configs, and .env files accordingly
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add build.dev.json to override publish.url for dev environment
- Add build:dev and build:uat scripts; each sets its own feed URL
- copy-to-nas.js now accepts env argument; outputs to
electron-update/{dev|uat}/ locally and on NAS
- docker-compose volume mounts updated to serve from env subdirs
- Remove stale artifacts from electron-update root
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Integrate electron-store for persistent PocketBase auth backup
across localStorage clears and app reinstalls
- Switch build target from portable to nsis to generate latest.yml
for electron-updater generic provider
- Add user confirmation dialogs before download and before install
- Add post-build script to copy .exe/.yml/.nupkg to NAS share and
local electron-update/ directory for nginx volume mount
- Mount ./electron-update into frontend nginx containers via
docker-compose for automatic update file serving
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add --unsafely-treat-insecure-origin-as-secure flag for dev/uat URLs
- Set auto-granted permission handlers for mic/camera in main process
- Adapt useVoiceRoom error message for Electron (no Chrome flags hint)
- Add debug logging to voice-token service and frontend voice API
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LiveKit WebRTC SFU container in docker-compose
- Voice token microservice (Node.js + Express)
- VoiceRoom page with member grid and controls
- useVoiceRoom composable for LiveKit connection
- Voice entry button in TeamSessionPanel
- Nginx proxy for voice-token service API
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
GamesLibrary auto-cancellation error was caused by missing
$autoCancel:false on all games.ts PocketBase SDK calls.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Make ledger description field optional (was required, caused 400)
- Revert nginx.conf back to 192.168.1.14:8090 (host IP, reliable)
- Keep docker-compose port mapping as 8090:8090
- Add $autoCancel:false to ledger/asset API calls
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Was 8711:8090 but Dev PB should be on host port 8090 per CLAUDE.md
environment table. UAT remains on 8712.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove 6 duplicate Phase 2 migration files (1776500001-0006) that
failed on restart and blocked Phase 3 migrations from running
- Fix Dev nginx.conf proxy target from 192.168.1.14:8090 to
gamegroup-pb:8090 (Docker internal DNS) since host port 8090 is
not exposed (mapped as 8711:8090)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PocketBase JS SDK auto-cancels pending requests when a new request
targets the same collection. This causes errors when loadLedgers and
getLedgerSummary run in parallel via Promise.all. Added $autoCancel:false
to all API calls in ledgers.ts and assets.ts, matching project convention.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add group expense tracking (ledger) and public asset inventory (asset) features.
Ledger supports income/expense recording with monthly summary. Asset tracks
group equipment with free-form holder transfer. Both are independent pages
accessible from GroupView navigation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Group polls with option/rollcall modes, edit by creator, auto-settle
- Multimedia memories with upload, preview, inline video playback
- In-app notifications for poll/team/group events
- Points system and group stats dashboard
- Group detail tabs with icons (activity/polls/memories/stats)
- Fix: nginx file upload size, static cache blocking API, timezone, auto-cancel
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Login: query user by name field, authenticate with username
- Register: add blur-triggered nickname uniqueness validation
- Requires PocketBase users collection listRule/viewRule set to public
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- User input "昵称" stored in `name` field (supports Chinese)
- `username` auto-generated (PocketBase requires ASCII)
- Password rules displayed inline with real-time validation
- All UI displays prefer `name` over `username`
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Unify color palette from mixed green/blue/purple to consistent green theme
- Sidebar: add text labels to create/join group buttons for discoverability
- Header: add quick action buttons (create group, join group, notifications)
- Mobile: add hamburger menu with slide-out sidebar and overlay
- Home: add prominent CTA buttons, onboarding card for empty state
- Join group dialog: add search-by-name mode alongside existing ID lookup
- Games library: inline group selector dropdown instead of external selection
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add UAT PocketBase on port 8712 with separate pb_data_uat
- Add UAT nginx config proxying to UAT PB (port 8712)
- Update Dockerfile to support NGINX_CONF build arg
- Add .gitignore for .playwright-mcp/
- Auto-generated team_sessions migration
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add dedicated nginx location block for /api/realtime with:
- proxy_buffering off to prevent response buffering
- gzip off to avoid chunked encoding issues
- proxy_read_timeout 86400s for long-lived SSE connections
- Connection '' instead of 'upgrade' for SSE protocol
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Accept invitation: update local userStore status to in_team
- Start game: update userStore status to in_team
- End game: update userStore status to idle, simplify endGame logic
- Add $autoCancel:false to endGame session fetch
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Relax team_sessions collection rules to allow authenticated users to view/update
- Reorder respondInvitation: join session before marking invitation as accepted
- Add $autoCancel: false to prevent request cancellation during invitation flow
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix other members' status not visible due to users collection viewRule restriction
- Fix empty status treated as 'away' instead of 'idle' in membersByStatus
- Auto-set creator to 'in_team' status when creating team session
- Filter current user from idle members invite list
- Fix group store isGroupOwner using pb.authStore instead of localStorage
- Add nginx no-cache headers for index.html
- Add join_requests collection migration and join approval flow
- Update groups collection rules and add requireApproval field
- Add Memory types for Phase 2 planning
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
SSE subscriptions trigger concurrent requests to the same endpoints,
causing auto-cancellation errors. Add $autoCancel: false to group
queries that get called from realtime event handlers.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove loadFromCookie that overwrites valid localStorage auth data
- Set user status to idle on first login (was empty string)
- Default empty status to idle instead of away
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>