Getting Started
1. Create a Universe
Start by creating a universe from the universe management screen. Choose a name and a storage type. For local storage the app creates a dedicated JSON file automatically.
2. Add Objects
Use the add menus to create objects such as tasks, notes, diagrams, tables, images, or custom object types. Each object is saved into the selected universe.
3. Open, Search, and Link
Use search, favourites, and object navigation to move between related items. Some views reference other objects by UUID, which makes the app behave like a lightweight object graph.
4. Use Visual Views
Boards, quadrants, layouts, maps, and diagrams provide visual ways to organize information. Diagram objects can also supports Mermaid flowcharts import/export, and export to PNG, PDF, SVG, and webpages.
5. Build and Reorganize Custom Boards
Board views are useful for grouping related objects into stacks. You can create custom object boards for your own workflows, then reorganize them by moving items between columns or changing the order inside a stack.
6. Work Offline and Export Later
If your universe uses local storage, you can continue working in offline mode without a network connection. When you are ready, you can export content such as JSON, diagram assets, or generated webpages for sharing and publishing.
JSON Structure Details
Universe of Objects stores information as JSON-compatible dictionaries. Most object records follow a shared convention:
{
"objectType": "task",
"UUID": "A-UNIQUE-IDENTIFIER",
"objName": "Title of the object"
}
Top-Level Universe List
The configured universe list is stored in storageOption.json as an array of universe definitions. Typical fields include:
[
{
"name": "My Universe",
"id": "UNIVERSE-ID",
"storageType": "localfilestorage",
"url": null,
"topicName": null,
"topicUUID": null,
"accessID": null,
"secretKey": null,
"filename": "UNIVERSE-ID.json",
"lifeSpan": null
}
]
Local Universe Object File
A local universe file is a JSON array of objects. The app may keep historical versions depending on storage and write behavior, so consumers should generally identify the latest active object by UUID.
[
{
"objectType": "note",
"UUID": "OBJ-1",
"objName": "Welcome",
"content": "Hello world"
},
{
"objectType": "diagram",
"UUID": "OBJ-2",
"objName": "System Map",
"canvasWidth": 1800,
"canvasHeight": 1200,
"diagramShapes": [],
"diagramConnectors": []
}
]
Default Object Payloads
{
"task": {
"objectType": "task",
"UUID": "UUID",
"objName": "Task name",
"percentageComplete": 0,
"content": []
},
"list": {
"objectType": "list",
"UUID": "UUID",
"objName": "List name",
"content": []
},
"checklist": {
"objectType": "checklist",
"UUID": "UUID",
"objName": "Checklist name",
"content": []
},
"board": {
"objectType": "board",
"UUID": "UUID",
"objName": "Board name",
"boardObjects": []
},
"quadrant": {
"objectType": "quadrant",
"UUID": "UUID",
"objName": "Quadrant name",
"boardObjects": [
{ "stackName": "Top Left", "objectList": [] },
{ "stackName": "Top Right", "objectList": [] },
{ "stackName": "Bottom Left", "objectList": [] },
{ "stackName": "Bottom Right", "objectList": [] }
]
},
"string": {
"objectType": "string",
"UUID": "UUID",
"string": "Text value"
},
"keyvaluepair": {
"objectType": "keyvaluepair",
"UUID": "UUID",
"objName": "Pair name",
"key": "key",
"value": ""
},
"image": {
"objectType": "image",
"UUID": "UUID",
"objName": "Image name",
"base64image": ""
},
"note": {
"objectType": "note",
"UUID": "UUID",
"objName": "Note name",
"content": ""
},
"markdown": {
"objectType": "markdown",
"UUID": "UUID",
"objName": "Markdown name",
"content": ""
},
"record": {
"objectType": "record",
"UUID": "UUID",
"objName": "Record name",
"ObjArray": []
},
"location": {
"objectType": "location",
"UUID": "UUID",
"objName": "Location name",
"latitude": 0.0,
"longitude": 0.0,
"w3ws": ""
},
"map": {
"objectType": "map",
"UUID": "UUID",
"objName": "Map name",
"content": []
},
"table": {
"objectType": "table",
"UUID": "UUID",
"objName": "Table name",
"schema": [],
"rows": []
},
"layout": {
"objectType": "layout",
"UUID": "UUID",
"objName": "Layout name",
"locked": false,
"layoutObjects": []
},
"diagram": {
"objectType": "diagram",
"UUID": "UUID",
"objName": "Diagram name",
"canvasWidth": 1800.0,
"canvasHeight": 1200.0,
"diagramShapes": [],
"diagramConnectors": []
},
"event": {
"objectType": "event",
"UUID": "UUID",
"objName": "Event name",
"startDate": "2026-01-01T12:00:00Z"
},
"timeline": {
"objectType": "timeline",
"UUID": "UUID",
"objName": "Timeline name",
"content": []
},
"timelog": {
"objectType": "timelog",
"UUID": "UUID",
"objName": "Timelog name",
"currentState": "Stop",
"log": []
},
"custom": {
"objectType": "custom",
"UUID": "UUID",
"objName": "Custom object",
"customObjectType": ""
},
"customTemplate": {
"objectType": "customTemplate",
"UUID": "UUID",
"objName": "Template name",
"customObjectType": "Template name",
"fieldDisplayOrder": []
}
}
Some object types contain nested arrays of dictionaries, especially boards, layouts, diagrams, tables, and timelogs. If you are building import/export tools, preserve unknown keys when possible so app-specific metadata is not lost.