11 KiB
Claude OS Export Format Specification
Version: 1.0 Last Updated: 2025-11-06
Overview
Claude OS exports knowledge bases to a portable, self-contained SQLite database format. This format is designed to be consumed by external applications without requiring Claude OS to be running.
Format Characteristics
- Self-Contained: Single SQLite file with all data
- Portable: Copy to any system, no external dependencies
- Queryable: Standard SQL interface
- Versioned: Format version included for compatibility
- Documented: Clear schema and usage patterns
- Efficient: Indexed for fast queries
Export Artifacts
Each export produces two files:
- Database File:
<project>_export_<timestamp>.db - Manifest File:
<project>_export_<timestamp>.manifest.json
Example
exports/
├── dealer_123_export_20251106_193000.db
└── dealer_123_export_20251106_193000.manifest.json
Database Schema
Tables
1. knowledge_bases
Metadata about exported knowledge bases.
CREATE TABLE knowledge_bases (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
kb_type TEXT,
description TEXT,
created_at TEXT,
document_count INTEGER DEFAULT 0,
embedding_model TEXT,
embedding_dimensions INTEGER
);
Columns:
id: Unique identifiername: Knowledge base name (e.g., "dealer_123-knowledge_docs")kb_type: Type of KB (documentation, profile, memories, index)description: Human-readable descriptioncreated_at: ISO 8601 timestampdocument_count: Number of documents in this KBembedding_model: Model used for embeddings (e.g., "nomic-embed-text")embedding_dimensions: Vector dimension count (e.g., 768)
Example:
SELECT * FROM knowledge_bases;
| id | name | kb_type | description | created_at | document_count | embedding_model | embedding_dimensions |
|---|---|---|---|---|---|---|---|
| 1 | dealer_123-knowledge_docs | documentation | Service guides and FAQs | 2025-11-01T10:00:00Z | 45 | nomic-embed-text | 768 |
| 2 | dealer_123-project_profile | profile | Business context | 2025-11-01T10:00:00Z | 12 | nomic-embed-text | 768 |
2. documents
Document content and metadata.
CREATE TABLE documents (
id INTEGER PRIMARY KEY,
kb_id INTEGER NOT NULL,
kb_name TEXT NOT NULL,
title TEXT,
content TEXT NOT NULL,
source_file TEXT,
metadata TEXT,
created_at TEXT,
FOREIGN KEY (kb_id) REFERENCES knowledge_bases(id)
);
CREATE INDEX idx_documents_kb_id ON documents(kb_id);
CREATE INDEX idx_documents_kb_name ON documents(kb_name);
Columns:
id: Unique identifierkb_id: Foreign key to knowledge_baseskb_name: KB name (denormalized for convenience)title: Document titlecontent: Full document text contentsource_file: Original filename (e.g., "service_guide.md")metadata: JSON string with additional metadatacreated_at: ISO 8601 timestamp
Example:
SELECT id, kb_name, title, source_file FROM documents LIMIT 3;
| id | kb_name | title | source_file |
|---|---|---|---|
| 1 | dealer_123-knowledge_docs | Oil Change Guide | service_guide.md |
| 2 | dealer_123-knowledge_docs | Pricing Information | pricing.md |
| 3 | dealer_123-knowledge_docs | FAQ | faq.md |
Metadata Format:
{
"chunk_index": 0,
"total_chunks": 3,
"file_type": "markdown",
"tags": ["service", "maintenance"]
}
3. embeddings (Optional)
Vector embeddings for semantic search.
CREATE TABLE embeddings (
id INTEGER PRIMARY KEY,
document_id INTEGER NOT NULL,
embedding BLOB NOT NULL,
model TEXT,
dimensions INTEGER,
FOREIGN KEY (document_id) REFERENCES documents(id)
);
CREATE INDEX idx_embeddings_document_id ON embeddings(document_id);
Columns:
id: Unique identifierdocument_id: Foreign key to documentsembedding: Binary vector datamodel: Embedding model namedimensions: Vector dimension count
Note: This table is only present if --include-embeddings was used during export.
4. export_metadata
Export metadata and versioning information.
CREATE TABLE export_metadata (
key TEXT PRIMARY KEY,
value TEXT
);
Required Keys:
format_version: Export format version (e.g., "1.0")exported_at: Export timestamp (ISO 8601)
Example:
SELECT * FROM export_metadata;
| key | value |
|---|---|
| format_version | 1.0 |
| exported_at | 2025-11-06T19:30:00Z |
Manifest File Format
The manifest is a JSON file with export metadata.
Structure
{
"format_version": "1.0",
"exported_at": "2025-11-06T19:30:00Z",
"project_name": "dealer_123",
"export_file": "dealer_123_export_20251106_193000.db",
"knowledge_bases": [
{
"name": "dealer_123-knowledge_docs",
"type": "documentation",
"description": "Service guides, FAQs, and policies"
},
{
"name": "dealer_123-project_profile",
"type": "profile",
"description": "Business context and standards"
}
],
"stats": {
"kb_count": 2,
"total_documents": 57,
"file_size_bytes": 91234567,
"file_size_mb": 87.0,
"includes_embeddings": true
},
"schema": {
"tables": ["knowledge_bases", "documents", "embeddings", "export_metadata"],
"format": "sqlite3",
"version": "3.0"
}
}
Fields
format_version: Export format specification versionexported_at: When export was created (ISO 8601)project_name: Name of exported projectexport_file: Database filenameknowledge_bases: Array of exported KBsstats: Export statisticsschema: Database schema information
Usage Examples
Basic Queries
List all knowledge bases:
SELECT name, kb_type, document_count
FROM knowledge_bases;
Search documents by keyword:
SELECT d.title, d.content, kb.name
FROM documents d
JOIN knowledge_bases kb ON d.kb_id = kb.id
WHERE d.content LIKE '%oil change%'
LIMIT 10;
Get all documents from specific KB:
SELECT title, content, source_file
FROM documents
WHERE kb_name = 'dealer_123-knowledge_docs'
ORDER BY created_at DESC;
Count documents per KB:
SELECT kb_name, COUNT(*) as doc_count
FROM documents
GROUP BY kb_name;
Integration Patterns
Python Example
import sqlite3
import json
# Load export
conn = sqlite3.connect('dealer_123_export.db')
conn.row_factory = sqlite3.Row
# Check format version
cursor = conn.execute(
"SELECT value FROM export_metadata WHERE key = 'format_version'"
)
version = cursor.fetchone()[0]
assert version == "1.0", f"Unsupported format version: {version}"
# Query documents
def search_knowledge(query_text):
cursor = conn.execute("""
SELECT d.title, d.content, d.source_file, kb.name as kb_name
FROM documents d
JOIN knowledge_bases kb ON d.kb_id = kb.id
WHERE d.content LIKE ?
ORDER BY d.created_at DESC
LIMIT 5
""", (f'%{query_text}%',))
return [dict(row) for row in cursor.fetchall()]
# Example query
results = search_knowledge("appointment booking")
for doc in results:
print(f"{doc['title']} ({doc['kb_name']})")
print(f"Source: {doc['source_file']}")
print(f"Content: {doc['content'][:200]}...")
print()
conn.close()
JavaScript/Node.js Example
const sqlite3 = require('sqlite3').verbose();
// Load export
const db = new sqlite3.Database('dealer_123_export.db');
// Query knowledge
function searchKnowledge(queryText) {
return new Promise((resolve, reject) => {
db.all(`
SELECT d.title, d.content, d.source_file, kb.name as kb_name
FROM documents d
JOIN knowledge_bases kb ON d.kb_id = kb.id
WHERE d.content LIKE ?
LIMIT 5
`, [`%${queryText}%`], (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
// Usage
searchKnowledge('oil change')
.then(results => {
results.forEach(doc => {
console.log(`${doc.title} (${doc.kb_name})`);
console.log(`Source: ${doc.source_file}`);
console.log(`Content: ${doc.content.substring(0, 200)}...`);
console.log();
});
});
Vector Search (Advanced)
If embeddings are included, you can perform vector similarity search using the sqlite-vec extension or by extracting embeddings and using an external vector library.
Using sqlite-vec Extension
import sqlite3
import numpy as np
conn = sqlite3.connect('dealer_123_export.db')
conn.enable_load_extension(True)
conn.load_extension('vec0') # Load sqlite-vec
def vector_search(query_embedding, limit=5):
# Convert embedding to format expected by sqlite-vec
embedding_blob = np.array(query_embedding, dtype=np.float32).tobytes()
cursor = conn.execute("""
SELECT d.title, d.content,
vec_distance_cosine(e.embedding, ?) as distance
FROM documents d
JOIN embeddings e ON d.id = e.document_id
ORDER BY distance ASC
LIMIT ?
""", (embedding_blob, limit))
return cursor.fetchall()
Migration and Updates
Format Version Changes
Future versions may add:
- Additional tables
- New columns (always optional/nullable)
- Enhanced metadata
Backward Compatibility:
- Version 1.x exports will remain readable
- New features will be additive, not breaking
- Format version in manifest and database
Checking Format Version
Always check format version before processing:
def check_format_compatibility(db_path):
conn = sqlite3.connect(db_path)
cursor = conn.execute(
"SELECT value FROM export_metadata WHERE key = 'format_version'"
)
version = cursor.fetchone()[0]
conn.close()
major_version = int(version.split('.')[0])
if major_version > 1:
raise ValueError(f"Unsupported format version: {version}")
return version
Best Practices
For Export
- Include Embeddings if consumer needs semantic search
- Exclude Embeddings for smaller file size if only keyword search needed
- Export Regularly to keep snapshots up to date
- Name Consistently using project name as prefix
For Consumption
- Check Format Version before processing
- Use Indices for fast queries (already created)
- Read-Only Access - treat export as immutable
- Cache Locally - don't query over network
- Handle Missing Data - not all fields are required
File Size Estimates
Typical export sizes:
| Documents | With Embeddings | Without Embeddings |
|---|---|---|
| 10 docs | ~5 MB | ~500 KB |
| 50 docs | ~25 MB | ~2 MB |
| 100 docs | ~50 MB | ~5 MB |
| 500 docs | ~250 MB | ~20 MB |
Note: Sizes vary based on document length and embedding dimensions
Support and Issues
For questions or issues with the export format:
- Check format version compatibility
- Verify manifest file
- Validate schema with reference queries
- See Claude OS documentation
License
Claude OS exports are intended for use with applications consuming the knowledge. The export format itself is documented for integration purposes.
Version History:
- 1.0 (2025-11-06): Initial format specification