Skip to main content

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 reads UserId and UserName from GetTelemetry and sends them as actionByPlayerUserId and actionByPlayerUsername. The username is hashed server-side before being stored.
  • TakeManualActionOnPlayerAsync() accepts an optional timeoutSeconds parameter (default 15). The value is applied to the underlying UnityWebRequest.timeout. Pass 0 to disable the client-side timeout.
  • ApiRequestOptions.TimeoutSeconds for setting UnityWebRequest.timeout on any request routed through SendApiRequest (default 15).

Server-side changes affecting SDK callers

  • The /manual-action/player endpoint is now rate-limited at 12 requests per minute per IP. Callers exceeding the limit will receive a 429 response. 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/player are now bounded. Requests will be rejected with a 400 if any of the following are exceeded:
    • playerUserId, playerUsername, productActionId, actionByPlayerUserId, actionByPlayerUsername: max 255 characters
    • description: max 2000 characters
    • durationInMinutes: 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.Encode is 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 OpusEncoder instance 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 10 to 5 per 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 related AudioClip construction step) has been removed now that the Opus path is verified across Unity client implementations.

[0.14.0] - 2026-05-06

Added

  • Transcript field on the audio moderation response
  • HasSpeech field on the audio moderation response
  • Confidence field on the audio moderation response

[0.13.1] - 2026-05-01

Fixed

  • GetProductActionsAsync() and TakeManualActionOnPlayerAsync() 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 PlaySafeOpusEncoder and bundled the Concentus 2.2.2 dependency under Runtime/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 null check when stopping a recording, prevents AudioClip is null errors when trying to send audios for processing.

[0.11.3]- 2026-03-05

Added

  • ViolationType field to ActionItem

[0.11.2]- 2026-02-23

Added

  • ViolationType field to ActionLog

Fixed

  • Issue with ViolationType being passed in as ActionValue
  • Actually returning the ActionValue, which corresponds to the product action value as ActionValue

[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 Id field to ActionLog type.
  • Added ActionFriendlyName field to ActionLog type.
  • Added TriggersStrike field to ActionLog type.
  • Added Trigger field to ActionLog type.
  • Added Description field to ActionLog type.
  • Added Transcript field to ActionLog type.
  • Added DelayInSeconds field to ActionLog type.
  • Added CreatedAt field to ActionLog type.
  • Added UpdatedAt field to ActionLog type.

These are all usable when using GetPlayerStatusAsync()

[0.10.0] - 2025-11-07

Breaking changes

  • Renamed OnActionEvent to OnPolicyViolationEvent to 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() and StopTakingNotesAsync() 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 AssetUrl and AssetType properties 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 BanAppealResponse with appeal status and details
    • Updated documentation with details on how to use this functionality
  • Image support in Sensei Polls - Studios can now add images to sensei polls These are accessible via the sensei poll through the AssetUrl and AssetType (default image) attributes

[0.5.3] - 2025-09-23

Changed

  • [Internal] PhotonVoiceCreated function has been renamed to SetupPhotonVoice
    • This change prevents photon initialization from happening automatically when
    • If building using Photon the client will need to call SetupPhotonVoice in the PhotonVoiceCreated event handler in your game's Photon integration.

[0.5.2] - 2025-09-04

Fixed

  • Username backwards compatibility by making the Username field optional in GetTelemetry() `

[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

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.cs and PlaySafeNormcoreDemoIntegration.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 SenseiPlayerPollVotesResponse with player's voting history
    • Includes vote details with timestamps and responses
  • Text moderation support - Added SendTextForAnalysisCoroutine() for analyzing text content
  • Enhanced data structures - Added SenseiPlayerPollVote and SenseiPlayerPollVotesResponse classes

Changed

  • Improved response data structure - Refactored SenseiPollCastVoteResponseValue to SenseiPollVoteResponse for consistency

[0.4.0] - 2025-08-18

Changed

  • BREAKING: Session management simplified - TryStartSession() and TryEndSession() methods no longer require playerUserId parameter, automatically uses current player from telemetry
  • Username support in telemetry - Added UserName field to AudioEventRequestData for better player identification in dashboard

Added

  • Enhanced session management - Session requests now include both playerUserId and playerUserName for 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 playerUserId parameter, 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(), and GetPollResultsAsync()

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