Release notes
Changelog
Every version of Owl, from the first fork of Knit to the current stable release v1.1.2, shipped August 3, 2026.
v1.1.2
LatestService Proxy & Player Token Fixes
- FixedClient Service Proxy - resolved argument shifting when calling methods with colon syntax (`:`) by filtering implicit `self` injection before network dispatch.
- FixedClient Service Proxy - fixed RemoteFunction binding by correctly routing `Owl_RF` folders to `ClientComm:GetFunction` instead of `GetProperty`.
- FixedPlayer Tokens - eliminated race condition causing `GetPlrToken` to randomly return `nil` on early client requests by adding lazy on-demand token generation.
v1.0.4
First release
- AddedOwlAction declarative, priority-based input binding on top of ContextActionService with ActionMaps and Extensions.
- AddedOwl.SpawnPlr(plr) for manual character loading when Players.CharacterAutoLoads is disabled.
- AddedOwl.OnStart() resolves immediately if already started, otherwise the next time Owl.Start() resolves.
- ChangedOwl.Config is now frozen (table.freeze) the instant Owl.Start() resolves, instead of staying mutable for the whole session.
- FixedA rare race condition where a Service's parallel OwlStart could run before a sibling's OwlInit had fully released the thread.
v0.8.0
OwlData rewrite
- AddedOwlData the new persistence subsystem with a modular adapter architecture (ProfileStoreAdapter, DataStoreAdapter).
- AddedAutomatic backend fallback: if the configured adapter's library is missing, OwlData switches to the other one instead of crashing.
- Addedprofile:Observe(key, fn) with wildcard ("*") support for reacting to any key change.
- Changedprofile:Save() now returns a Promise instead of firing a callback, for consistency with the rest of the framework's async API.
- FixedA session lock could remain held for up to 60 seconds if a player rejoined a new server faster than the old one finished releasing it.
- RemovedThe old DataService boilerplate pattern from pre-0.9 example projects superseded entirely by OwlData.Load/Get/Await.
v0.5.0
Components 2.0
- AddedComponent Extensions reusable Constructing/Constructed/Starting/Started/Stopping/Stopped hooks, shareable across Component types.
- AddedExplicit Type field ("Server" | "Client" | "Shared") on every Component, enforced at :Watch() time.
- AddedComponent:WaitFor(instance, timeout?) Promise-based, instead of manually polling :Get() in a loop.
- ChangedComponent:Get() and :GetAll() now warn and return nil/{} when called from a context the Component's Type doesn't allow, instead of silently returning stale data.
- FixedA Component's Trove wasn't always destroyed before Destroy() ran on rapid tag removal, occasionally leaking connections.
- RemovedComponent:Init() renamed to Component:Construct() to avoid confusion with Owl's own OwlInit lifecycle phase.
v0.4.0
Security hardening
- AddedOwl.Util.RateLimiter sliding-window rate limiting with perPlayer/global/strict shortcuts and opt-in progressive penalties.
- AddedOwl.Util.TypeChecker schema-based argument and return-value validation, usable as middleware or standalone via .validate/.compile.
- AddedOwl.GetPlrToken(plr) to confirm a Player argument genuinely matches the caller of the current remote invocation.
- ChangedMiddleware now cascades explicitly: Global, then per-Service, then per-remote previously the order between Global and Service-level was unspecified.
v0.2.0
Communication rewrite
- AddedOwl.CreateSignal() and Owl.CreateProperty() declarative markers replacing manual RemoteEvent/RemoteFunction instance management.
- AddedProperty targeting: SetFor, SetForList, SetFilter, ClearFor, ClearFilter for per-player and per-group state.
- ChangedEvery Service.Client entry is now automatically hashed (Owl.HashName) before being turned into a remote, reducing replicated instance-name footprint.
v0.1.0
Dependency graph
- AddedTopological sort for OwlInit a Service's declared Dependencies now guarantee initialization order, computed automatically.
- AddedExplicit error messages for unresolved or circular dependencies at startup, instead of a silent hang.
- FixedServices occasionally finished OwlInit out of order under load, causing intermittent nil references in Services that depended on each other.
v0.0.5
Initial fork from Knit
- AddedCore Services/Controllers pattern, forked and modernized from Knit.
- AddedOwlInit / OwlStart / OwlDestroy lifecycle and the first automatic hooks: OwlOnPlayerAdded, OwlOnPlayerRemoving.
- AddedOwl.AddServices / Owl.AddControllers for folder-based module loading.