crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

DateCommit messageAuthorFiles+-
2026-05-12 20:31Skip the cell-cache rewrite when refreshing the current gameMichael Camilleri1+10-3
2026-05-12 20:09Make MovesUpdater debounce timing test-injectableMichael Camilleri2+51-6
2026-05-12 20:08Parallelise refreshLibrary across database scopesMichael Camilleri1+16-12
2026-05-12 19:48Parallelise discoverNewZonesDirect across zones and record typesMichael Camilleri1+62-33
2026-05-12 19:44Parallelise fetchPushPingsDirect across zonesMichael Camilleri1+39-17
2026-05-12 19:42Lower MovesUpdater debounce from 1500ms to 500msMichael Camilleri2+2-2
2026-05-12 19:29Kick sendChanges() on player, game and delete enqueuesMichael Camilleri1+3-0
2026-05-12 19:24Parallelise the silent-push handler and skip wasteful zone discoveryMichael Camilleri1+34-35
2026-05-12 10:16Increase timeout for flakey testMichael Camilleri1+1-1
2026-05-12 10:11Parallelise the library refresh and skip completed gamesMichael Camilleri1+56-27
2026-05-12 09:10Pull updates for known game zones on library refreshMichael Camilleri2+77-0
2026-05-12 08:40Discover unseen game zones without waiting on CKSyncEngineMichael Camilleri4+164-22
2026-05-12 08:07Bump Crossmate-flavoured XD versionMichael Camilleri14+31-14
2026-05-12 08:04Render circled cells in converted puzzlesMichael Camilleri2+40-27
2026-05-12 07:19Surface collaborator pings on background push wakesMichael Camilleri4+167-0
2026-05-11 22:23Tweak Clue Bar layoutMichael Camilleri1+5-4
2026-05-10 18:55Add Crossmate version to puzzle data structuresMichael Camilleri26+187-19
2026-05-10 18:30Update .gitignoreMichael Camilleri1+1-0
2026-05-10 16:42Use publisher as a consistent nameMichael Camilleri14+768-768
2026-05-10 16:18Fix movement when deleting first letter of a wordMichael Camilleri2+85-3
2026-05-10 16:13Fix movement when typing last letter in a directionMichael Camilleri3+109-10
2026-05-10 15:55Adjust touch target for previous/next buttons in Clue BarMichael Camilleri1+5-4
2026-05-10 15:25Improve latency of pingsMichael Camilleri1+1-0
2026-05-10 14:17Clean up completed game ping recordsMichael Camilleri3+93-1
2026-05-10 13:55Tweak layout of Clue List on iOSMichael Camilleri1+25-11
2026-05-10 11:01Move diagnostics menu option into Puzzle MenuMichael Camilleri1+10-15
2026-05-10 10:49Make diagnostics accessible from Puzzle ViewMichael Camilleri1+16-0
2026-05-10 10:23Simplify push notification fallbackMichael Camilleri1+2-8
2026-05-10 06:18Limit push fallback to active gameMichael Camilleri2+139-89
2026-05-10 05:51Include Player records in fallback fetchMichael Camilleri1+6-1
2026-05-09 05:09Disable solved puzzle toolbar actionsMichael Camilleri1+10-2
2026-05-09 03:01Load puzzles before roster refreshMichael Camilleri5+93-50
2026-05-09 02:40Retry pending move flushes until persistedMichael Camilleri3+35-15
2026-05-09 01:28Fix notification replay bugMichael Camilleri3+12-20
2026-05-09 00:19Preserve local Moves record at all timesMichael Camilleri4+166-3
2026-05-08 22:40Fix Success Panel animationMichael Camilleri1+23-9
2026-05-08 22:17Improve Success Panel animationMichael Camilleri1+30-23
2026-05-08 21:14Extend divider into safe area in landscapeMichael Camilleri1+1-0
2026-05-08 15:00Disable author tinting for local gamesMichael Camilleri2+11-12
2026-05-08 14:39Collapse roster list in ScoreboardMichael Camilleri2+8-10
2026-05-08 14:33Make roster always presentMichael Camilleri4+46-28
2026-05-08 13:58Add logging for rostersMichael Camilleri1+18-0
2026-05-08 13:38Add alternative CloudKit path for notified changesMichael Camilleri3+216-44
2026-05-08 13:25Use more targeted CloudKit fetchesMichael Camilleri2+18-11
2026-05-08 13:09Fetch current puzzle zone on pushMichael Camilleri2+45-6
2026-05-08 12:39Create push subscriptions expresslyMichael Camilleri1+52-0
2026-05-08 12:29Add more instrumentation to push notificationsMichael Camilleri1+33-0
2026-05-08 12:12Set APN environment to productionMichael Camilleri1+1-1
2026-05-08 11:37Instrument notification code pathMichael Camilleri2+29-0
2026-05-08 07:54Push Moves immediately after debounced flushMichael Camilleri3+49-12
2026-05-08 03:31Rewrite sync approachMichael Camilleri32+1898-2210
2026-05-07 22:40Stop CKSyncEngine from looping on ZoneNotFoundMichael Camilleri3+260-4
2026-05-07 22:39Add testing instructions to AGENTS.mdMichael Camilleri1+9-0
2026-05-07 21:11Apply private-DB zone deletions on receiving devicesMichael Camilleri3+93-32
2026-05-07 20:31Recover from CloudKit etag drift on Player and Move recordsMichael Camilleri3+49-1
2026-05-07 20:30Add basic AGENTS.md fileMichael Camilleri1+13-0
2026-05-07 10:26Add initial 10 bundled puzzlesMichael Camilleri15+1081-4
2026-05-07 09:49Move debug puzzles to new top-level directoryMichael Camilleri10+85-47
2026-05-07 08:09Support Across Lite puzzle importMichael Camilleri9+569-8
2026-05-07 07:15Add external sources section to SettingsMichael Camilleri1+31-5
2026-05-07 05:36Fetch account e-mail through GraphQL profileMichael Camilleri4+230-23
2026-05-07 04:41Add About screen to SettingsMichael Camilleri5+111-1
2026-05-06 23:21Fix silent record drops in inbound CloudKit syncMichael Camilleri4+172-42
2026-05-06 21:58Replace in-memory engines on reset sync stateMichael Camilleri1+20-2
2026-05-06 19:31Propagate ckShareRecordName to other owner-devicesMichael Camilleri6+302-3
2026-05-06 18:30Fix XD accepted-answer rebus completionMichael Camilleri3+117-8
2026-05-06 17:51Update text in notification messagesMichael Camilleri5+91-4
2026-05-06 17:38Tweak count on in-progress scoreboard on iPadOSMichael Camilleri1+44-6
2026-05-06 17:34Improve final scoreboard display on iPadOSMichael Camilleri1+20-6
2026-05-06 16:52Replace clear menu with entry menuMichael Camilleri1+21-14
2026-05-06 16:22Fix concurrency warning about isolationMichael Camilleri1+6-4
2026-05-06 15:51Support XD clue metadata accepted answersMichael Camilleri7+503-27
2026-05-06 14:03Support additional iPad orientationMichael Camilleri2+2-0
2026-05-06 13:56Change swipe gesture to change cursor axis to tap gestureMichael Camilleri2+11-9
2026-05-06 13:17Add iPad portrait layoutMichael Camilleri2+97-18
2026-05-06 09:17Add external keyboard input handlingMichael Camilleri6+339-2
2026-05-06 04:23Add initial iPad layoutMichael Camilleri6+541-83
2026-05-06 01:20Add keyboard swipe to set entry directionMichael Camilleri2+16-0
2026-05-06 00:07Preserve cell author on same-letter rewrites and reveal-of-correctMichael Camilleri4+172-8
2026-05-05 22:16Expand scope of notifications of collaborator actionsMichael Camilleri9+247-97
2026-05-05 15:19Make GameStore collaborators required at constructionMichael Camilleri10+510-447
2026-05-05 11:43Persist local author identity across launchesMichael Camilleri4+45-15
2026-05-04 00:36Ensure notifications display during backgroundingMichael Camilleri4+59-4
2026-05-04 00:01Prevent author tinting on empty squaresMichael Camilleri1+3-1
2026-05-03 23:54Tweak behaviour regarding shared gamesMichael Camilleri1+16-3
2026-05-03 23:13Support author tinting on shareMichael Camilleri5+55-32
2026-05-03 22:58Update author tints dynamicallyMichael Camilleri3+7-3
2026-05-03 05:31Use a faint background to differentiate authorsMichael Camilleri2+12-12
2026-05-03 04:20Add colours to text in shared gamesMichael Camilleri2+20-3
2026-05-02 16:54Avoid using icons in puzzle view menusMichael Camilleri1+3-9
2026-05-02 16:43Fix warnings about discarded resultsMichael Camilleri1+1-0
2026-05-02 16:42Fix leaving of shared gamesMichael Camilleri1+9-2
2026-05-02 15:28Improve consistency between game list menu and puzzle menuMichael Camilleri3+387-179
2026-05-02 15:06Simplify leave/deletion options for shared gamesMichael Camilleri5+139-24
2026-05-02 11:29Unwind changes to reduce CloudKit callsMichael Camilleri5+88-42
2026-05-02 08:25Remove performance loggingMichael Camilleri10+9-423
2026-05-02 08:13Fix needless game parsing on key strokesMichael Camilleri5+156-28
2026-05-02 08:09Reenable ProMotionMichael Camilleri2+3-0
2026-05-02 04:13Disable ProMotionMichael Camilleri2+0-3
2026-05-02 01:36Allow certain logging to be disabledMichael Camilleri5+109-55
2026-05-02 01:06Support toggling iCloud syncingMichael Camilleri4+78-17
2026-05-02 00:52Increase granularity of loggingMichael Camilleri1+29-1
2026-05-02 00:42Make grid squares equatableMichael Camilleri2+16-7
2026-05-02 00:06Add performance logging to SwiftUI-related functionsMichael Camilleri4+164-1
2026-05-01 23:22Reduce workload during flushesMichael Camilleri3+122-4
2026-05-01 23:14Add more detail to performance loggingMichael Camilleri2+30-4
2026-05-01 23:06Add performance loggingMichael Camilleri10+429-91
2026-05-01 22:48Defer CloudKit move enqueues while typingMichael Camilleri5+140-17
2026-05-01 22:41Reduce puzzle input workMichael Camilleri4+92-9
2026-05-01 17:47Improve responsiveness in puzzle viewMichael Camilleri3+168-106
2026-05-01 16:32Reduce calculations during renderingMichael Camilleri2+45-17
2026-05-01 13:54Improve scoreboard revealMichael Camilleri3+38-15
2026-05-01 13:14Add scoreboard to success panelMichael Camilleri3+187-25
2026-05-01 11:47Recover existing CloudKit zone sharesMichael Camilleri1+95-14
2026-05-01 11:04Use panel rather than sheet on puzzle completionMichael Camilleri2+30-37
2026-05-01 09:20Switch to using canvas for thumbnail previewsMichael Camilleri1+31-65
2026-05-01 08:54Tweak centring of puzzle againMichael Camilleri1+1-0
2026-05-01 07:52Add separation between title and gridMichael Camilleri1+1-1
2026-05-01 07:37Adjust centring approach againMichael Camilleri1+1-1
2026-05-01 07:28Adjust centring approachMichael Camilleri1+34-28
2026-05-01 04:35Centre grid in puzzle viewMichael Camilleri1+119-47
2026-04-30 23:45Support high refresh ratesMichael Camilleri2+3-0
2026-04-30 23:33Detect more forms of cross-referenced cluesMichael Camilleri2+127-11
2026-04-30 22:04Make last update time update liveMichael Camilleri1+37-5
2026-04-30 21:52Change display of cross-referenced cluesMichael Camilleri5+218-73
2026-04-30 21:50Add scripts to translate JSON to XDMichael Camilleri3+128-0
2026-04-30 12:51Change reveal tool to only mark mistakes as correctMichael Camilleri2+41-2
2026-04-30 05:05Tweak threshhold for roomier displayMichael Camilleri1+1-1
2026-04-30 05:00Make game list styling dependent on scene sizeMichael Camilleri1+59-38
2026-04-30 04:36Change date formatting in PuzzleViewMichael Camilleri1+2-2
2026-04-30 04:30Tweak game list stylingMichael Camilleri1+75-14
2026-04-30 04:17Show unread badge for unseen shared puzzle changesMichael Camilleri6+186-4
2026-04-30 03:55Navigate to games from notification tapsMichael Camilleri1+52-0
2026-04-30 03:43Remove remote-alert notification pathMichael Camilleri11+11-404
2026-04-30 02:30Use synced pings for activity notificationsMichael Camilleri3+103-35
2026-04-29 14:30Add app notifications for shared puzzle activityMichael Camilleri15+738-10
2026-04-29 12:50Use grey for thematic colouringMichael Camilleri1+2-2
2026-04-29 10:34Add Crossmake toolMichael Camilleri6+355703-0
2026-04-29 07:32Fix 'ghost' player in rosterMichael Camilleri1+2-1
2026-04-29 04:44Fix name broadcasting in share puzzlesMichael Camilleri6+70-15
2026-04-28 23:34Drop parent references from Move, Snapshot and Player recordsMichael Camilleri3+2-52
2026-04-28 23:24Show peer cursor in shared puzzlesMichael Camilleri15+718-15
2026-04-28 17:37Add more logging for shared gamesMichael Camilleri3+77-14
2026-04-28 09:05Add poll-based synchronisation when inside puzzleMichael Camilleri2+30-0
2026-04-28 05:52Treat italicised clues as related groupMichael Camilleri3+94-6
2026-04-28 05:11Add CloudKit shares to a queue on launchMichael Camilleri3+60-51
2026-04-28 03:46Fix handling of shared games from linksMichael Camilleri3+64-2
2026-04-28 03:44Tweak display of puzzles in GameListViewMichael Camilleri7+88-21
2026-04-28 02:49Fix puzzle timestamp updatingMichael Camilleri3+35-0
2026-04-28 02:35Avoid flash as iCloud link is checkedMichael Camilleri1+1-1
2026-04-28 02:25Use existing link in share sheetMichael Camilleri2+58-2
2026-04-28 02:14Tweak share sheetMichael Camilleri1+3-10
2026-04-28 01:17Replace share sheet with link creation sheetMichael Camilleri9+482-252
2026-04-28 00:11Fix share link creationMichael Camilleri3+111-31
2026-04-27 00:31Revert to previous share sheetMichael Camilleri5+23-157
2026-04-27 00:10Gate share buttonMichael Camilleri5+157-23
2026-04-26 23:47Switch share sheet to ShareLinkMichael Camilleri6+83-110
2026-04-26 12:44Improve display of share sheetMichael Camilleri1+13-3
2026-04-26 11:03Extract CloudService and ImportService from AppServicesMichael Camilleri7+161-119
2026-04-26 10:43Remove unnecessary lockMichael Camilleri6+18-49
2026-04-26 10:25Tighten up testsMichael Camilleri6+76-47
2026-04-26 05:03Add missing tests and fix colour cleanup on game deleteMichael Camilleri8+465-5
2026-04-26 02:29Use shorter identifiersMichael Camilleri4+14-14
2026-04-26 02:23Defer snapshot move pruning until upload succeedsMichael Camilleri6+226-13
2026-04-26 02:09Unify CKContainer instancesMichael Camilleri1+2-3
2026-04-26 01:55Share player names in multiplayerMichael Camilleri12+971-15
2026-04-24 19:12Add CKShare sharing via per-game zones and dual sync enginesMichael Camilleri20+1088-176
2026-04-24 09:08Make iCloud error recording asynchronousMichael Camilleri1+13-4
2026-04-24 08:01Add reset database button to SettingsMichael Camilleri2+19-20
2026-04-24 07:57Fix gaps in synchronisation logicMichael Camilleri2+16-0
2026-04-24 04:06Fix correctness issues in new data flowMichael Camilleri4+43-13
2026-04-24 03:46Improve snapshots creationMichael Camilleri9+224-29
2026-04-23 21:53Ensure that list previews are up to dateMichael Camilleri3+54-1
2026-04-23 21:35Adopt move-log architecture and CKSyncEngineMichael Camilleri21+1135-2444
2026-04-22 09:36Begin process of moving to snapshots and move logMichael Camilleri5+588-0
2026-04-22 09:19Improve throttle avoidanceMichael Camilleri6+222-17
2026-04-22 09:00Avoid data loss caused by pending updatesMichael Camilleri2+210-0
2026-04-21 23:11Support shaded cells in certain crosswordsMichael Camilleri1+64-2
2026-04-21 21:59Change version formatMichael Camilleri2+2-2
2026-04-21 21:48Use clue list to display long cluesMichael Camilleri4+94-1
2026-04-21 20:52Support relative relationships between cluesMichael Camilleri7+364-1
2026-04-21 19:25Provide feedback to user when puzzle is filled inMichael Camilleri2+94-0
2026-04-21 19:07Support direction toggle via the Clue BarMichael Camilleri1+4-0
2026-04-21 19:02Fix auto-advancingMichael Camilleri1+19-7
2026-04-17 20:26Tweak app iconMichael Camilleri2+0-0
2026-04-17 10:04Revert Clue Bar to having a dynamic heightMichael Camilleri1+0-5
2026-04-17 09:42Fix clue slidingMichael Camilleri1+23-23
2026-04-17 09:13Add padding above custom keyboardMichael Camilleri1+1-0
2026-04-17 08:32Add draft toggling to the keyboard overflowMichael Camilleri1+12-1
2026-04-17 08:26Display location in all capsMichael Camilleri1+1-0
2026-04-17 08:21Tweak change name alertMichael Camilleri1+4-0
2026-04-17 06:51Tidy up namingMichael Camilleri1+10-15
2026-04-17 06:32Rename UbiquityMonitor to DriveMonitorMichael Camilleri6+294-294
2026-04-17 05:52Inject sync services via environmentMichael Camilleri5+15-12
2026-04-17 03:24Improve separation of concerns in architectureMichael Camilleri10+265-180
2026-04-14 22:58Ensure Core Data changes are sent to iCloudMichael Camilleri6+221-19
2026-04-14 17:32Sync deletion of gamesMichael Camilleri4+181-24
2026-04-14 17:19Ensure game creation triggers iCloud syncMichael Camilleri2+31-9
2026-04-14 17:04Refactor to use @FetchRequestMichael Camilleri5+86-139
2026-04-14 16:00Support repairing of broken gamesMichael Camilleri1+52-0
2026-04-14 15:20Attempt to address missing entity IDMichael Camilleri1+26-5
2026-04-14 14:38Change gating logic for iCloud fetchesMichael Camilleri1+13-9
2026-04-14 14:03Add telemetry for iCloud debuggingMichael Camilleri1+26-2
2026-04-14 13:36Ensure zone ID is known before pushes and fetchesMichael Camilleri1+31-2
2026-04-14 11:59Remove Crossmate headingMichael Camilleri1+8-3
2026-04-14 10:04Clarify scope of XD file supportMichael Camilleri2+3-0
2026-04-14 09:52Improve support for importing XD puzzlesMichael Camilleri6+118-1
2026-04-14 09:42Improve robustness of puzzle selectionMichael Camilleri6+90-23
2026-04-14 05:06Add player menuMichael Camilleri3+87-4
2026-04-14 00:23Add submit button to calendar pickerMichael Camilleri2+49-4
2026-04-13 23:20Add date field to XD structMichael Camilleri6+34-24
2026-04-13 21:26Change colours used in clue bar and start squaresMichael Camilleri3+35-7
2026-04-13 09:51Add support for external puzzlesMichael Camilleri8+357-45
2026-04-12 23:39Ensure game records are saved before square recordsMichael Camilleri3+103-33
2026-04-12 21:39Expand instrumentation of sync logicMichael Camilleri2+87-6
2026-04-12 19:54Switch to different iCloud containerMichael Camilleri2+3-1
2026-04-12 19:42Add write probe as part of iCloud debugging supportMichael Camilleri1+42-0
2026-04-12 17:29Add even more iCloud debugging supportMichael Camilleri3+56-1
2026-04-12 17:09Add more iCloud debugging supportMichael Camilleri2+28-0
2026-04-12 15:36Add sync monitorMichael Camilleri7+346-15
2026-04-12 11:17Ensure placeholder file is added to iCloud DriveMichael Camilleri1+12-0
2026-04-12 08:13Set initial version to 1.0Michael Camilleri4+46-4
2026-04-12 07:52Add support for additional puzzle sourcesMichael Camilleri17+675-10
2026-04-12 02:09Settings and NYT authenticationMichael Camilleri9+740-0
2026-04-11 10:20Add puzzle catalogMichael Camilleri11+791-80
2026-04-11 10:14Add CloudKit-based sync engineMichael Camilleri23+2011-129
2026-04-09 21:22Add persistenceMichael Camilleri6+298-3
2026-04-09 21:06Add support for specialsMichael Camilleri4+51-16
2026-04-09 20:55Add initial prototypeMichael Camilleri19+2291-0
2026-04-08 22:53Initial commitMichael Camilleri1+10-0