Documentation is a work in progress — some pages may be incomplete.
Unify

Flatfile

Zero-config JSON file storage

Flatfile is the simplest Honey backend. It stores each value as a JSON file on disk — no database server, no connection strings, just files.

When to Use

  • Prototyping or development
  • Very small datasets (under ~1,000 entries)
  • Plugins where players don't want to set up a database
  • Data that rarely changes

Setup

import me.jordanfails.honey.DataHandler
import me.jordanfails.honey.DataStoreType
import me.jordanfails.honey.connection.dataFramework

// Zero config — uses ./data directory by default
dataFramework { }

val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.FLATFILE) {
    it.id = "players"  // Creates ./data/players/<uuid>.json
}

On Disk

plugins/
├── MyPlugin/
│   └── data/
│       └── players/
│           ├── 550e8400-e29b-41d4-a716-446655440000.json
│           ├── 67890abc-1234-5678-9def-0123456789ab.json
│           └── ...

Each file contains the serialized JSON:

{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "name": "JordanFails",
  "kills": 42,
  "deaths": 7,
  "lastLogin": 1718582400000
}

Full Example

data class PlayerData(
    val uuid: String,
    var name: String,
    var kills: Int = 0,
    var deaths: Int = 0
)

class MyPlugin : JavaPlugin() {

    lateinit var store: DataStore<String, PlayerData>

    override fun onEnable() {
        dataFramework { }

        store = DataHandler.createStoreType(DataStoreType.FLATFILE) {
            it.id = "players"
        }
    }

    fun savePlayer(player: Player) {
        val data = store.retrieve(player.uniqueId.toString())
            ?: PlayerData(player.uniqueId.toString(), player.name)

        data.name = player.name
        store.store(data.uuid, data)
    }

    fun getKills(player: Player): Int {
        return store.retrieve(player.uniqueId.toString())?.kills ?: 0
    }
}

Limitations

LimitationWorkaround
No querying by fieldLoad all keys and filter in memory
No atomic transactionsUse SQL or Mongo for transactional data
Slower with large datasetsSwitch to SQL at ~1,000+ entries
No concurrent access safetyOnly one server instance per data directory

On this page