DataForge — A Convenient Visual Editor for Game Data and Balancing

Hello everyone!

I’d like to share the development progress of my new tool that I’m currently working on — DataForge. It’s a desktop application for creating, visually editing, and conveniently managing game data, configurations, and balance settings.

What is it and why am I building it?

During game development (especially as projects grow and the amount of data increases), there is often a need for a convenient data editor. Editing raw spreadsheets or JSON/Lua files manually can be tedious and error-prone. That’s why I decided to create DataForge — a visual tool that allows you to design data structures and populate them easily without getting distracted by code.

Which formats can it export to?

Since ease of integration with game engines is one of my main goals, exporting is one of DataForge’s key features. At the moment, it supports:

  • Lua — generates ready-to-use native tables. Perfect for Defold and works out of the box!
  • JSON — the classic format, with a choice between pretty-printed output for readability or minified output for compactness.
  • CSV — for those who prefer working with spreadsheet-style data.

What can the application do already?

  • Visual Data Structure Creation (Templates): Define the field types your entities require, such as strings, numbers, localization fields, and more.
  • Hierarchy and Organization: Group data into categories and build a logical project tree structure.
  • Smart Export: Flexibly configure how data is exported. For example, export as an Array or as a Dictionary/Map using entity IDs as keys.
  • Flexible Export Scope: Export the entire project at once, each category into a separate file, or only selected items.
  • Localization Support: Built-in support for multilingual fields.
  • UI Customization: A modern interface with both light and dark themes for a comfortable workflow.

The project is currently in active development, and I plan to regularly share new features and progress updates here.

I’d love to hear your feedback! What features do you usually find missing in data editors when developing with Defold? What functionality would you like to see in a tool like this?

Thanks in advance for your feedback!

13 Likes

Great UI design!

I don’t know how useful my feedback will be, but I struggled in the past with items and resources that need to be represented visually in different way between different UIs or game world. For example recipes that are also resources for other recipes can have one look as recipe but slightly different as resource, or item that looks one way in the inventory, but it’s different when dropped on the ground or equipped. The hardest thing was to keep track what recipe required what resources and if I need to adjust the requirements/resource price for balance.

2 Likes


Thank you for the feedback! It is very valuable to me!

I completely understand the struggle of keeping track of crafting chains and balancing resource prices. Based on your feedback, I have added a brand new Relations tab to the Item Editor to solve exactly this problem!

Now, when you open any item (whether it’s a raw resource or a complex recipe), the engine automatically scans the entire database and visualizes the connections:

  • Requires (Outbound): Shows all the ingredients and materials needed to craft the current item.
  • Used In (Inbound): Instantly shows everywhere this item is used across all recipes and categories.

Every relation is clickable, allowing you to seamlessly navigate through your entire crafting tree. This makes it incredibly easy to see exactly what recipes depend on a specific resource and adjust your balance accordingly.

Thanks again for pointing this out, it made the tool much better!

4 Likes

miniatures for atlas

5 Likes

I am looking forward to try your soft!
One thing I was thinking of, was to be able to export Lua annotations of your objects you export as lua or json.
So then in code you can easyly use the data with autocomplete without retyping all types by hand.
This would be cool.
Also export annotations as metadata lua objects (a table with lua table with name and type and description) so that you can operationalize metadata in editor scripts or in UI (think auto generated debug Ui based on metadata)

4 Likes

Thank you so much for the idea with the annotations. I will definitely add this feature!

2 Likes

Hey everyone!

I’ve just released the first public beta of DataForge — a visual game database and content editor designed specifically for game designers and developers.

Why did I build this? If you’ve ever struggled with managing static game data (items, enemies, quests, dialog trees) using messy Excel spreadsheets or manually editing raw JSON configs, you know how error-prone and tedious it can get. DataForge is built to solve this by providing a clean, structured visual editor.

:rocket: Check out the site & download the installer (Windows): :backhand_index_pointing_right: ufgo.github.io/dataforge

