- 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>
- Fix cookie path to '/' for auth persistence across page refreshes
- Login field now accepts both username and email
- Add 30s polling for group list and team session status refresh
- Add group name uniqueness check before creation
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- New join_requests PocketBase collection for pending join applications
- Group requireApproval field (default true) with owner toggle
- JoinGroupDialog: apply when approval required, direct join when not
- JoinRequestCard component for accept/reject in notifications and group panel
- NotificationPanel shows both invitations and join requests
- GroupMembersPanel shows pending requests and approval switch for owners
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Changed groups collection listRule and viewRule from member-only to
any authenticated user, so users can find and join groups. Also
improved registration error messages with Chinese validation feedback.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Extract PocketBase validation errors (duplicate email/username/password)
and display them in Chinese. Also improve login error message.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Use @element-plus/icons-vue components for consistent, scalable vector
icons across sidebar navigation, section headers, ratings, and buttons.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Game library: add/delete games per group, JSON/CSV import/export, favorites, star ratings & comments
- Fix team session creation: add creator to members array, handle null currentGroup
- Fix image loading: rename SVG files from .png to .svg extensions
- Add PocketBase migrations for game_comments and game_favorites collections
- Remove seed data script
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>