Bundle Format
A .omnidata container is a directory bundle – a directory that behaves like a single file. This pattern comes from macOS, where it has been the standard for packaging complex applications and documents for decades.
The bundle pattern
macOS uses directory bundles everywhere:
| Bundle | What’s inside |
|---|---|
.app |
Executable, frameworks, resources, Info.plist |
.keynote |
Slide data, images, metadata, thumbnails |
.band |
Audio tracks, effects chains, project metadata |
.rtfd |
Rich text with embedded images |
.xcodeproj |
Build settings, schemes, user data |
Each of these is a directory on disk. But Finder presents them as a single item. You double-click a .app to launch it. You drag a .keynote file to share it. The internal structure is hidden unless you explicitly ask to see it.
How Finder handles bundles
Finder recognizes bundles by their extension and treats them as opaque packages:
- Single-click selects the whole bundle
- Double-click opens the bundle with its default application
- Drag and drop moves the entire directory tree
- Get Info shows a single file size (sum of contents)
- Quick Look previews the bundle’s content
To see inside, right-click and choose Show Package Contents. This opens the directory in a normal Finder window, revealing the internal structure.
The .omnidata bundle
An .omnidata bundle follows the same pattern:
director-of-ai.omnidata/
├── manifest.json # Identity, schema version, ownership
├── index.db # Search layer (resources, chunks, embeddings, FTS5, queue, kv)
├── memory.db # Graph layer (collections, edges, tags, memory records)
├── adapters.json # Adapter registry and sync state
├── ingress.log # Append-only ingest operation log
└── blobs/ # Content-addressed binary storage
├── ab/
│ └── ab3f7c9e2d...sha256
└── c8/
└── c84d02ee7b...sha256
To the user, director-of-ai.omnidata appears as one item. To the runtime, it is a structured directory where each file has a focused responsibility.
Why a bundle instead of a single file?
The previous design (v0.1.x) stored everything in a single SQLite file. The bundle format solves several problems:
| Concern | Single SQLite file | Directory bundle |
|---|---|---|
| Binary storage | BLOBs in SQLite degrade performance | Files on the filesystem; host handles compression, dedup |
| Database contention | One writer lock for everything | Separate databases can be written independently |
| Backup granularity | All or nothing | Filesystem snapshots, incremental backup of changed files |
| Filesystem features | Locked inside SQLite; invisible to the OS | Blobs benefit from btrfs/ZFS/APFS compression, snapshots, dedup |
| Corruption blast radius | One corrupt page can affect the whole file | Databases and blobs are independent; corruption is isolated |
| Tooling | Requires SQLite tools to inspect | Standard filesystem tools: ls, du, find, sha256sum |
Transport and archival
Bundles are directories, but they travel well:
zip
# Pack for transport
zip -r director-of-ai.omnidata.zip director-of-ai.omnidata/
# Unpack on arrival
unzip director-of-ai.omnidata.zip
tar
# Pack with compression
tar czf director-of-ai.omnidata.tar.gz director-of-ai.omnidata/
# Unpack
tar xzf director-of-ai.omnidata.tar.gz
The bundle structure is preserved exactly. On macOS, the unpacked directory is immediately recognized as a bundle by Finder.
rsync
# Incremental sync to another machine
rsync -av director-of-ai.omnidata/ remote:~/instances/director-of-ai.omnidata/
Because blobs are individual files, rsync only transfers new or changed blobs. This is dramatically more efficient than syncing a single multi-gigabyte SQLite file where one new resource means re-transferring the entire database.
Registering as a macOS bundle type
For Finder to treat .omnidata directories as bundles natively (showing a custom icon, hiding contents by default), the OmniData desktop app registers a UTI (Uniform Type Identifier) that declares .omnidata as a package type. Without this registration, Finder treats it as a regular directory – the contents are still correct, but the user experience is less polished.
Compared to other formats
| Format | Structure | Trade-off |
|---|---|---|
.sqlite |
Single file | Portable but no filesystem-level features for binary content |
.omnidata |
Directory bundle | Leverages filesystem; slightly more complex to transport |
.keynote |
Directory bundle (zip-wrapped internally) | Same pattern, different domain |
.git |
Directory with objects, refs, pack files | Similar content-addressed blob storage pattern |
The .omnidata bundle is closest in spirit to a .git directory: content-addressed objects on the filesystem, with structured metadata alongside them.