{"id":13632384,"url":"https://github.com/chungquantin/edma","last_synced_at":"2026-02-13T05:06:50.473Z","repository":{"id":64510476,"uuid":"572638787","full_name":"chungquantin/edma","owner":"chungquantin","description":"EDMA is an interactive terminal app for managing multiple embedded databases system at once with powerful byte deserializer support.","archived":false,"fork":false,"pushed_at":"2024-01-09T02:50:46.000Z","size":1993,"stargazers_count":190,"open_issues_count":5,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-05-06T06:11:31.410Z","etag":null,"topics":["bytes","database","database-management","embedded","rocksdb","rust","rust-lang","storage","tui"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/edma","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chungquantin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"github":null,"patreon":null,"open_collective":"nomadiz","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2022-11-30T17:49:04.000Z","updated_at":"2025-04-30T03:23:37.000Z","dependencies_parsed_at":"2023-02-14T11:46:37.430Z","dependency_job_id":"dfa88210-6168-4da7-a7f4-ab910e733b5b","html_url":"https://github.com/chungquantin/edma","commit_stats":{"total_commits":163,"total_committers":5,"mean_commits":32.6,"dds":0.4171779141104295,"last_synced_commit":"a6022cd6ad47119431896333bb147b5af5b1a6fa"},"previous_names":["lowlevelers/edma","nomadiz/edma","chungquantin/edma"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chungquantin%2Fedma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chungquantin%2Fedma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chungquantin%2Fedma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chungquantin%2Fedma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chungquantin","download_url":"https://codeload.github.com/chungquantin/edma/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252771617,"owners_count":21801744,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bytes","database","database-management","embedded","rocksdb","rust","rust-lang","storage","tui"],"created_at":"2024-08-01T22:03:01.973Z","updated_at":"2026-02-13T05:06:45.439Z","avatar_url":"https://github.com/chungquantin.png","language":"Rust","funding_links":["https://opencollective.com/nomadiz"],"categories":["Rust"],"sub_categories":[],"readme":"\u003cpre align=\"center\"\u003e\nBuilt by @nomadiz\n\n███████╗██████╗ ███╗   ███╗ █████╗ \n██╔════╝██╔══██╗████╗ ████║██╔══██╗\n█████╗  ██║  ██║██╔████╔██║███████║\n██╔══╝  ██║  ██║██║╚██╔╝██║██╔══██║\n███████╗██████╔╝██║ ╚═╝ ██║██║  ██║\n╚══════╝╚═════╝ ╚═╝     ╚═╝╚═╝  ╚═╝\n-----------------------------------\nEmbedded Database Management for All\n\u003c/pre\u003e\n\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003e\n \u003ca href=\"https://github.com/nomadiz/edma\"\u003e\u003cimg src=\"https://img.shields.io/badge/built_with-Rust-dca282.svg?style=flat-square\"\u003e\u003c/a\u003e\n\u003ca href=\"https://crates.io/crates/edma\"\u003e\u003cimg src=\"https://img.shields.io/crates/v/edma.svg?logo=rust\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/nomadiz/edma\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/nomadiz/edma?color=%23ff00a0\u0026include_releases\u0026label=version\u0026sort=semver\u0026style=flat-square\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/nomadiz/edma/blob/master/LICENSE\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/license-MIT License-00bfff.svg?style=flat-square\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/nomadiz/edma/graphs/contributors\" alt=\"Contributors\"\u003e\n\u003cimg src=\"https://img.shields.io/github/contributors/nomadiz/edma?color=green\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/nomadiz/edma/pulse\" alt=\"Activity\"\u003e\n\t\u003c/a\u003e\n\u003c/p\u003e\n\n## What is EDMA?\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"80%\" style=\"\nbox-shadow: 0px 4px 59px 22px rgba(0, 0, 0, 0.56);\nborder-radius: 10px;\" src=\"https://user-images.githubusercontent.com/56880684/206833658-97091acd-11c7-4b78-b08b-9ce2aeb365a8.gif\"/\u003e\n\u003c/p\u003e\n\n**EDMA: Embedded Database Management for All** is an open source project made to manage embedded key-value storages. EDMA is a TUI (Terminal User Interface) that is easy to install and configure. It allows engineer to traverse the embedded database and deserialize byte data with provided byte layout. This enhances the experience of working with low level database system like RocksDB or Redb.\n\n## Features\n\n-   Multi embedded database supported: `RocksDB`, `Redb`, `Sled`\n-   Cross-platform supported: `Windows`, `Linux` and `MacOS`\n-   Custom byte layout deserialization\n-   Execute database command directly in terminal\n-   Interactive terminal interface with keyboard only control\n-   Iterate key-value pairs from column family and table\n\n## Roadmap\n\n-   [ ] NEW: Universal Key Value Storage support (UKV)\n-   [x] NEW: Sled support\n-   [ ] NEW: LevelDB support\n-   [ ] Adding consistent mode for editor view\n\n## Supported Storages\n\nEDMA supports multiple databases with easy plug-to-play architecture. Please check below list for supported databases and its features:\n\n| Database name | Description                                                    | EDMA release                                                                | Pull request                                                |\n| ------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------- |\n| RocksDB       | Support both non-column and column byte data viewer (`COLUMN`) | [v0.1.0-beta.4](https://github.com/nomadiz/edma/releases/tag/v0.1.0-beta.4) | N/A                                                         |\n| ReDB          | Support default database (Will add `TABLE` view)               | [v0.1.0-beta.4](https://github.com/nomadiz/edma/releases/tag/v0.1.0-beta.4) | N/A                                                         |\n| Sled          | Support both non-tree and tree byte data viewer (`TREE`)       | [v0.1.0-beta.5](https://github.com/nomadiz/edma/releases/tag/v0.1.0-beta.5) | [#8 Sled support](https://github.com/nomadiz/edma/issues/8) |\n\nTo create a PR for a database integration, please go to [`Issues \u003e New Issue \u003e Feature request`](https://github.com/nomadiz/edma/issues/new?assignees=\u0026labels=\u0026template=feature_request.md\u0026title=)\n\n## Getting Started\n\n### Installation\n\n#### With Cargo (Linux, macOS, Windows)\n\nIf you already have a Rust environment set up, you can use the `cargo install` command:\n\n```\ncargo install --version 0.1.0-beta.3 edma\n```\n\n#### From binaries (Linux, macOS, Windows)\n\n-   Download the [latest release binary](https://github.com/nomadiz/edma/releases) for your system\n-   Set the `PATH` environment variable\n\n### Set a config path\n\nConfiguration file is where you identify path to databases and EDMA byte templates. To set a config path, using a CLI command\n\n```\n$ edma --config-path [PATH_TO_FILE]\n```\n\nPlease view [EDMA Configuration file](https://github.com/nomadiz/edma#configuration) to learn more how configuration file works.\n\n### Usage\n\nRun EDMA terminal application\n\n```powershell\n$ edma\n```\n\nSet a config file path\n\n```shell\n$ edma --config-path [PATH]\n```\n\nUsing `help` command\n\n```shell\n$ edma --help\n\nedma 0.1.0\nA cross-platform TUI database management tool written in Rust\n\nUSAGE:\n    tui [OPTIONS]\n\nFLAGS:\n    -h, --help       Prints help information\n    -V, --version    Prints version information\n\nOPTIONS:\n    -c, --config-path \u003cconfig-path\u003e    Set the config file\n```\n\n## Why use EDMA?\n\n### Compatible with multiple databases\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"80%\" style=\"\nbox-shadow: 0px 4px 59px 22px rgba(0, 0, 0, 0.56);\nborder-radius: 10px;\" src=\"https://user-images.githubusercontent.com/56880684/206836453-3834a473-363b-4b7e-af27-fbbc6115a3bc.png\"/\u003e\n\u003c/p\u003e\n\n**EDMA** is a very first database management tool designed for embedded databases. Applying adapter design pattern into database storage implementation, it makes integration with databases become easier. EDMA supports two databases by default: `RocksDB` and `ReDB`. To integrate with other embedded databases, you can add the implementation in [EDMA storage layer](https://github.com/nomadiz/edma/tree/master/db/src/storage/kvs)\n\n### Interactive terminal UI\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"80%\" style=\"\nbox-shadow: 0px 4px 59px 22px rgba(0, 0, 0, 0.56);\nborder-radius: 10px;\" src=\"https://user-images.githubusercontent.com/56880684/206836166-0699e5cd-e954-4499-9a7e-7a4aeb43eabc.png\"/\u003e\n\u003c/p\u003e\n\nEDMA is built using Rust library `tui-rs` which makes it to be an app that can be run directly on your terminal. No startup time needed and it's extremely light weight. Run every where, every time, all at once\n\n### Template management for byte deserializer\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"80%\" style=\"\nbox-shadow: 0px 4px 59px 22px rgba(0, 0, 0, 0.56);\nborder-radius: 10px;\" src=\"https://user-images.githubusercontent.com/56880684/206836189-9de85d33-9a07-4e27-a182-d6cd0db83569.png\"/\u003e\n\u003c/p\u003e\n\nData in embedded database is different from data presented in relational databases. While relational databases label data with specific type and attributes when it is created, embedded database can't do that. The only data type that embedded database displays is byte array. For example, `[0 0 0 1 50 32 20]`. It is not human readable.\n\nUsing EDMA, byte data can be converted into human readable data using EDMA byte template system.\n\nInstruction on how EDMA byte deserializer works: [What is EDMA templates?](https://github.com/nomadiz/edma#templates)\n\n### Command editor\n\nCommand editor is one core feature of EDMA, it allows you to manage byte data using advanced commands. The image below shows how a database column family can iterated using command editor\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"80%\" style=\"\nbox-shadow: 0px 4px 59px 22px rgba(0, 0, 0, 0.56);\nborder-radius: 10px;\" src=\"https://user-images.githubusercontent.com/56880684/206836218-8f115413-4b8d-4c88-a192-06e4eca3a697.png\"/\u003e\n\u003c/p\u003e\n\n## Keymap\n\n| Key                                                    | Description                      |\n| ------------------------------------------------------ | -------------------------------- |\n| \u003ckbd\u003eENTER\u003c/kbd\u003e                                       | Enter focused section            |\n| \u003ckbd\u003eESC\u003c/kbd\u003e                                         | Escape from focused section      |\n| \u003ckbd\u003e9\u003c/kbd\u003e, \u003ckbd\u003e0\u003c/kbd\u003e                             | Scroll up/down databases         |\n| \u003ckbd\u003eh\u003c/kbd\u003e, \u003ckbd\u003ej\u003c/kbd\u003e                             | Scroll up/down key byte layout   |\n| \u003ckbd\u003ek\u003c/kbd\u003e, \u003ckbd\u003el\u003c/kbd\u003e                             | Scroll up/down value byte layout |\n| \u003ckbd\u003e←\u003c/kbd\u003e, \u003ckbd\u003e→\u003c/kbd\u003e, \u003ckbd\u003e↑\u003c/kbd\u003e, \u003ckbd\u003e↓\u003c/kbd\u003e | Move focus to left/right/up/down |\n| \u003ckbd\u003eh\u003c/kbd\u003e, \u003ckbd\u003ed\u003c/kbd\u003e, \u003ckbd\u003el\u003c/kbd\u003e               | Switch to home/databases/layouts |\n| \u003ckbd\u003eq\u003c/kbd\u003e                                           | Quit                             |\n\n## EDMA Command\n\nEDMA supports inline command to interact with embedded databases. The list of supported commands are\n\n### - `COLUMN` or `TABLE`\n\nIterate with defined column famility or table\n\n#### Arguments\n\n-   `String`: Column family name\n\n### - `PREFIX` or `SUFFIX`\n\nIterate filtered by prefix or suffix.\n\nNote: This command is for key iteration not value iteration.\n\n#### Arguments\n\n-   `String`: Prefix value or suffix value\n\n## Configuration\n\n### Databases\n\nDatabase name should be these two below\n\n-   `rocksdb`: RocksDB\n-   `redb`: Redb\n-   `sled`: Sled\n\nDatabase path should be `String` type\n\n### Templates\n\nByte template is an instruction combined by one or multiple byte layouts. It provides EDMA deserializer information about bytes data. To explain the use of byte template and byte layout, we have this example:\n\n```\nOriginal= edma2022github\nBytes= [65 64 6d 61 32 30 32 32 67 69 74 68 75 62]\n```\n\nSlicing data and labelling data as EDMA byte template, we have\n\n```\n[1]\noriginal=edma\nfrom=0\nto=4\nvariant=String\n\n[2]\noriginal=2022\nfrom=4\nto=8\nvariant=Int32\n\n[3]\noriginal=github\nfrom=8\nto=13\nvariant=String\n```\n\n### Example\n\nConfiguration file example\n\n```json\n{\n\t\"databases\": [\n\t\t{\n\t\t\t\"name\": \"rocksdb\",\n\t\t\t\"path\": \"/temp\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sled\",\n\t\t\t\"path\": \"/temp/sled\"\n\t\t}\n\t],\n\t\"templates\": [\n\t\t{\n\t\t\t\"name\": \"Custom layout\",\n\t\t\t\"layouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"name\",\n\t\t\t\t\t\"from\": 0,\n\t\t\t\t\t\"to\": 5,\n\t\t\t\t\t\"variant\": \"String\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"id\",\n\t\t\t\t\t\"from\": 5,\n\t\t\t\t\t\"to\": 10,\n\t\t\t\t\t\"variant\": \"Int64\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n## Tribute\n\nWithout these awesome open source projects, EDMA can't be complete. Please share the spotlight with these repo below:[`gobang`](https://github.com/TaKO8Ki/gobang), [`tui-rs`](https://github.com/fdehau/tui-rs), [`spotify-tui`](https://github.com/Rigellute/spotify-tui) and [`tui-re-tree-widget`](https://github.com/EdJoPaTo/tui-rs-tree-widget)\n\n## How to contribute\n\nBefore committing to the tasks in the community, please skim through the guidelines below to grasp the overall idea of how the community works first. It does not take long but I believe it will give you a big picture of the vision and culture of TheLowLevelers.\n\n- [TheLowLevelers Contribution Guidelines 🤝](https://github.com/orgs/lowlevelers/discussions/8)\n- [TheLowLevelers Community Guidelines 🔥](https://github.com/orgs/lowlevelers/discussions/3)\n- [FAQ Who own the community assets?](https://github.com/orgs/lowlevelers/discussions/9)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchungquantin%2Fedma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchungquantin%2Fedma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchungquantin%2Fedma/lists"}