- Home
- Data Structure
Data Structure
Hexbon doesn't just encrypt your data - it structures it. Learn the required JSON format and validate your data to unlock the full interactive experience.
Chapters
Why Data Structure Matters
Hexbon is more than an encryption tool - it's a structured data storage system. Your data is organized into a hierarchical format that enables powerful features like drag-and-drop reordering, interactive cards, expandable records, and organized sections.
Structure vs. Encryption
We can always decrypt your data if you provide the correct encryption key. However, if your data doesn't follow our structure guidelines, we'll display it in raw mode - you'll see the data, but without the interactive UI features like cards, records, sections, drag-and-drop, etc.
This documentation explains the exact JSON structure expected by Hexbon. Following this structure ensures your data is fully compatible with our interactive dashboard features.
Structure Overview
Hexbon data follows a strict hierarchical structure. Understanding this hierarchy is key to properly organizing your data.
Data Hierarchy
{ "cards": [...] }
{
"title": "Personal",
"records": [...],
"updated_at": 1763938832
}
{
"title": "Gmail",
"data": [...]
}
{
"name": "Login",
"values": [...]
}
{
"value": "secret123",
"type": "secret"
}
| Property | Required | Applies To |
|---|---|---|
| cards | Yes | Root object |
| title | Yes | Card, Record |
| records | Yes | Card |
| data | Yes | Record (sections array) |
| name | Yes | Section |
| values | Yes | Section |
| value | Yes | Value |
| type | Yes | Value (secret, note, totp, link, email, username) |
| id | No | Value (for sorting) |
| updated_at | No | Card (timestamp) |
Cards
Cards are the top-level containers in your dashboard. Each card appears as a clickable tile that can be expanded to reveal its records. Cards can be reordered via drag-and-drop.
{
"title": "string", // Required: Card name displayed on tile
"records": [], // Required: Array of Record objects
"updated_at": 1763938832 // Optional: Unix timestamp of last update
}
| Property | Type | Required | Description |
|---|---|---|---|
| title | string | Yes | The display name shown on the card tile |
| records | array | Yes | Array of Record objects (can be empty) |
| updated_at | integer | No | Unix timestamp for "last updated" display |
{
"title": "Work Credentials",
"records": [
// Record objects go here...
],
"updated_at": 1763938832
}
Records
Records are entries within a card. They appear in the left sidebar when a card is opened and can be selected to view their sections. Think of records as individual items or entries (e.g., "Gmail Account", "Work VPN", "Database Credentials").
{
"title": "string", // Required: Record name displayed in sidebar
"data": [] // Required: Array of Section objects
}
| Property | Type | Required | Description |
|---|---|---|---|
| title | string | Yes | The display name shown in the record list |
| data | array | Yes | Array of Section objects (can be empty) |
Note:
The data property contains "sections", not raw data. This naming is for historical reasons. Each item in the data array is a Section object.
{
"title": "Gmail Account",
"data": [
{
"name": "Login Details",
"values": [
// Value objects go here...
]
}
]
}
Sections
Sections group related values within a record. They provide an organizational layer that helps categorize different types of information (e.g., "Login Details", "Recovery Options", "API Keys"). Each section has a name and contains multiple values.
{
"name": "string", // Required: Section heading/label
"values": [] // Required: Array of Value objects
}
| Property | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | The section heading displayed above values |
| values | array | Yes | Array of Value objects containing your data |
{
"name": "Login Details",
"values": [
{
"value": "user@example.com",
"type": "note",
"id": "value_1763938238781_3jh5i3r20"
},
{
"value": "supersecretpassword123",
"type": "secret",
"id": "value_1763938251026_fvjeq1vg9"
}
]
}
Values
Values are the actual data entries - the secrets, notes, and TOTP codes you store. Each value has a type that determines how it's displayed and interacted with in the UI.
{
"value": "string", // Required: The actual content
"type": "secret" | "note" | "totp" | "link" | "email" | "username", // Required
"id": "string" // Optional: Unique identifier for sorting
}
| Property | Type | Required | Description |
|---|---|---|---|
| value | string | Yes | The actual content (password, note text, TOTP secret) |
| type | string | Yes | One of: "secret", "note", "totp", "link", "email", or "username" |
| id | string | No | Unique identifier used for sorting and referencing |
Value Types
| Type | Display | Use Case |
|---|---|---|
| "secret" | Hidden by default (•••••), click to reveal | Passwords, API keys, sensitive data |
| "note" | Always visible plain text | Usernames, emails, URLs, non-sensitive info |
| "totp" | Generates live 6-digit codes | 2FA secrets (Base32 encoded) |
| "link" | Clickable hyperlink | URLs, website addresses |
| "email" | Email address with mailto link | Email addresses |
| "username" | Always visible plain text with user icon | Usernames, account identifiers |
// Secret value (hidden by default)
{
"value": "MySecurePassword123!",
"type": "secret",
"id": "value_1763938251026_fvjeq1vg9"
}
// Note value (always visible)
{
"value": "user@example.com",
"type": "note",
"id": "value_1763938238781_3jh5i3r20"
}
// TOTP value (generates 2FA codes)
{
"value": "JBSWY3DPEHPK3PXP",
"type": "totp",
"id": "value_1763938267595_kaecs9y31"
}
// Username value (visible text with user icon)
{
"value": "john_doe_123",
"type": "username",
"id": "value_1763938289412_xm2kp7v91"
}
Complete Example
Here's a complete, valid data structure showing the full hierarchy with multiple cards, records, sections, and different value types.
{
"cards": [
{
"title": "Personal Accounts",
"records": [
{
"title": "Gmail",
"data": [
{
"name": "Login Details",
"values": [
{
"value": "myemail@gmail.com",
"type": "note"
},
{
"value": "SuperSecretPassword123",
"type": "secret"
}
]
},
{
"name": "2FA",
"values": [
{
"value": "JBSWY3DPEHPK3PXP",
"type": "totp"
}
]
}
]
},
{
"title": "GitHub",
"data": [
{
"name": "Account",
"values": [
{
"value": "myusername",
"type": "note"
},
{
"value": "gh_token_abc123xyz",
"type": "secret"
}
]
}
]
}
],
"updated_at": 1763938832
},
{
"title": "Work",
"records": [
{
"title": "VPN Access",
"data": [
{
"name": "Credentials",
"values": [
{
"value": "vpn.company.com",
"type": "note"
},
{
"value": "john.doe",
"type": "note"
},
{
"value": "VpnP@ssw0rd!",
"type": "secret"
}
]
}
]
}
],
"updated_at": 1763856530
}
]
}
Raw Data Mode
If your decrypted data doesn't follow the expected structure, Hexbon will still display it - but in raw mode. This means you'll see your data as plain JSON without the interactive features that structured data provides.
| Feature | Structured Mode | Raw Mode |
|---|---|---|
| Interactive card tiles | ||
| Drag-and-drop reordering | ||
| Secret masking with reveal toggle | ||
| Live TOTP code generation | ||
| In-place editing & auto-save | ||
| Copy to clipboard buttons |
Your Data Is Always Secure
Raw mode affects only the display, not security. Your data is always encrypted with AES-256-GCM encryption regardless of structure. You just won't get the interactive UI features if the structure doesn't match.
Validate Your Data Structure
Use our interactive validation tool to check your data structure in real-time.
Try Validation Tool