Looking for Feedback & Bug Reports: The tool is currently in active development (Beta). I would love to hear your thoughts, feature requests, or any pain points you experience while trying it out.

:hammer_and_wrench: GitHub Issues are now open! If you run into any bugs or have a specific feature suggestion, feel free to open an issue in the repository: :backhand_index_pointing_right: github.com/ufgo/dataforge/issues

Thanks for checking it out, and I hope it helps speed up your game development workflow!

6 Likes

Good job I will try it! Congrats for the first release, seems polished enough especially the documentation and already JS extension plugin, like it a lot :smiling_face_with_sunglasses: No soft is complete if user cant totally change it :grin:

Just some questions:

  • will you support Linux? I am on windows now but my next pc will be full linux
  • what’s your end goal pricing? I think you will sell it at one point or not?
  • seems you use the same stack then Spriteloop editor… are you working together?
1 Like

Thank you for the kind words! Glad to hear the documentation and JS plugins are working well for you. Total customization is definitely the goal.

To answer your questions:

  • Linux support: Yes, a Linux version will absolutely be available. Your transition to the new PC will be seamless.

  • Pricing: The program will remain free. I don’t plan to sell it or make it commercial; it will rely solely on donations.

  • Spriteloop Editor: No, we are not working together. I actually opened quite a few issues in their repository in the past. It seems like Spriteloop uses Tauri as well, though I can’t say for sure, but it is a completely independent project.

4 Likes

Looks nice I will give it a try when I’m back on my Windows PC.

I’m just pretending to be multiple people. It’s just me! :smiley: And yes both are solo projects.

P.S. I hope you get the joke. DataForge is a different cool project.

I love the idea, thanks for building this. Since there is no macos build yet, unfortunately I haven’t been able to test it yet.

I have a few questions:

  • I believe the editor keeps the data in some kind of storage. Are you using sqlite, or perhaps storing it as a json file?
  • People mostly tend to use Excel because of the calculation side of things, like enemy health, player upgrades, and their outcomes. Is it possible to generate views with queries and export them as well, or are you planning to add that?
2 Likes

Thanks for the kind words!

Regarding the macOS build: I have a Mac myself, but I don’t have access to my main computer right now and I’m working from my laptop. I will try to set up the macOS build and release it later this week.

For storage: The project files are indeed stored in JSON. You can import data from JSON, Lua, and CSV, and export it back to the same formats.

As for the formula calculations and query views: That’s a really great idea! Currently, the app doesn’t support built-in formulas or custom query views yet. Could you please create a GitHub issue for this? That way i can track this feature request, discuss how to design it, and keep you updated on the progress.

3 Likes

Would also be great to have a linux build too! This looks very nice, especially the visual part and localization support! Thanks for sharing! <3

3 Likes

formulas support

1 Like

I’ve added Linux and macOS versions and updated the Windows release.

These versions include a new field type: Formula.

You can also download the Defold Plugin, which adds support for working with Defold atlases directly inside the editor.

4 Likes

Hi,

I am trying your tool, and this would be really useful!
it would need a bit of learning curves and experience on it to integrate it in a dev workflow, but I can already see the power of it.

Here is my feedback for now on the user experience of it:

Category editing

First, for the Category definition, as soon as we have defined our category schema, and start to add items to it, we really don’t care anymore of all this part:


so we need to scroll down each time to the list of objetcts here

which is painfull.

Recommendation: I would put the schema definition in another tab of the category, or in a foldable container that is closed by default , or open at first when there is no item in the category but then closed once there is at least one item.
So next time you click on the category, you just seen the liste / gallery of items.

Item editing

When we create a new item (by clicking or ctrl+N), there should already be the focus in the text input:


Right now I need to press Tab or click the input to start entering the name, which is one click too many.

Then once we hit ENTER and the item is created, we should already have the focus on the first field of the item, so we can fill in the data never leaving the keyboard.
I think full keyboard navigation should be a top priority for this kind of software. That’s one of the reason people still use Excel or JSON files: they can enter data fast.
Here you cant even go from one item to another with the arrows keys (on left panel). We should go up/down, open/close the tree etc.. while hitting Enter => go into edit mode on the field of the item etc..

