- Visual DataStore Management - Browse and edit DataStores with a clean GUI
- Multiple DataStore Types - Support for Normal, Ordered, and Global DataStores
- Key Browsing - List, search, and filter keys with pagination
- Full CRUD Operations - Create, read, update, and delete keys
- Version History - Browse historical versions of keys
- Undo/Redo - 64-action undo/redo stack
- Multiple View Modes - Tree view and Code view for data editing
- Connection History - Quick access to recent DataStore connections with pinning
- Theme Support - Studio, Dark, and Light themes with accent colors
- Settings Persistence - Your preferences are saved between sessions
-
π Search Bar in Key Editor - Search within your data with multiple modes:
- All - Search both keys and values
- Content - Match content directly (searches serialized form)
- Keys - Search only key names
- Values - Search only values
- Type - Search by data type (string, number, boolean, array, object, null, buffer)
.*Regex toggle - Independent toggle that enables Lua pattern matching in any mode- π΅οΈ Field History Scanner - Track when a specific field in a player's data changed over time. Type a field path (e.g.
coinsorinventory.sword) into the search bar at the top of the version history panel, and it scans through every saved version to find exactly where that value changed β showing before and after for each change, with a button to open a full diff. Loads additional pages on demand via a "Scan more" button.
-
πͺ Hook System - Compression/decompression hooks for DataStore values:
- JSON String detection and decoding
- Base64 buffer handling
- Compressed data markers (LZ4/ZLIB)
- MessagePack format detection
- ProfileService data format
- Custom hooks - Register your own compression/serialization hooks
- Vide - Reactive UI library for clean, declarative components
- Functional Programming - Pure functions, immutable state, composition
https://create.roblox.com/store/asset/87717019449403/DataScope
[dependencies]
DataScope = "pyseph/datascope@1.3.0"- Clone this repository
- Run
wally installto get dependencies - Use Rojo to sync or build the plugin
src/
βββ main.server.luau # Plugin entry point
βββ core/
β βββ Types.luau # Type definitions
β βββ Store.luau # Reactive state management
βββ datastore/
β βββ Operations.luau # DataStore operations
βββ hooks/
β βββ HookManager.luau # Hook registration and execution
β βββ BuiltInHooks.luau # Default compression hooks
βββ ui/
β βββ App.luau # Main app component
β βββ Theme.luau # Theme system
β βββ components/ # Reusable UI components
β β βββ Button.luau
β β βββ TextInput.luau
β β βββ SearchBar.luau # Search with mode selection
β β βββ TreeView.luau # Data visualization
β β βββ Tabs.luau
β β βββ Modal.luau
β β βββ Toast.luau
β β βββ Select.luau
β βββ views/ # Application views
β βββ ConnectView.luau
β βββ BrowseView.luau
β βββ EditKeyView.luau
β βββ VersionsView.luau
β βββ SettingsView.luau
βββ utils/
β βββ Functional.luau # FP utilities (map, filter, reduce, etc.)
β βββ PatternMatcher.luau # Optimized search engine (~3-4x faster than native regex)
β βββ JSON.luau # JSON utilities
βββ settings/
βββ Settings.luau # Settings persistence
You can register custom compression/decompression hooks for your data formats:
local HookManager = require(path.to.HookManager)
HookManager.register({
name = "MyCustomFormat",
description = "Handle my custom data format",
priority = 25, -- Higher priority runs first
-- Called to check if this hook can handle the data
canHandle = function(data, context)
return type(data) == "string" and string.sub(data, 1, 4) == "MYF:"
end,
-- Transform data for display in editor
decompress = function(data, context)
-- Your decompression logic
return decompressedData
end,
-- Transform data back for saving
compress = function(data, context)
-- Your compression logic
return compressedData
end,
})The search bar supports multiple modes for finding data:
| Mode | Description | Example |
|---|---|---|
| All | Search keys and values | player matches key "playerName" and value "player1" |
| Content | Direct content matching | gold finds any occurrence in serialized data |
| Keys | Only search key names | inventory finds keys containing "inventory" |
| Values | Only search values | 100 finds values containing "100" |
| Type | Search by data type | array finds all arrays |
Enable the .* toggle to use Lua pattern matching in any of the above modes. For example, ^player%d+ in Keys mode finds keys starting with "player" followed by digits.
GPL-3.0