Understand your content.
Tags, metadata, and analysis — modular by design.

Universal metadata intelligence core with product-specific modules. Senza stays fully supported; Cultiva foundation is prepared for the next generation of Glyph integrations.

View on GitHub Read the docs
v2.7.0 module: senza module: cultiva JS + Python

What’s new in 2.7

From Senza-specific pipeline to a universal core with pluggable product modules — without breaking existing integrations.

Universal contracts

normalizeInput() and normalizeResult() define a stable API surface. Any product module receives the same shape and returns a consistent result envelope.

Module routing

analyzeUniversal(input, { moduleId }) routes to the right handler. Unknown modules fall back to the default Senza analyzer with a hint in the response.

Senza module adapter

Full Senza pipeline — tags, metadata, spectral analysis, kNN, local agent — wrapped as module-senza with zero behavior change for existing callers.

Cultiva foundation

Scaffold module and knowledge pack placeholder for future Cultiva product integration. Manifest, handler stub, and cultiva-foundation-v1.json ready for extension.

Architecture

Product-agnostic core with module adapters on top of the existing analysis pipeline.

analyzeUniversal(input, { moduleId })
  │
  ├─ module: senza → analyzeForSenza() → Senza pipeline (tags, spectral, kNN)
  ├─ module: cultiva → analyzeForCultivaFoundation() → scaffold
  └─ fallback → analyzeMI() → normalizeResult()

contracts.js normalizeInput / normalizeResult / GLYPH_MI_API_VERSION
engine.js listGlyphModules / resolveGlyphModule / MODULE_HANDLERS

Modules

Each module has a manifest, handler, and optional knowledge pack.

Active

senza

Music library metadata intelligence for Senza. Capabilities: tags, metadata, spectral analysis, kNN neighbors, local agent hints. Enabled by default.

Foundation

cultiva

Placeholder for Cultiva product integration. Manifest and handler scaffold in place; knowledge pack at knowledge/public/cultiva-foundation-v1.json.

API quick start

JavaScript universal entry and Python CLI for batch analysis.

import { analyzeUniversal, listGlyphModules } from './js/index.js'; const modules = listGlyphModules(); // [{ moduleId: 'senza', ... }, { moduleId: 'cultiva', ... }] const result = await analyzeUniversal({ moduleId: 'senza', track: { path: '/music/artist/album/track.flac', title: 'Track' }, context: { app: 'senza' }, }, { moduleId: 'senza' }); // result: { apiVersion, moduleId, fields, confidence, sources, hints }

Python CLI

pip install -e ".[spectral]"
glyph-mi analyze --help

Where glyph-mi runs

Senza desktop

Primary consumer. Full pipeline with spectral features, kNN tag propagation, and local agent integration.

glyph-miO (Obsidian)

Obsidian plugin with simplified extractive summaries and tag scoring. Shares design principles, lighter runtime.

Custom integrations

Use analyzeUniversal() with your own moduleId or extend the module registry for new products.

Glyph 2.7 family

Search and metadata intelligence, built to work together.