layout editing

I think the container vertical/horizontal button should be near the title, not at the right.
image
At first I didn’t understand where to change to horizontal.

I created a custom type with many fields and use it in my Category. The problem is that types doesn’t have layouts, so I cant modify layout of internal fields of my custom type:


here the internal fields of my shape field cannot be layed out.
Maybe add layouts to types, too?

Custom types

I think there is a bug on Array using custom types.
I created a type “level_layer”:

Then in the Level Category, I added a layers field which is an array of level_layer type.

Then when I try to add an item, I have this each time I click to add a layer.

Don’t know if it was meant to be used like that?
I try to create the hierarchy of Levels => layers => objects … Should I do it another way?

Conclusion

I am barely scratching what you’ve done here but this is a really promising tool!

3 Likes

Continuation of my tests!

Export Data

The annotation feature and metadata file is a killing, many thanks!

As an improvement, maybe we could edit the name of the annotation class for each category? if we want to avoid name clashes with existing code.

For now I am focusing on Lua export:
From my point of view, the Array versus Dict export option should be separated between exporting the category versus the items of the category. I am thinking about how I will require the file and use it in LUA afterwards.

  • Right now, the Array export put all the different categories in one big array (which doesn’t makes sense to me), and the items of each category is in one array too (which totally makes sense).

    • when we require the file, and want a specific category, we have to loop over all categories and find the one with the good name. Personaly, I dont see one use case it is usefull to do that :thinking: At the category level, I just want to do
    local data = require('data.lua')
    local weapons = data.weapons
    local level_width = data.levels[current_level].width
    

    which is doable with dict export. I will never want to do

    local data = require('data.lua')
    local weapons = nil
    local levels = nil
    for i, category in ipairs(data) do
       if category.id == 'weapons' then weapons = category end
       if category.id == 'levels' then levels = category  end
    --   etc...
    end
    

    which I have to do with Array export.
    However, here I have all my levels in one array, which is good.

  • Then if I use the Dict export, I have an attribute for each category (which totally makes sense as stated above), but then I also have a dictionary for the items (which could makes sense, depending on the category). But then it maynot makes sense for the levels category (I just want a list of levels), but it makes sense for example for a “weapon_type” category. Like

     local data = require('data.lua')
      if player.current_weapon.type == data.weapons_type.GUN then 
          shot()
      end
    

    I know that for levels, I can still iterate with

    local data = require('data.lua')
     for _, level in pairs(data.levels) do 
        -- ....
    end
    

    but then I loose the ORDERING of levels! I need to add a “level_index” field to track order of levels, get all of them and sort them to find the first / second etc. level. Which I would have for free as an array export, and in DataForge I can just swap level orders.

So my conclusion is that for good use, it would be extremely cool if:

  • at the category level, it is always a Dict export (like the present Dict export) (or configurable at export time, but I really dont see a use case for having all categories mixed up in a big array… prove me wrong please?)
  • but for each category, we can setup the type of item exports (Array (default) / Dict ) for the category, while designing the category.

Then when we export, by default is to follow the setup for each category.

In brief, in the Category definition, we have a form “Export & Annotation” configuration, where we define the annotation Class name and the items export type.

Then, I can define the Array export for my Levels category, but the Dict export for my Weapons_type category. When I click export, everything is good with no more configuration.

Importing data

Just for fun I tried to import a JSON file which is a LDTK level file (the level editor).
It didn’t go well… :sweat_smile:
The main problem is hiearchical data (arrays of objects of objects of arrays of objects etc..) that are short lived:

So objects are not expanded.. but obviously this would require to create custom types on the fly with arrays of custom types and doing it recursively… I wont ask you to do it, It was just to stress test the import feature.
Here is the file
BeachWorld_Level_0.txt (244.1 KB)

(I changed extension to upload it, but that’s a JSON)
if you want to play.

