KinesisStream

Game telemetry and analytics with Amazon Kinesis Data Streams and Amazon Data Firehose from Blueprints and C++: buffered event tracking with an offline spool, batched pu…

Malware-scannedSigned licence keyInstant downloadUpdates included
KinesisStream β€” screenshot 1
KinesisStream β€” screenshot 2
KinesisStream β€” screenshot 3
KinesisStream β€” screenshot 4
KinesisStream β€” screenshot 5
KinesisStream β€” screenshot 6
KinesisStream β€” screenshot 7
KinesisStream β€” screenshot 8
KinesisStream β€” screenshot 9
KinesisStream β€” screenshot 10
KinesisStream β€” screenshot 11
KinesisStream β€” screenshot 12
KinesisStream β€” screenshot 13
KinesisStream β€” screenshot 14
KinesisStream β€” screenshot 15
KinesisStream β€” screenshot 16
KinesisStream β€” screenshot 17
KinesisStream β€” screenshot 18
1 / 18
KinesisStream Telemetry component: Track Event, standard fields, newline-delimited…
Offline spool on disk (size cap, replay on next start or when the network is back)
Per-session sampling, persisted Opt Out / Opt In, global properties, session start /…
Kinesis Data Streams: Put Record, Put Records with retry of only the failed entries,…
KinesisStream Consumer component: polling consumer, all shards or one, reshard…
Amazon Data Firehose: Put Firehose Record, Put Firehose Record Batch with…
$79.99

KinesisStream sends what happens in your game to AWS in real time and reads it back. Add the KinesisStream Telemetry component, call Track Event with a name, text properties and numbers, and every event becomes one JSON line with an event id, UTC timestamp, session, player, build, platform, map and sequence number. Events are buffered and sent in batches to an Amazon Data Firehose stream (straight into S3 for Athena and your data lake, or to an HTTP endpoint) or to a Kinesis data stream for real-time processing.

The component is built for real players: when the device is offline the queue moves to a size-capped spool on disk and is replayed later, rejected records are retried without resending the accepted ones, sampling is decided per session so sampled sessions stay complete, and Opt Out / Opt In respects the player's privacy choice across restarts. Global properties, session start / end events and statistics are included.

For servers, tools and live-ops dashboards, the KinesisStream Consumer component polls one shard or every shard of a stream on a background thread, follows reshards, renews expired iterators and saves a checkpoint per shard so it resumes where it stopped. Latent nodes cover Put Record, Put Records (500 records / 5 MB per request), shard iterators, Get Records, List Shards, stream summaries, Firehose puts and batches, and administration: creating, resizing and deleting streams, retention, waiting for a stream to become active and creating Firehose streams to S3 or HTTP endpoints.

Players get credentials from an Amazon Cognito identity pool: as guests, or signed in with a token from a Cognito user pool, Google, Apple, Facebook or any OpenID provider through Set Login Token. Static keys and the default AWS credential chain are available for development, dedicated servers and tools. Requests run on background worker threads with automatic retries, so the game thread never blocks, and every result arrives back on the game thread.

KinesisStream is part of the Alpha XP AWS collection for Unreal Engine 4.27 and 5.8. It includes the AWS SDK for C++ prebuilt for Win64, Linux and Android and ships with styled HTML documentation.

66Blueprint nodes
8Events
16Project settings
2Engine builds

Key features

  • KinesisStream Telemetry component: Track Event, standard fields, newline-delimited
  • Offline spool on disk (size cap, replay on next start or when the network is back)
  • Per-session sampling, persisted Opt Out / Opt In, global properties, session start /
  • Kinesis Data Streams: Put Record, Put Records with retry of only the failed entries,
  • KinesisStream Consumer component: polling consumer, all shards or one, reshard
  • Amazon Data Firehose: Put Firehose Record, Put Firehose Record Batch with
  • Administration: Create / Delete Stream (on-demand or provisioned), retention, Update
  • Helpers: partition-key hashing and shard lookup, record builders, UTF-8 conversion,
  • Amazon Cognito identity pools, static keys or the default AWS credential chain
  • 88 Blueprint nodes, cancellable latent nodes, C++ API with native callbacks

Blueprint & C++ API

The API is organised into these entry points:

