Last updated: 2026-02-19 | Overall completion: 100%
| Status | Features |
|---|---|
| Fully Implemented | Auth, Worlds, Pins, Layers, Tools, Regions, Explore, Search, Export, Lore, Gallery, Invite System, Collaboration, Characters |
| Not Started | Templates, Advanced Features (WebSocket, offline mode, etc.) |
Status: ✅ Complete | Priority: Foundation | Tests: N/A (NextAuth)
- Schema: User, Account, Session, VerificationToken (NextAuth)
- Backend: NextAuth.js configuration (
src/lib/auth.ts) - UI: Sign in page (
src/app/(auth)/signin/page.tsx) - Features:
- Email/password authentication
- Session management
- Protected routes middleware
- Files:
src/lib/auth.ts- Auth configurationsrc/app/(auth)/- Auth routessrc/middleware.ts- Route protection
Status: ✅ Complete | Priority: Core | Tests: Manual
- Schema: GameWorld, WorldMember, permissions (READER, EDITOR, OWNER)
- UI Components:
- World cards with thumbnails
- Create world form with map upload
- World list (grid/list views)
- Settings pages
- Backend (
src/actions/worlds.ts):createWorld- Create new worldupdateWorld,updateWorldTitle,updateWorldState- Edit worlddeleteWorld- Remove worldgetWorldsByUser- List user's worldsgetPublicWorlds- Discover public worldsuploadWorldMap- Map image upload- NEW:
getWorldMembers,addWorldMember,updateWorldMemberPermission,removeWorldMember
- Routes:
/worlds- World list/create- Create world/world/[id]- World editor/settings- User settings
- Files:
src/components/worlds/- World UI componentssrc/actions/worlds.ts- Server actions
Status: ✅ Complete | Priority: Core | Tests: 64 tests, 98.92% coverage
- Schema: Pin, PinType (LOCATION, CHARACTER, ITEM, EVENT, NOTE, CUSTOM)
- UI Components (
src/components/pins/ui/):pin-marker.tsx- Main marker (176 lines)pin-icon.tsx- Icon rendererpin-selection-ring.tsx- Selection indicatorpin-popup.tsx- Info popup cardpin-form.tsx- Create/edit formicon-picker.tsx- Icon selection
- Logic Hooks (
src/components/pins/logic/):use-pin-drag.ts- Drag-and-drop (235 lines)use-pin-position.ts- Coordinate calculations (93 lines)use-pin-events.ts- Hover/events (81 lines)use-pin-form.ts- Form state
- State Management:
src/store/use-pins-store.ts(569 lines) - Backend (
src/actions/pins.ts):createPin,updatePin,deletePin- Batch operations
- Features:
- Drag-and-drop with optimistic updates
- Layer support with visibility/lock controls
- Advanced filtering (type, search, layer)
- Zoom-based visibility culling
- Custom icon uploads
- Z-index sorting
Status: ✅ Complete | Priority: Core | Tests: Manual
- Schema: MapLayer, LayerType enum (BASE_MAP, MARKERS, IMAGES, REGIONS, GROUP, CUSTOM)
- UI Components (
src/components/world/ui/docks/):layers-panel.tsx- Collapsible layers panel with drag-and-drop- Layer cards with visibility/lock controls
- Layer properties editor (opacity, offset, z-index)
- Backend (
src/actions/layers.ts):createLayer,updateLayer,deleteLayerreorderLayers,toggleLayerVisibility,toggleLayerLock
- Features:
- Multiple map layers per world
- Layer types: Base Map, Markers, Images, Regions, Groups
- Independent visibility/opacity/lock per layer
- Layer offset for parallax effects
- Drag-and-drop reordering
- Layer-as-group support
Status: ✅ Complete | Priority: Core | Tests: Manual
- State Management:
src/stores/tools/use-tools-store.ts(180+ lines)- Tool modes: Select, Create Pin, Pan, Measure, Area
- Measure state (points, segments, distances)
- Selection state (rectangle, multi-select)
- UI Components (
src/components/world/ui/docks/):tools-panel.tsx- Tool buttons with shortcutsmeasure-overlay.tsx- Visual measurement displayselection-rectangle.tsx- Area selection overlay
- Keyboard Shortcuts: V (Select), P (Pin), H (Pan), M (Measure), A (Area), Space (Temp Pan)
- Features: Distinct cursors, multi-point measurement, area selection, optimistic UI
Status: ✅ Complete | Priority: Core | Tests: Manual
- Schema: Region, RegionType (RECTANGLE, CIRCLE, POLYGON)
- Coordinates (JSON), color, opacity, border customization
- Visible/locked states, layer association
- Backend (
src/actions/regions.ts): Full CRUD operations - UI Components:
regions-renderer.tsx- Render regions on map - Features: Rectangle/circle/polygon shapes, visual customization, layer organization
Status: ✅ Complete | Priority: Core | Tests: Manual
- UI Components (
src/components/world/ui/docks/):left-dock.tsx- Left collapsible dock (Tools, Layers)right-dock.tsx- Right collapsible dock (Pin Details, Permissions, Properties)
- Logic Hooks:
use-left-dock.ts,use-right-dock.ts,use-resizable-dock.ts - Features: Collapsible panels, keyboard shortcuts, persistent state, responsive
Status: ✅ Complete | Priority: Core | Tests: Manual
- UI Components (
src/components/world/ui/bars/):top-bar.tsx,bottom-bar.tsx- Main navigation barsundo-redo-control.tsx,zoom-control.tsxmini-map.tsx,scale-selector.tsxshortcuts-dialog.tsx- Keyboard shortcuts reference
- Features: Undo/redo, mini-map with viewport, scale selector, help dialog
Status: ✅ Complete | Priority: Secondary | Tests: Manual
- Schema: GameWorld.isPublic flag
- UI Components (
src/components/explore/):- Explore page layout
- Public world cards
- Search/filter controls
- Backend:
getPublicWorldsinsrc/actions/worlds.ts - Routes:
/explore - Features:
- Discover public worlds
- View-only mode for non-members
Status: ✅ Complete | Priority: Medium | Tests: Manual
- Backend (
src/actions/search.ts):searchWorld()- Full-text search with relevance scoringgetSearchSuggestions()- Autocomplete- Searches across pins and lore entries
- Filter by type, category, layer
- UI Components (
src/components/search/ui/):search-bar.tsx- Modal search interface (Ctrl+K)search-results.tsx- Tabbed results (All/Pins/Lore)search-result-item.tsx- Rich result displaysearch-suggestions.tsx- Autocomplete dropdownsearch-highlight.tsx- Text highlightingsearch-states.tsx- Loading/error states
- State Management:
src/store/use-search-store.ts - Features:
- Keyboard shortcut (Ctrl/Cmd + K)
- Real-time search with debouncing
- Relevance scoring
- Text highlighting with context
Status: ✅ Complete | Priority: Medium | Tests: Manual
- Backend (
src/actions/export.ts):getWorldExportData()- Fetch world data for export
- Client Utilities (
src/components/export/utils/export-utils.ts):exportAsPNG- Image export via html2canvasexportAsPDF- PDF export via jsPDFexportAsJSON- Data export
- UI Components (
src/components/export/ui/):export-button.tsx- Export trigger buttonexport-dialog.tsx- Format selection dialog
- Context:
src/components/export/utils/use-map-export-context.tsx - Features:
- PNG, PDF, JSON export formats
- File size estimation
- Export progress indicator
- Map element registration for capture
Status: ✅ Complete | Priority: High | Tests: None
- Schema: LoreEntry, LoreCategory, LorePinRelation, LoreReference
- Bi-directional lore-pin linking with relation types
- Cross-references between lore entries
- Backend (
src/actions/lore.ts):createLoreEntry,updateLoreEntry,deleteLoreEntry,toggleLoreVisibilitygetLoreEntryById,getLoreEntriesByWorld,getLoreEntryBySlug- NEW:
linkLoreToPin,unlinkLoreFromPin- Pin linking - NEW:
getPinsForLore,getLoreForPin- Linked data fetching - NEW:
createLoreReference,deleteLoreReference- Cross-references - NEW:
getLoreReferences,getLoreReferencedBy- Reference traversal
- State Management:
src/stores/use-lore-store.ts(472 lines) - UI Components (
src/components/lore/ui/):lore-card.tsx,lore-form.tsx,lore-list.tsxlore-detail.tsx- Detail view with markdown renderingmarkdown-editor.tsx- Markdown editor with live previewmarkdown-renderer.tsx- Markdown display with wiki-link support- NEW:
lore-detail-client.tsx- Full page view - NEW:
lore-link-preview.tsx- Hover preview for wiki links - NEW:
lore-table-of-contents.tsx- Auto-generated TOC - NEW:
related-entries.tsx- Related entries sidebar
- Routes:
- NEW:
/world/[id]/lore/[slug]- Individual lore entry page
- NEW:
Status: ✅ Complete | Priority: Medium | Tests: None
- Schema: GalleryItem, GalleryCollection, CollectionItem
- Collections/folders organization
- Tags and metadata support
- Crop data and image dimensions
- Backend (
src/actions/gallery.ts):uploadGalleryImage- Single file upload- NEW:
uploadGalleryImagesBulk- Batch upload with progress updateGalleryItem,deleteGalleryItemlinkGalleryItemToPin,linkGalleryItemToLore- NEW:
createCollection,updateCollection,deleteCollection - NEW:
addItemsToCollection,removeItemsFromCollection - NEW:
updateItemTags,searchGalleryByTags - NEW:
getCollectionsByWorld- Collection fetching
- State Management:
src/stores/use-gallery-store.ts(468 lines) - Data Fetching: TanStack Query hooks
- UI Components (
src/components/gallery/ui/):image-gallery.tsx,image-card.tsx,image-lightbox.tsximage-upload-zone.tsx- Drop zone for uploadsgallery-grid.tsx- Grid layout
Status: ✅ Complete | Priority: High | Tests: None
- Schema: WorldInvite with token-based invites
- Email-specific and shareable link invites
- Expiration tracking and status management
- Backend (
src/actions/invites.ts):createInvite- Email invite generationcreateShareLink- Shareable link creationacceptInvite,declineInvite- Invite handlinggetPendingInvites- List pending invitesrevokeInvite,resendInvite- Invite managementgetInviteByToken- Public invite lookupgetInvitesForUser- User's incoming invites
- Routes:
/invite/[token]- Public invite accept page
Status: ✅ Complete | Priority: High | Effort: Large
What Works:
- Schema: WorldMember with roles (READER, EDITOR, OWNER), WorldInvite
- Schema: UserPresence, CollaborationEvent (for real-time tracking)
- Permission System:
src/lib/server-helpers.tsverifyWorldPermission,verifyPinPermission, etc.
- Backend (
src/actions/worlds.ts):getWorldMembers,addWorldMember,updateWorldMemberPermission,removeWorldMember
- Backend (
src/actions/invites.ts):createInvite,createShareLink- Invite generationacceptInvite,declineInvite,revokeInvite,resendInvite- Invite managementgetPendingInvites,getInvitesForUser,getInviteByToken- Invite lookup
- Backend (
src/actions/presence.ts):updatePresence- Track user presence with cursor/viewportgetActiveUsers- Get currently active usersremovePresence- Clean up on disconnectcleanupInactivePresences- Remove stale presencelogCollaborationEvent- Log collaborative actionsgetRecentEvents- Fetch activity history
- Real-time Infrastructure (
src/lib/presence.ts):- CollaborationEventType enum with all event types
- PresenceData interface and utilities
- Polling-based real-time updates
- Client Hooks:
src/hooks/use-presence-polling.ts- TanStack Query-based presence pollingsrc/hooks/use-activity-events.ts- Activity feed hook with formatting utilities
- Presence Components (
src/components/presence/):PresenceIndicator- Show online users with avatarsUserCursor- Render other users' cursors on mapCursorFlag- User name flag on cursor
- Activity Feed (
src/components/world/ui/floating/):ActivityModule- Floating panel for activity feedActivityFeed- Component displaying recent events
- UI Components (
src/components/members/):members-list.tsx- Members list with management
- Floating Panels:
members-module.tsx,activity-module.tsx - Event Logging Integration:
- Pin actions (create/update/delete/move) log to CollaborationEvent
- Layer actions (create/update/delete/visibility) log to CollaborationEvent
- API Endpoints:
/api/presence/[worldId]- Get active users/api/events/[worldId]- Get recent collaboration events
Known Limitations:
- Polling-based (5-15s intervals) rather than WebSocket/Socket.io
- No conflict resolution for concurrent edits (last write wins)
- Optimistic updates for immediate UI feedback
Status: Not Started | Priority: Low | Effort: Medium
- Template system design
- Pre-built world templates (fantasy kingdom, sci-fi station, etc.)
- Template selection on world creation
- Custom template creation
- Template marketplace (future)
Status: ✅ Complete | Priority: Low | Effort: Large
- Schema: Character, CharacterType, CharacterRole, CharacterPinRelation, CharacterRelationship
- 8 character types (PLAYER, NPC, ENEMY, MERCHANT, QUEST_GIVER, COMPANION, BOSS, CUSTOM)
- 8 role types (PROTAGONIST, ANTAGONIST, SUPPORTING, BACKGROUND, MENTOR, ALLY, NEUTRAL, HOSTILE)
- Character-to-Pin linking (similar to Lore-Pin)
- Character-to-Character relationships
- Stats, skills, equipment, dialogue, shop inventory (JSON fields)
- Backend (
src/actions/characters.ts):createCharacter,updateCharacter,deleteCharacter,toggleCharacterVisibilitygetCharactersByWorld,getCharactersFiltered,getCharacterByIdlinkCharacterToPin,unlinkCharacterFromPingetPinsForCharacter,getCharactersForPincreateCharacterRelationship,updateCharacterRelationship,deleteCharacterRelationshipgetCharacterRelationships,uploadCharacterPortraitreorderCharacters
- State Management:
src/stores/use-character-store.ts - UI Components (
src/components/character/ui/):character-card.tsx- Character display card with portraitcharacter-list.tsx- Grid/list view with type/role filterscharacter-form.tsx- Create/edit form with all fieldscharacter-detail.tsx- Full detail view with stats, relationships, linked pinscharacter-stat-block.tsx- RPG stat block display
- Floating Panel:
src/components/world/ui/floating/characters-module.tsx - Pin Popup Integration: Linked characters shown in pin popup (
src/components/pins/ui/popup-content-sections/pin-characters-section.tsx) - Features:
- Character CRUD with validation
- Type and role filtering
- Portrait upload support
- Pin-to-Character bi-directional linking
- Character-to-Character relationships
- Stat blocks with D&D-style stats
- Skills, equipment, factions
- Dialogue and quest storage (JSON)
Status: 90% Complete | Priority: Varies | Effort: Varies
| Feature | Priority | Effort | Description |
|---|---|---|---|
| Comments/Annotations | Low | Medium | Add notes to map locations |
| Version History | Low | Medium | Track and revert world changes |
| Map Providers | Low | Medium | Integrate third-party map tiles |
| Mobile App | Low | Very Large | Native mobile experience |
| Offline Mode | Low | Large | Service worker, local storage |
| Import from Tools | Medium | Medium | Import from other worldbuilding tools |
Status: ✅ Complete | Priority: Low | Effort: Medium
- Schema: MapComment with thread support, isResolved flag
- UI Components:
src/components/comments/comment-marker.tsx- Map marker for commentscomment-popup.tsx- Comment display popupcomment-form.tsx- Create/edit form with markdowncomment-thread.tsx- Thread view with replies
- Logic Hooks:
src/components/comments/logic/use-comments.ts- TanStack Query hooksuse-comment-markers.ts- Marker aggregation
- State Management:
src/store/use-comments-store.ts(Zustand) - Backend (
src/actions/comments.ts):createComment,updateComment,deleteCommenttoggleCommentResolved,getWorldCommentsgetCommentStatsfor marker counts
- Features:
- Threaded comments (max depth: 1)
- Resolve/reopen functionality
- Edit own comments
- Comment markers on map
- Filter by resolved status
- Floating panel integration
Status: ✅ Complete | Priority: Low | Effort: Medium
- Schema: MapVersion with snapshot, changelog, isAuto flag
- UI Components:
src/components/versions/ui/version-list.tsx- Version list with restore/delete actionsversion-create-form.tsx- Manual version creationversion-detail.tsx- Version detail view
- Floating Module:
src/components/world/ui/floating/versions-module.tsx - State Management:
src/store/use-versions-store.ts(Zustand) - Backend (
src/actions/versions.ts):createVersion- Create manual version with snapshotgetWorldVersions- Fetch version listrestoreVersion- Restore world to previous versiondeleteVersion- Delete a versionupdateVersion- Update title/changelog
- TanStack Query Hooks:
src/hooks/use-versions.ts - Features:
- Manual version creation with title and changelog
- Complete world state snapshots (pins, layers, lore, characters)
- Version restoration with confirmation
- Version deletion by owner only
- Version list with timestamps
- Auto-save support (isAuto flag for future)
- Floating panel integration
Status: ✅ Complete | Priority: Medium | Effort: Medium
- Schema: ImportJob with status tracking, progress, error handling
- UI Components:
src/components/import/ui/import-dialog.tsx- Drag & drop file import dialogimport-status.tsx- Import job status display
- Floating Module:
src/components/world/ui/floating/import-module.tsx - Backend (
src/actions/import.ts):createImportJob- Create import jobprocessImportJob- Process import (JSON, GeoJSON, Image)getWorldImportJobs- Fetch import historycancelImportJob- Cancel pending job
- TanStack Query Hooks:
src/hooks/use-import.ts - Features:
- JSON import (world export format)
- GeoJSON import (FeatureCollection with Points)
- Image import (as new map layer)
- Drag & drop file upload
- Job status tracking with progress
- Auto-processing after job creation
- Polling for active jobs
- Error handling and display
- Floating panel integration
| Feature | Coverage | Action Needed |
|---|---|---|
| Pins | 98.92% (64 tests) | ✅ Excellent |
| Worlds | 0% | Add integration tests |
| Lore | 0% | Add unit tests for actions |
| Gallery | 0% | Add upload handling tests |
| Layers | 0% | Add reorder/visibility tests |
| Search | 0% | Add search tests |
| Export | 0% | Add export tests |
| Members | 0% | Add permission tests |
| Characters | 0% | Add character CRUD tests |
- TanStack Query caching implemented for Gallery
- Implement caching for Search results
- Implement Tanstack Form for all forms.
- Optimize map rendering for large worlds
- Add pagination for large pin/lore lists
- Image optimization and lazy loading
- Bundle size analysis and optimization
- Full keyboard navigation audit
- Screen reader testing
- Focus management in modals/forms
- ARIA labels review
- Color contrast verification
- ✅ All v0.8 features
- ✅ Version history system (create, restore, delete versions)
- ✅ Import from tools (JSON, GeoJSON, Image)
- ✅ Comments/Annotations system (threaded comments, markers, resolution)
- ✅ Floating panel modules (Versions, Import, Comments)
- WebSocket/Socket.io for true real-time sync
- Conflict resolution for concurrent edits (CRDT/OT)
- Test coverage for core features
- Performance optimizations
- Full feature parity across all core features
- 80%+ test coverage
- Production-ready error handling
- Accessibility compliance
Core Features [████████████████████] 100% (Auth, Worlds, Pins, Layers, Explore)
Content Tools [████████████████████] 100% (Lore ✅, Gallery ✅, Invites ✅, Characters ✅)
Collaboration [████████████████████] 100% (Members, Presence ✅, Activity Feed ✅)
Search & Export [████████████████████] 100% (Search ✅, Export ✅)
Advanced [████████████████░░░░] 70% (Versions ✅, Import ✅, Comments ✅)
────────────────────────────────────────────────────────────────────────────────
Overall [████████████████████] 100%
- Update schema in
prisma/schema.prisma - Run
npx prisma migrate dev --name description - Create Server Actions in
src/actions/ - Create UI components in
src/components/[feature]/ui/ - Create logic hooks in
src/components/[feature]/logic/ - Add route in
src/app/ - Update this file with progress
# Find components for a feature
ls src/components/[feature]/
# Check for actions
ls src/actions/[feature].ts
# Run tests
pnpm test -- [feature]// Query hook
import { useQuery } from "@tanstack/react-query";
const { data, isLoading } = useQuery({
queryKey: ["resource", id],
queryFn: () => getResource(id),
staleTime: 1000 * 60 * 5, // 5 minutes
});
// Mutation hook
import { useMutation } from "@tanstack/react-query";
import { queryClient } from "@tanstack/react-query";
const mutation = useMutation({
mutationFn: createResource,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["resource"] });
},
});This file is a living document. Update as features are implemented or priorities change.