Any way, doing that makes me realize their is a very useful kind of data type you dont’t have, this is the Tuple type. I mean an array type but where the number of elements is fixed. Like a Vector data we want as an array of 2 or 3 numbers. Right now we can’t create an array field that accept EXACTLY 2 or 3 entries. And at export, I want it to be exported as arrays but at item creation, I don’t want to click twice “add item”.. and maybe sometime I click a third time by error etc.

=> a Tuple type could be a great improvement : i.e. an array with a predefined fixed number of entries

Conclusion

That’s enough for one day and for one man (talking about you reading all of this :rofl:)! I hope you will take some of my points, even if I am already happy with the soft!
thanks and keep the good work

3 Likes

Hi!

Thank you so much for such detailed and incredibly valuable feedback! This is exactly the kind of real-world usage review that helps shape the tool.

Here are my thoughts on your points:

  1. Category Definition UX (Collapsible Container / Alignment / Autofocus & Keyboard Navigation):
    I completely agree. Having to scroll past the schema definition every time you want to edit items is painful. I will definitely implement a collapsible container for the category configuration that is closed by default once there is at least one item. Relocating the container alignment button next to the label makes perfect sense too.
    Regarding focus and keyboard navigation: autofocusing the first input field on selection/creation and adding arrow key navigation for the sidebar are excellent workflow improvements. I will absolutely implement these!

  2. Lua Export & Category-level Export Structure (Array vs Dict):
    This is a brilliant point. In game development, some categories are naturally ordered lists (like levels), while others are lookup dictionaries (like weapon types). A global choice between Array and Dict is indeed too limiting. I will definitely add per-category settings in the “Export & Annotation” definition where you can define both a custom annotation class name and choose whether that specific category’s items should be exported as an Array or a Dict, while keeping the root-level categories as a clean dictionary lookup.

  3. Fixed-Size Collections (Tuple Type):
    This makes complete sense. Clicking “+ Add item” multiple times for coordinates, bounds, or Vector2/Vector3 fields is tedious and error-prone. Instead of introducing a completely new type, I plan to add a “Fixed Size (Tuple)” checkbox and length input to the standard collection field. When checked, it will pre-render the exact number of fields and hide the add/delete buttons. I will definitely implement this!

  4. LDtk JSON Hierarchical Import:
    As you pointed out, importing deeply nested recursive structures is highly specific and complex to handle natively without creating custom type clutter. I think this feature is a bit too niche for the core editor right now, but it could definitely be a great candidate for a plugin in the future once the plugin system is more mature.


In the future, could you please create issues directly in my GitHub repository? Tracking and managing feedback, bug reports, and feature requests on the forum can get a bit difficult to control, whereas GitHub issues will help me keep everything organized and tracked in one place.

Thank you again for your support and great ideas! I’ll be sure to get these features implemented.

5 Likes

I’ve updated and expanded the documentation and launched the project’s itch.io page: DataForge by Alexander Bulatov

Version 0.0.2 is now available.

What’s New

:gear: Per-Category Export Settings
You can now override export structure (array or dictionary) and generated type names on a per-category basis. For example, levels can preserve their order as an array, while items can be exported as a dictionary for fast ID-based lookup.

:package: Tuple / Vector Support
Collection fields can now have a fixed length. For example, a Vector3 field can be restricted to exactly three coordinates. Add/remove buttons are automatically hidden when the size is fixed, preventing accidental input mistakes.

:keyboard: Keyboard Navigation
The sidebar is now fully keyboard-navigable. Press Enter to start editing the first field of the selected item, and Escape (or Enter again) to return to navigation mode.

:soap: Cleaner Interface
Advanced field and category structure settings have been moved into a compact collapsible section. It automatically collapses when a category contains items, keeping the workspace focused and uncluttered.

:bug: Bug Fixes

  • Fixed rendering of nested Custom Types inside arrays.
  • Fixed initialization of nested Custom Type elements.

As always, feedback and feature requests are welcome! :rocket:

6 Likes