Developers

The archive Breno produces and accepts. Markdown and JSONL, your original files byte for byte, and a checksum for every member, readable without a Breno account.

Two rules

  1. An export is complete or it is not an export. Everything the caller can read is in the archive, in an open format, with no proprietary container.
  2. The read rule applies. The archive contains exactly what the requesting caller may read, no more. The rule is the one retrieval uses; export does not re-implement it.

Archive layout

breno-export-<workspace-slug>-<yyyymmdd-hhmm>.zip
├── bundle.json                      # manifest + all structured item data
├── markdown/<slug>--<id8>.md        # one file per item; front matter + body
├── files/<id>/<original_filename>   # original uploads, byte-exact
├── memory/records.jsonl             # one JSON object per line
├── decisions/decisions.jsonl
├── graph/entities.jsonl
├── graph/relationships.jsonl
├── account.json                     # only on a "download my data" export
└── checksums.sha256                 # sha256 of every file above

memory/, decisions/ and graph/ are always present, even when empty: an empty JSONL file means there were none, which is different from an export that does not do that. account.json is the one member that is absent when it does not apply. It appears only on a personal “download my data” export, holds only the requester’s own data, and is never present on a workspace export.

ZIP members are addressed by name, so a reader must not depend on their order. The writer streams the bulk content first, then the four JSONL files, then bundle.json, then checksums.sha256, so an export is produced in one pass without holding the archive in memory.

File naming

  • <slug> is the item title, lower-cased, with runs of non-alphanumeric characters collapsed to - and truncated to 60 characters (untitled if nothing is left).
  • <id8> is the first 8 characters of the item’s UUID. It is what makes the name collision-free, and a reader can recover the item id from the filename.
  • files/<id>/<original_filename> keeps the id as the directory, so two items with the same original filename cannot collide.

bundle.json

The manifest. schema is the version discriminator: breno.export/v2. Each item carries its metadata, provenance and version history:

jsonc
{
  "schema": "breno.export/v2",
  "exported_at": "2026-10-09T07:49:00Z",
  "scope": "personal",              // "personal" | "workspace"
  "items": [
    {
      "id": "…", "title": "…",
      "source_type": "upload",       // upload | url | connector | note | …
      "visibility": "private",       // private | shared | workspace
      "sensitivity": "internal",     // public | internal | confidential | restricted
      "tags": ["…"], "collections": ["…"],
      "provenance": { "provider": "github", "url": "…", "author": "…", "external_id": "…" },
      "text_path": "markdown/…--…md",
      "file_path": "files/…/…",      // "" when there was no original file
      "sha256_text": "…",
      "versions": [ { "version": 2, "text_path": "markdown/…--…v2.md" } ]
    }
  ],
  "files": [ { "path": "…", "sha256": "…", "bytes": 1234 } ]
}

text_path is the item’s current full text, and the Markdown body is that text. Older versions are additional Markdown files named <slug>--<id8>.v<version>.md. The full field list, the Markdown front matter and the JSONL record shapes are in docs/api/export-format.md in the repository.

Verifying an export

checksums.sha256 is in the format sha256sum writes, with paths relative to the archive root. It lists every entry except itself, sorted by path, so two exports of the same content produce the same file. bundle.json is listed like any other member.

bash
unzip breno-export-*.zip -d export && cd export && sha256sum -c checksums.sha256

An importer must verify the checksums before ingesting and reject the archive, naming the first mismatched path. Breno’s import reads this archive, and also an Obsidian or plain Markdown vault and a Notion export, auto-detecting which it was given.

Back to the home page