ClassTypeNodesUse it for
KinesisStreamLibraryFunction library30Configuration, identity, record, event and JSON helpers for KinesisStream.
KinesisStreamTelemetryComponentActor component22The analytics emitter: Track Event builds a newline-delimited JSON line with standard fields (event id, UTC timestamp, session, player, build, platform, map, se…
KinesisStreamConsumerComponentActor component12Reads a Kinesis data stream by polling Get Records on a background thread (plain HTTPS - works on every platform).
Async action nodesLatent Blueprint nodes2Latent node with success / failure output pins.

Callable runs when executed Β· Pure no exec pin, returns a value Β· LatentAsync finishes later and fires its outputs

KinesisStream 2
NodeTypeAvailable onDescription
CancelAsyncAsyncStops waiting for this request: none of its output pins fire any more. The request itself may still complete on AWS.
Is FinishedAsyncAsyncTrue after Cancel was called or the node finished.
Consumer 12
NodeTypeAvailable onDescription
Start Consumer(Stream Override: String)CallableComponentStarts polling in the background.
Stop ConsumerCallableComponentStops polling and saves the checkpoints. A poll in flight finishes in the background; its records are still delivered.
Is Running() β†’ BooleanPureComponentTrue from Start Consumer until Stop Consumer.
Get Lag() β†’ Integer64PureComponentHow far behind the newest record the slowest shard is, in milliseconds (0 = caught up).
Get Shard Lag(In Shard Id: String) β†’ Integer64PureComponentLag of one shard in milliseconds; -1 when the shard is not tracked.
Get Checkpoint(In Shard Id: String) β†’ StringPureComponentThe checkpoint (sequence number of the last processed record) of a shard; empty when none.
Set Checkpoint(In Shard Id: String, Sequence Number: String)CallableComponentSets a shard's checkpoint, for example after you processed a page with Auto Checkpoint off. Saved with the next save.
Save Checkpoints() β†’ BooleanCallableComponentWrites the checkpoints to disk now. Returns false when the file could not be written.
Reset CheckpointsCallableComponentForgets every checkpoint (memory and file): the next start uses Starting Position again.
Get Shard States() β†’ Array of Kinesis Stream Shard StatePureComponentEvery tracked shard with its checkpoint, lag, record count and finished flag.
Get Stats() β†’ Kinesis Stream Consumer StatsPureComponentCounters since Start Consumer: records, polls, empty polls, errors, iterator renewals, shards, lag, uptime, last error.
Set Poll Interval(Seconds: Float)CallableComponentChanges the seconds between polls at runtime (0.2 - 60).
Config 4
NodeTypeAvailable onDescription
Set Region(Region: String)CallableStaticSwitches the AWS region used by every following request.
Set Credential Mode(Mode: Kinesis Stream Credential Mode)CallableStaticOverrides the credential mode from the project settings at runtime.
Is Configured() β†’ Boolean, ProblemPureStaticChecks the settings and returns false with a reason when requests cannot work yet.
Set Default Streams(Stream Name: String, Delivery Stream Name: String)CallableStaticRuntime override of the default data stream and Firehose stream (empty keeps the project setting).
Identity 5
NodeTypeAvailable onDescription
Set Login Token(Provider: String, Token: String)CallableStaticSigns the player in to the Cognito identity pool with a token from an identity provider.
Clear Login TokensCallableStaticForgets all login tokens and the cached identity (the player becomes a guest again).
Set Static Credentials(Access Key Id: String, Secret Access Key: String, Session Token: String)CallableStaticUses these credentials from now on (Static Keys mode), for example temporary keys handed out by your own backend.
Get Identity Id() β†’ StringPureStaticThe Cognito identity id of this player, empty until credentials were resolved once.
Make User Pool Provider Name(Region: String, User Pool Id: String) β†’ StringPureStaticBuilds the identity-pool login key of a Cognito user pool: cognito-idp.<region>.amazonaws.com/<user pool id>.
Records 11
NodeTypeAvailable onDescription
Make Record Entry(Data: String, Partition Key: String, Explicit Hash Key: String) β†’ Kinesis Stream Record EntryPureStaticBuilds a text record for Put Record(s). Empty Partition Key = a random one.
Make Record Entry From Bytes(Bytes: Array of Byte, Partition Key: String, Explicit Hash Key: String) β†’ Kinesis Stream Record EntryPureStaticBuilds a binary record for Put Record(s). Empty Partition Key = a random one.
String To UTF-8 Bytes(Text: String) β†’ Array of BytePureStaticEncodes text as UTF-8 bytes.
UTF-8 Bytes To String(Bytes: Array of Byte) β†’ StringPureStaticDecodes UTF-8 bytes to text.
Hash Partition Key(Partition Key: String) β†’ StringPureStaticThe 128-bit hash key (decimal) Kinesis computes for a partition key: the MD5 of its UTF-8 bytes read as an unsigned big-endian integer.
Get Shard For Partition Key(Partition Key: String, Shards: Array of Kinesis Stream Shard, Explicit Hash Key: String) β†’ Boolean, Shard IdPureStaticFinds the shard a record goes to (an open shard whose hash key range contains the key). Explicit Hash Key wins over the partition key when set.
Make Random Partition Key() β†’ StringCallableStaticA new random partition key (GUID): spreads records evenly over all shards.
Split JSON Lines(Text: String) β†’ Array of StringPureStaticSplits newline-delimited JSON (one record from Firehose / the telemetry component) into lines; empty lines are skipped.
Make Stream Arn(Account Id: String, Stream Name: String, Region: String) β†’ StringPureStaticarn:aws:kinesis:<region>:<account>:stream/<name>. Empty Region = the configured region.
Get Name From Arn(Arn: String) β†’ StringPureStaticThe resource name at the end of a Kinesis or Firehose ARN ("stream/telemetry" -> "telemetry"); other text is returned unchanged.
Is Retryable Error Code(Error Code: String) β†’ BooleanPureStaticTrue for error codes worth sending again later (throttling, internal failures, network errors).
Events 7
NodeTypeAvailable onDescription
Make Event(Name: String, Properties: Map String β†’ String, Values: Map String β†’ Float) β†’ Kinesis Stream EventPureStaticBuilds an analytics event for Track Prepared Event or Event To JSON Line.
Make Properties(Keys: Array of String, Values: Array of String) β†’ Kinesis Stream PropertiesPureStaticBuilds a property map from two parallel arrays (keys[i] -> values[i]); extra keys get empty values.
Add Event Property(Event: Kinesis Stream Event, Key: String, Value: String) β†’ Kinesis Stream EventPureStaticReturns the event with one more text property.
Add Event Value(Event: Kinesis Stream Event, Key: String, Value: Float) β†’ Kinesis Stream EventPureStaticReturns the event with one more numeric value.
Event To JSON Line(Event: Kinesis Stream Event, Append Newline: Boolean) β†’ StringPureStaticSerializes an event to one JSON line: {"event","event_id","ts","props","values"} (no standard context fields - the telemetry component adds session, player, bui…
Parse Event Line(Line: String) β†’ Boolean, Event, Standard FieldsPureStaticParses a JSON line written by Event To JSON Line or the telemetry component (for consumers and tools).
Make ISO 8601 Timestamp(Time: Date Time) β†’ StringPureStaticISO-8601 UTC text with milliseconds, for example 2026-10-28T14:03:07.123Z (the "ts" format of event lines).
JSON 3
NodeTypeAvailable onDescription
Struct To JSON(Struct: Integer) β†’ Boolean, JsonCallableStaticConverts any struct to a JSON object string (property names are used as keys).
JSON To Struct(Json: String) β†’ Boolean, Out StructCallableStaticFills a struct from a JSON object string; fields that are missing keep their default values.
Get Json Field(Json: String, Path: String) β†’ Boolean, ValuePureStaticReads one value from a JSON document with a path such as "props.level" or "items[2].id".
Telemetry 11
NodeTypeAvailable onDescription
Track Event(Event Name: String, Properties: Map String β†’ String, Values: Map String β†’ Float) β†’ BooleanCallableComponentTracks one event with text properties and numeric values. Returns false when opted out, the session is not sampled or the event is too large for one record.
Track Prepared Event(Event: Kinesis Stream Event) β†’ BooleanCallableComponentTracks an event built with Make Event (keeps its timestamp and event id when set).
Flush Now() β†’ BooleanCallableComponentSends the queued events now. False when nothing is queued, a flush is already running or telemetry is opted out.
Get Queue Size() β†’ IntegerPureComponentEvents waiting in the memory queue (not counting a flush in flight or the spool).
Get Dropped Count() β†’ IntegerPureComponentEvents dropped since BeginPlay (queue and spool full, too large, or permanently rejected).
Set Global Property(Key: String, Value: String)CallableComponentAdds a property to every following event (for example "region" or "ab_group").
Remove Global Property(Key: String) β†’ BooleanCallableComponentRemoves a global property. Returns false when it was not set.
Clear Global PropertiesCallableComponentRemoves every global property.
Get Global Properties() β†’ Map String β†’ StringPureComponentThe global properties added to every event.
Get Stats() β†’ Kinesis Stream Telemetry StatsPureComponentCounters since BeginPlay: tracked, sampled out, sent, failed, dropped, spooled, replayed, flushes, queue bytes.
Set Destination(New Destination: Kinesis Stream Destination, New Stream Name: String)CallableComponentSwitches the destination at runtime (queued events go to the new one). Empty Stream Name = the default from the settings.
Session 5
NodeTypeAvailable onDescription
Start Session(Properties: Map String β†’ String) β†’ StringCallableComponentStarts a new session (ends the current one first): new session id, sequence back to 0, sampling decided. Returns the session id.
End SessionCallableComponentEnds the session (session_end event) and flushes.
Get Session Id() β†’ StringPureComponentThe current session id, empty when no session runs.
Set Player Id(New Player Id: String)CallableComponentSets the player id of the following events, for example after login.
Set Sampling Rate(Rate: Float)CallableComponentChanges the sampling rate (0 - 1); applies from the next session.
Privacy 3
NodeTypeAvailable onDescription
Opt Out(Delete Spool: Boolean)CallableComponentThe player does not want analytics: clears the queue, stops tracking and (optionally) deletes the spool. Persisted when Persist Opt Out is on.
Opt InCallableComponentTracking is allowed again (removes the persisted opt-out).
Is Opted Out() β†’ BooleanPureComponentTrue while the player opted out.
Spool 3
NodeTypeAvailable onDescription
Replay Spool() β†’ IntegerCallableComponentLoads spooled events into the queue now (as far as the queue has room) and deletes the loaded files. Returns how many were loaded.
Get Spool Size() β†’ IntegerPureComponentBytes in the spool folder.
Clear Spool() β†’ IntegerCallableComponentDeletes every spool file. Returns how many files were deleted.

Events & delegates

Bind these in Blueprint (drag off the object β†’ Bind Event) or with AddDynamic in C++.

EventParametersFires onWhen it fires
On SuccessResult (Kinesis Stream Put Result), Error (Kinesis Stream Error)KinesisStreamPutRecordAction
On FailureResult (Kinesis Stream Put Result), Error (Kinesis Stream Error)KinesisStreamPutRecordAction
On RecordsRecords (Array of Kinesis Stream Record), Shard Id (String), Millis Behind Latest (Integer64)KinesisStreamConsumerComponentA page of records from one shard (in sequence order).
On Shard FinishedShard Id (String)KinesisStreamConsumerComponentA shard was closed by a reshard and has been read completely.
On Consumer ErrorError (Kinesis Stream Error)KinesisStreamConsumerComponentA poll failed. Retryable errors are retried with back-off; others also stop the consumer (On Consumer Stopped follows).
On Consumer Stoppedβ€”KinesisStreamConsumerComponentThe consumer stopped (Stop Consumer, a permanent error or end of play).
On FlushedSent Count (Integer), Failed Count (Integer)KinesisStreamTelemetryComponentA batch reached the stream: accepted and permanently rejected counts.
On FailedError (Kinesis Stream Error), Lost Count (Integer)KinesisStreamTelemetryComponentA flush failed or records were lost (Lost Count = records dropped for good; retryable ones are re-queued or spooled).

Project settings

Configure once under Project Settings β€Ί Plugins β€Ί KinesisStream β€” values are saved to the project's config .ini, so they travel with the project and your build.

SettingSectionTypeWhat it does
RegionConnectionStringAWS region of your streams, delivery streams and identity pool, for example "us-east-1" or "eu-west-1".
Credential ModeCredentialsCredential ModeWhere request credentials come from.
Identity Pool IdCredentialsStringCognito identity pool, for example "us-east-1:01234567-89ab-cdef-0123-456789abcdef".
Allow Guest AccessCredentialsBooleanAllow unauthenticated (guest) identities before Set Login Token is called. The pool must allow guest access too.
Access Key IdCredentialsStringAccess key for Static Keys mode. Keys saved here end up in DefaultGame.ini - use them for development and servers only.
Secret Access KeyCredentialsStringSecret key for Static Keys mode.
Allow Static Keys In ShippingCredentialsBooleanStatic keys are refused in Shipping builds unless this is enabled (for example on a dedicated server).
Endpoint OverrideConnectionStringCustom endpoint, for example a local emulator such as "http://localhost:4566". Empty = the regional AWS endpoint.
Request Timeout MsConnectionIntegerTotal time a request may take, in milliseconds.
Connect Timeout MsConnectionIntegerTime allowed to open the connection, in milliseconds.
Max RetriesConnectionIntegerAutomatic retries with exponential back-off for throttled and transient failures (whole requests).
Worker ThreadsConnectionIntegerWorker threads that run requests in the background (requests never block the game thread).
Verify SSLConnectionBooleanVerify TLS certificates. Only disable for a local emulator.
Log Sdk WarningsConnectionBooleanForward SDK warnings and errors to the Output Log (LogKinesisStream).
Default Stream NameStreamsStringKinesis data stream (name or ARN) used when a node or component leaves Stream Name empty, for example "mygame-telemetry".
Default Delivery Stream NameStreamsStringFirehose stream used when a node or component leaves Delivery Stream Name empty, for example "mygame-events-to-s3".

Options & enums

EnumValues
Credential ModeCognito Identity Pool Static Keys Default Credential Chain
Iterator TypeTrim Horizon (oldest) Latest (new records only) At Timestamp At Sequence Number After Sequence Number
Capacity ModeOn-Demand Provisioned
Shard FilterAll Shards Open Shards (At Latest) At Trim Horizon From Trim Horizon After Shard Id At Timestamp From Timestamp
DestinationKinesis Data Stream Data Firehose
Partition ModeSession Id Player Id Event Name Random
CompressionUncompressed GZIP ZIP Snappy Hadoop Snappy

Compatibility

UE 4.27KinesisStream 4.27.zipUE 5.8KinesisStream 5.8.zip

One ready-made build per engine version is included in the download β€” copy the one that matches your project.

PlatformSupported in
WindowsEditor & packaged
LinuxEditor & packaged
AndroidPackaged builds
ModuleTypeLoading phase
KinesisStreamRuntimeDefault

Technical details

Code modulesKinesisStream (Runtime), KinesisStreamSdk (External, Source/ThirdParty - prebuilt AWS SDK for C++)
Blueprints0 Β· C++ classes: 27
Network replicatedNo
Development platformsWindows: Yes, Mac: No, Linux: Yes
Target build platformsWin64, Linux, Android
Third-party softwareYes - AWS SDK for C++ 1.11.916 (Apache-2.0), with the AWS Common Runtime libraries, in Source/ThirdParty/KinesisStreamSdk
Engine versionsUnreal Engine 4.27 Β· 5.8 β€” a build for each is included
C++ classes27 + 22 structs
Blueprint nodes66
Events8
DocumentationDocumentation.html (in the download)
DownloadKinesisStream.zip Β· 37.8 MB
Versionv1.0.0

What's in the download

FileWhat it is
KinesisStream 4.27.zipPlugin build for Unreal Engine 4.27
KinesisStream 5.8.zipPlugin build for Unreal Engine 5.8
Documentation.htmlDocumentation (open in a browser)

Quick start

  1. Unzip the download and pick the build that matches your engine (4.27 Β· 5.8).
  2. Copy the KinesisStream folder into your project's Plugins/ folder (create it if needed).
  3. Open the project, enable KinesisStream under Edit β€Ί Plugins and restart the editor.
  4. Fill in Project Settings β€Ί Plugins β€Ί KinesisStream.
  5. Right-click in any Blueprint graph and search KinesisStream β€” or include the public headers from C++.
  6. Package for your target platform (Windows, Linux, Android).

Good to know

Built for Unreal Engine 4.27 and 5.8. Requires an AWS account; Kinesis Data Streams, Data Firehose, S3 and Cognito usage is billed by AWS. Game clients only need kinesis:PutRecord(s) / firehose:PutRecord(Batch) on their streams; stream and delivery-stream management nodes need admin IAM permissions and are meant for tools and servers. The consumer polls with Get Records; enhanced fan-out (SubscribeToShard, HTTP/2) is not used so it works on every platform. On Linux and Android the SDK uses the engine's libcurl and OpenSSL and the engine's certificate store. On Win64 the SDK is one DLL with a plugin-specific name, so KinesisStream can be installed next to other AWS-based plugins. Never ship long-term access keys in a game client: use a Cognito identity pool for players. Developed and maintained by Alpha XP.

Everything included

  • KinesisStream Telemetry component: Track Event, standard fields, newline-delimited…
  • Offline spool on disk (size cap, replay on next start or when the network is back)
  • Per-session sampling, persisted Opt Out / Opt In, global properties, session start /…
  • Kinesis Data Streams: Put Record, Put Records with retry of only the failed entries,…
  • KinesisStream Consumer component: polling consumer, all shards or one, reshard…
  • Amazon Data Firehose: Put Firehose Record, Put Firehose Record Batch with…
  • Administration: Create / Delete Stream (on-demand or provisioned), retention, Update…
  • Helpers: partition-key hashing and shard lookup, record builders, UTF-8 conversion,…
  • Amazon Cognito identity pools, static keys or the default AWS credential chain
  • 88 Blueprint nodes, cancellable latent nodes, C++ API with native callbacks

Platforms

WindowsLinuxAndroid

Requirements

  • Unreal Engine 4.27 and 5.8
  • Develop on Windows (Win64)
  • Blueprints and C++

In the download

FileKinesisStream.zip
FormatZIP
Size37.8 MB
Versionv1.0.0
Licence fileIncluded in the archive
SHA-256fa211f21497fdc6b…

Personal

$79.99

One non-commercial project

  • 1 activation seat
  • 1 year of updates
  • One end product
  • Non-commercial use
  • Community support
  • 14-day refund window
Read the Personal terms
β˜… Most popular

Commercial

$239.99

Ship paid products

  • 5 activation seats
  • 1 year of updates
  • One paid end product
  • Unlimited end users
  • Priority support
  • Source files
  • 14-day refund window
Read the Commercial terms

Extended

$756.00

Resell & white-label

  • Unlimited activation seats
  • Lifetime updates
  • Unlimited end products
  • White-label & resell
  • 1-hour SLA
  • Seat-free team use
  • 14-day refund window
Read the Extended terms

One purchase per product, no subscription. Each licence comes with a signed key β€” 1 seat on Personal, 5 seats on Commercial, unlimited seats on Extended. Paid licences can be refunded within 14 days from your order page.

  1. v1.0.0Latest
    • Unreal Engine 4.27 and 5.8
    • Blueprint and C++ API, HTML documentation
β€”
β˜…β˜…β˜…β˜…β˜…
No reviews yet
5β˜…0%
4β˜…0%
3β˜…0%
2β˜…0%
1β˜…0%

Be the first to review KinesisStream β€” reviews come from customers who bought it, so every one is a verified purchase.

Reviews are for customers who bought KinesisStream.
Email supportsupport@alphaxp.net β€” include your order reference.
What support coversInstallation help, download or activation problems, and questions about documented behaviour, for your licence term.
Keys & downloadsLost a key or a download link? Everything you bought is in My library.
Refunds & terms14-day refunds from your order page. Refund policy Β· Personal terms Β· Commercial terms Β· Extended terms

Frequently asked

How do I get the files after paying?

Straight after checkout you land on your order page with the download button and your licence key. A receipt is emailed to you, and every order stays in My library.

Which licence do I need?

Personal β€” One non-commercial project. Commercial β€” Ship paid products. Extended β€” Resell & white-label. The Licences tab compares them side by side.

On how many devices can I activate it?

1 seat on Personal, 5 seats on Commercial, unlimited seats on Extended.

How long do I get updates?

Personal: 1 year of updates, Commercial: 1 year of updates, Extended: lifetime updates, counted from your purchase.

Can I get a refund?

Yes β€” paid licences can be refunded within 14 days, straight from your order page.

Is the download safe?

The file was scanned with ClamAV when it was published. Its SHA-256 checksum is listed under Features β†’ In the download, so you can verify the file you receive.

Do I need an account?

No. Checkout only needs your email. Signing in keeps all your purchases, keys and downloads together in My library.

More like this

From the same studio
$79.99Personal licence Β· KinesisStream
✦ Why TechHarbour

Software you own, from the people who built it.

117 products, one studio. Each ships with a signed licence key, an instant download and 14-day refunds β€” and every file is malware-scanned before it goes on sale.