Changelog
All notable changes to this project will be documented in this file.
[0.15.0] - 2026-05-15
Added
TakeManualActionOnPlayerAsync()now automatically attributes the acting player on the resulting action log. The SDK readsUserIdandUserNamefromGetTelemetryand sends them asactionByPlayerUserIdandactionByPlayerUsername. The username is hashed server-side before being stored.TakeManualActionOnPlayerAsync()accepts an optionaltimeoutSecondsparameter (default15). The value is applied to the underlyingUnityWebRequest.timeout. Pass0to disable the client-side timeout.ApiRequestOptions.TimeoutSecondsfor settingUnityWebRequest.timeouton any request routed throughSendApiRequest(default15).
Server-side changes affecting SDK callers
- The
/manual-action/playerendpoint is now rate-limited at 12 requests per minute per IP. Callers exceeding the limit will receive a429response. This pairs with the new 15-second client-side timeout to make the endpoint robust against unresponsive clients and aggressive retries. - Request payload fields on
/manual-action/playerare now bounded. Requests will be rejected with a400if any of the following are exceeded:playerUserId,playerUsername,productActionId,actionByPlayerUserId,actionByPlayerUsername: max 255 charactersdescription: max 2000 charactersdurationInMinutes: integer between 1 and 525,600 (1 year)numberOfStrikes: integer between 0 and 100
[0.14.1] - 2026-05-08
Fixed
- Opus encoding no longer freezes the Unity main thread.
OpusEncoder.Encodeis pure managed C# (Concentus runs at ~40-50% of native libopus speed) and was running synchronously on the main thread. Encoding now runs on a thread-pool worker and the coroutine polls for completion, so frame ticks continue while audio is being encoded.
Changed
- The
OpusEncoderinstance is now cached and reused across encodes instead of being constructed per recording window, removing the SILK/CELT state and resampler setup cost from every encode. - Encoder complexity reduced from the default
10to5per Xiph's mobile-VOIP recommendation. - Per-encode allocations (packet buffer, output stream, tail frame) are now reused.
- Microphone capture and Opus encoding both run at 16 kHz, eliminating the in-encoder resampler.
Removed
- The deprecated WAV upload path (
AudioClipToFile,WriteWavHeader, and the relatedAudioClipconstruction step) has been removed now that the Opus path is verified across Unity client implementations.
[0.14.0] - 2026-05-06
Added
Transcriptfield on the audio moderation responseHasSpeechfield on the audio moderation responseConfidencefield on the audio moderation response
[0.13.1] - 2026-05-01
Fixed
GetProductActionsAsync()andTakeManualActionOnPlayerAsync()no longer require the caller to be a dev player. Both methods can now be called by any client.
[0.13.0] - 2026-04-20
Changed
- Audio uploads now use Opus encoding - Audio is encoded with Opus and sent to a dedicated moderation endpoint instead of the legacy WAV path
- Microphone recording now runs at 48kHz where supported, falling back to the device default with a warning otherwise
- WAV upload path is retained but deprecated and will be removed once the Opus path is verified across multiple Unity client implementations
Internal
- Added
PlaySafeOpusEncoderand bundled theConcentus2.2.2 dependency underRuntime/Plugins
[0.12.0] - 2026-03-25
Added
- Manual player actions - Added
TakeManualActionOnPlayerAsync()method for applying moderation actions on players directly from the game - Forgive player - Added
ForgivePlayerAsync()method for forgiving players and optionally resetting their strikes - Get product actions - Added
GetProductActionsAsync()method for retrieving available moderation actions that can be taken against players
Internal
- Added explicit platform and source attribution to
AppealBanAsync(),ReportUserAsync(),UnReportUserAsync(), and audio moderation requests - System language is now passed as the language used for moderation
[0.11.4]- 2026-03-05
Internal
- Added additional
nullcheck when stopping a recording, preventsAudioClipisnullerrors when trying to send audios for processing.
[0.11.3]- 2026-03-05
Added
ViolationTypefield toActionItem
[0.11.2]- 2026-02-23
Added
ViolationTypefield toActionLog
Fixed
- Issue with
ViolationTypebeing passed in asActionValue - Actually returning the
ActionValue, which corresponds to the product action value asActionValue
[0.11.1]- 2026-02-03
Added
- Internal: Added ability to share audio clip length when sending audio for processing.
In future this should allow for flexible audio length processing
[0.11.0] - 2026-02-02
Added
- Added
Idfield toActionLogtype. - Added
ActionFriendlyNamefield toActionLogtype. - Added
TriggersStrikefield toActionLogtype. - Added
Triggerfield toActionLogtype. - Added
Descriptionfield toActionLogtype. - Added
Transcriptfield toActionLogtype. - Added
DelayInSecondsfield toActionLogtype. - Added
CreatedAtfield toActionLogtype. - Added
UpdatedAtfield toActionLogtype.
These are all usable when using GetPlayerStatusAsync()
[0.10.0] - 2025-11-07
Breaking changes
- Renamed
OnActionEventtoOnPolicyViolationEventto represent its functionality more accurately.
[0.9.0] - 2025-11-07
Added
- Setup custom auth - Added
SetupCustomAuth()method for setting up custom authentication with PlaySafe.
[0.8.0] - 2025-10-28
Added
- Playtest note functionality - Added
StartTakingNotesAsync()andStopTakingNotesAsync()methods for recording and transcribing user sessions during playtesting - UnReportUserAsync() method - Added ability to undo user reports with async functionality
- Asset support in Sensei Polls - Added
AssetUrlandAssetTypeproperties to active Sensei poll responses for image support
Changed
- ReportUserAsync() method - Fixed async reporting functionality that was previously returning null
- Recording behavior during playtest notes - Removed recording intermission when taking playtest notes to enable continuous recording
Fixed
- PlaySafeManagerResponse file format - Corrected invalid file format issues
- Syntax errors - Fixed syntax errors in PlaySafeManager
[0.6.0] - 2025-10-03
Added
-
Ban appeal functionality - Players can now appeal bans through the PlaySafe system
- New
AppealBanAsync()method for submitting ban appeals programmatically - Optional appeal reason parameter for providing context
- Returns
BanAppealResponsewith appeal status and details - Updated documentation with details on how to use this functionality
- New
-
Image support in Sensei Polls - Studios can now add images to sensei polls These are accessible via the sensei poll through the
AssetUrlandAssetType(defaultimage) attributes
[0.5.3] - 2025-09-23
Changed
- [Internal]
PhotonVoiceCreatedfunction has been renamed toSetupPhotonVoice- This change prevents photon initialization from happening automatically when
- If building using
Photonthe client will need to callSetupPhotonVoicein thePhotonVoiceCreatedevent handler in your game's Photon integration.
[0.5.2] - 2025-09-04
Fixed
- Username backwards compatibility by making the
Usernamefield optional inGetTelemetry()`
[0.5.1] - 2025-09-03
Added
- [Internal] Session pulse logic to send pulses that determine whether a client still has an active session
- The goal of this is to make session timing logic more accurate than the previous case where session time was incorrectly calculated
No changes needed at an integration level
- The goal of this is to make session timing logic more accurate than the previous case where session time was incorrectly calculated
Removed
- [Internal] manual start session logic
- [Internal] manual start session logic
No changes needed at an integration level
[0.5.0] - 2025-08-29
Added
- OnPlaySafeInitialized callback - New callback event triggered when PlaySafeManager is successfully initialized
- Allows developers to respond to initialization completion
- Demonstrated in updated
PlaySafeDemoIntegration.csandPlaySafeNormcoreDemoIntegration.cs
Changed
- SendTextForAnalysisCoroutine visibility - Method is now public, allowing direct text analysis calls from game clients
[0.4.2] - 2025-08-29
Changed
- SendTextForAnalysisCoroutine made public - Developers can now directly send text for moderation analysis
[0.4.1] - 2025-08-27
Added
- GetPlayerPollVotesAsync() method - New async method to retrieve a specific player's votes for a poll
- Returns
SenseiPlayerPollVotesResponsewith player's voting history - Includes vote details with timestamps and responses
- Returns
- Text moderation support - Added
SendTextForAnalysisCoroutine()for analyzing text content - Enhanced data structures - Added
SenseiPlayerPollVoteandSenseiPlayerPollVotesResponseclasses
Changed
- Improved response data structure - Refactored
SenseiPollCastVoteResponseValuetoSenseiPollVoteResponsefor consistency
[0.4.0] - 2025-08-18
Changed
- BREAKING: Session management simplified -
TryStartSession()andTryEndSession()methods no longer requireplayerUserIdparameter, automatically uses current player from telemetry - Username support in telemetry - Added
UserNamefield toAudioEventRequestDatafor better player identification in dashboard
Added
- Enhanced session management - Session requests now include both
playerUserIdandplayerUserNamefor improved tracking
Documentation
- Updated demo integration examples to show proper usage of new session management methods
- Added explanations for username field usage in telemetry data
[0.3.2] - 2025-08-15
Added
- Normcore integration support - Added PlaySafeNormcoreDemoIntegration.cs for Normcore networking framework
- Improved namespace organization - Wrapped PlaySafeManagerResponse with DL.PlaySafe namespace for better code organization
Fixed
- Compilation safety - Added compile-time checks for Normcore existence to prevent build errors
[0.3.1] - 2025-08-06
Fixed
- Unity 2021 support has been restored
Added
- Added Normcore demo integration file
- Updated Normcore integration docs
[0.3.0] - 2025-07-16
Changed
- BREAKING: GetPlayerStatusAsync() simplified - Method no longer requires
playerUserIdparameter, automatically uses current player from telemetry
Added
- Enhanced demo integration examples - Added comprehensive async function examples in PlaySafeDemoIntegration.cs
- Player status retrieval example with
GetPlayerStatusAsync() - Sensei poll management examples including
GetActivePollAsync(),CastVoteAsync(), andGetPollResultsAsync()
- Player status retrieval example with
Documentation
- Updated demo integration file with additional examples on how to use various async functions
- Added inline comments explaining async function consumption in game clients
[0.2.4] - 2025-07-15
Added
- Async player status endpoints
- UTC server time support
- Log level support for better debugging
- Focus checks only in build mode (improved development experience)
- Clearer logging messages for better debugging
Fixed
- Converted all Sensei IEnumerator functions to async tasks that are now consumable by your game client.
- Updated poll API endpoints and response structure
[0.2.3] - 2025-06-19
Added
- Enhanced player status async functionality
- Author name updated to "PlaySafe AI"
Performance Improvements
- Improved frame distribution for better performance
- Performance optimizations for package manifest updates
[0.2.2] - 2025-06-19
Performance Improvements
- Audio processing boost for better client side performance
[0.2.1] - 2025-06-19
Added
- Smart sampling feature - Intelligent sampling of audio
- This is integrated into the PlaySafe dashboard and allows you to monitor newer players & repeat offenders more than the larger player base
- Player user ID in AI config requests for better personalization
Fixed
- Editor spam when swapping recording
- Stop recording players when they are muted
[0.2.0] - 2025-06-19
Added
- Enhanced audio recording controls
Fixed
- Recording audio when muted - Players are now properly stopped from recording when muted
[0.1.9] - 2025-06-19
Added
- Console feedback when PlaySafe is running for better developer experience
[0.1.8] - 2025-06-19
Fixed
- Renamed PlaySafeDemoIntegration to match file name for consistency
[0.1.7] - 2025-06-19
Fixed
- Restored PlaySafe asmdef files that were accidentally removed
[0.1.6] - 2025-06-19
Added
- Threading safety improvements
Fixed
- PhotonPlaySafe functionality - Fixed critical issue where Photon integration was not working
- Removed buffer locks & permissions code that couldn't be called off main thread
- Added safety checks and removed coroutine safety temporarily
[0.1.5] - 2025-04-01
Added
- Audio silence threshold - Configurable threshold for audio detection
- Updated PlaySafe base URL for improved connectivity
[0.1.4] - 2025-03-26
Fixed
- Race conditions in session management - Fixed critical timing issues when starting sessions
[0.1.3] - 2025-03-26
Added
- Photon networking support - Full integration with Photon for multiplayer games
- Get player status endpoint - New API endpoint to retrieve player status
- Ban exploit protection - Fixed system ban time-based exploit
Security
- Enhanced ban system to prevent time-based exploits
[0.1.1] - 2025-03-19
Added
- Multilingual support - Added system language detection for Unity SDK
- Improved internationalization capabilities
Changed
- Updated Unity project structure
[0.1.0] - 2025-03-19
Added
- Initial PlaySafe Unity SDK release
- AI-powered moderation suite for video games
- Character intelligence capabilities
- Session management system
- Unity 2021.3 compatibility
- Complete documentation and licensing structure
Features
- Core AI moderation functionality
- Real-time content analysis
- Player behavior monitoring
- Seamless Unity integration
- Comprehensive API integration
Platform Support
- Unity 2021.3 and later
- Cross-platform compatibility