- 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

