Kibana Object Manager
A Git-inspired CLI tool for managing Kibana saved objects in version control. Built with Rust for reliability, speed, and modern DevOps workflows.
What is kibob?
kibob (Kibana Object Manager) helps you manage Kibana dashboards, visualizations, workflows, agents, tools, spaces, and other Kibana assets using a familiar Git-like workflow. Version control your Kibana artifacts alongside your application code, deploy them across environments, and collaborate with your team using standard Git practices.
Key Features
- Git-like workflow -
pull,push, and version control your Kibana assets - Spaces management - Version control and deploy Kibana spaces alongside assets
- Workflows, agents, tools, and skills - Manage newer Kibana APIs alongside saved objects
- Environment management - Easy deployment across dev, staging, and production
- Manifest-based tracking - Explicitly define which objects, spaces, workflows, agents, tools, and skills to manage
- Managed vs. unmanaged - Control whether saved objects can be edited in the Kibana UI
- Flexible filtering - Target specific spaces and APIs with
--spaceand--api - Modern architecture - Built with Rust and a composable ETL pipeline
- Fast and reliable - Concurrent requests, proper error handling, and deterministic file layouts
Installation
Published on:
- Homebrew tap: https://github.com/VimCommando/homebrew-tools
- crates.io: https://crates.io/crates/kibana-object-manager
From Homebrew
&&
From Cargo
From Source
# Binary will be at target/release/kibob
Library Crate
This repository also publishes kibana-sync as a standalone library for Rust
applications that need Kibana API behavior without the kibob project layout or
CLI policy.
[]
= "0.1"
use ;
use Url;
# async
kibana-sync exposes saved objects, spaces, agents, tools, skills, workflows,
capability gates, dependency discovery, tracing instrumentation, and
storage-neutral sync models. It does not read spaces.yml; kibob reads that
file in the CLI crate and passes the resulting registry into the library.
Quick Start
1. Set up environment variables
You can either export variables in your shell or store them in a dotenv file and use --env.
# OR use API key authentication:
# export KIBANA_APIKEY=your_api_key_here
Example .env file:
KIBANA_URL=http://localhost:5601
KIBANA_USERNAME=elastic
KIBANA_PASSWORD=changeme
KIBANA_MAX_REQUESTS=8
2. Test your connection
3. Initialize a project from an export
First, export your dashboards from Kibana UI (Stack Management → Saved Objects → Export).
This creates:
manifest/saved_objects.json- tracks which saved objects to manageobjects/- directory with your exported objects organized by type
Optional: Add spaces management
Create a top-level spaces.yml to manage Kibana spaces:
spaces:
- id: default
name: Default
- id: marketing
name: Marketing
- id: engineering
name: Engineering
Now pull, push, and togo can also manage spaces. Each space definition is stored at {space_id}/space.json.
Optional: Add workflows, agents, tools, and skills
Create per-space manifests like these:
workflows:
- id: workflow-123
name: my-workflow
- id: workflow-456
name: alert-workflow
- id: workflow-789
name: data-pipeline
agents:
- id: agent-123
name: support-agent
tools:
- id: search-tool
name: search-tool
skills:
- id: threat-hunting-copy
name: threat-hunting-copy
Now pull, push, and togo will also manage those APIs for each configured space.
Skills are stored as directories instead of JSON files:
default/
manifest/
skills.yml
skills/
my-skill/
SKILL.md
examples/
query.md
manifest/skills.yml lists the tracked Skills for the space by id and name. Skill directory names use the Kibana Skill id directly; Kibana requires IDs to start and end with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, and underscores. The frontmatter id remains authoritative. When the manifest exists, push and togo include only the listed Skills in manifest order; when it is absent, all skills/*/SKILL.md directories are discovered.
SKILL.md contains YAML frontmatter with id, name, description, tool_ids, and experimental; the markdown body is the API content field. Every other file under the skill directory becomes a referenced_content entry when bundling or pushing: its filename without the extension becomes name, its parent directory becomes relativePath (examples/query.json is projected as ./examples), and its contents become content. The experimental field is preserved locally but omitted from create/update API requests because Kibana 9.4 rejects it in request bodies.
4. Version control with Git
5. Pull changes from Kibana
&&
6. Push to another environment
# Deploy as managed objects (read-only in Kibana UI)
Or with dotenv files:
CLI Commands
Global Options
These options work with every command:
--env <FILE>- load environment variables from a dotenv file. Default:.env. Shorthand values likedev,stage, orprodresolve to.env.dev,.env.stage, and.env.prod--debug- enable debug-level logging
kibob auth
Test connection and authentication to Kibana with the current credentials.
Examples:
kibob init [export] [output_dir]
Initialize a new project from a Kibana NDJSON export file.
Defaults:
exportdefaults toexport.ndjsonoutput_dirdefaults tomanifest.jsonin the current CLI definition
Examples:
Notes:
- If the first argument is a directory,
kiboblooks forexport.ndjsoninside it. initwrites:manifest/saved_objects.jsonobjects/...
kibob pull [dir] [--space <space1,space2,...>] [--api <api1,api2,...>]
Fetch managed content from Kibana into local files.
Defaults:
dirdefaults to.- if
--spaceis omitted,pulloperates on all managed spaces known to the client - if
--apiis omitted,pullprocesses all supported APIs
Supported API filters:
saved_objectsobjectsworkflowsagentstoolsskillsspaces
Examples:
Notes:
--spaceaccepts a comma-separated list.spacesare pulled from top-levelspaces.ymlif it exists.- Per-space workflows, agents, and tools are pulled when their manifests exist:
{space_id}/manifest/workflows.yml{space_id}/manifest/agents.yml{space_id}/manifest/tools.yml
- Per-space skills are pulled from the Skills API and written under
{space_id}/skills/. - Skills require Kibana 9.4.0 or newer and are experimental as of Kibana 9.4.
kibob push [dir] [--managed true|false] [--space <space1,space2,...>] [--api <api1,api2,...>]
Upload local content to Kibana.
Defaults:
dirdefaults to.--managed true- if
--spaceis omitted,pushoperates on all managed spaces known to the client - if
--apiis omitted,pushprocesses all supported APIs
Supported API filters:
saved_objectsobjectsworkflowsagentstoolsskillsspaces
Examples:
Options:
--managed true- saved objects are marked managed/read-only in Kibana UI--managed false- saved objects remain editable in Kibana UI--space <...>- comma-separated list of target space IDs--api <...>- comma-separated list of APIs to push- Skills are tracked in
{space_id}/manifest/skills.ymland projected from{space_id}/skills/*/SKILL.mddirectories to Kibana JSON only when pushing.
kibob add <api> [dir] [options]
Add items to an existing manifest.
Supported APIs:
objectsworkflowsspacesagentstoolsskills
Common options:
--query <TEXT>- search query for API-backed discovery--include <REGEX>- include items whose name matches the regex--exclude <REGEX>- exclude items whose name matches the regex after include filtering--file <FILE>- load items from.jsonor.ndjson--space <space1,space2,...>- space selection/filtering--exclude-dependencies- do not automatically add discovered dependencies for workflows, agents, tools, or skills
Regex notes:
--includeand--excludeuse Rust regex syntax- include is applied first, then exclude
- use
(?i)for case-insensitive matching
Add workflows
Add agents
Add tools
Add skills
The singular shortcut kibob add skill <skill-id> fetches that exact Skill ID, tracks it in {space_id}/manifest/skills.yml, and writes it as {space_id}/skills/{skill-directory}/SKILL.md with referenced markdown files. Skills referenced by agents are written as skill directories, and a skill's tool_ids are added as tool dependencies unless --exclude-dependencies is used.
Add spaces
Add objects (legacy saved objects manifest support)
Important notes:
- For
objects,--objectsis required unless you use--file. - For
spaces,--queryis accepted by the CLI, but space discovery currently fetches all spaces and applies filtering afterward. - For non-
spacesAPIs, the CLI currently uses the first value from--spaceif multiple are supplied.
kibob togo [dir] [--managed true|false] [--space <space1,space2,...>] [--api <api1,api2,...>]
Bundle local content into distributable NDJSON files under bundle/.
Defaults:
dirdefaults to.--managed true
Supported API filters:
saved_objectsobjectsworkflowsagentstoolsskillsspaces
Generated outputs can include:
bundle/{space_id}/saved_objects.ndjsonbundle/{space_id}/workflows.ndjsonbundle/{space_id}/agents.ndjsonbundle/{space_id}/tools.ndjsonbundle/{space_id}/skills.ndjsonbundle/spaces.ndjson
Examples:
Notes:
bundle/spaces.ndjsonis generated when top-levelspaces.ymlexists.--apilets you create partial bundles for specific APIs only.skills.ndjsonis generated from skill directories; JSON is not the at-rest representation.
kibob migrate [dir] [--backup true|false]
Migrate legacy project structure into the multi-space layout.
Defaults:
dirdefaults to.--backup true
Examples:
Migration notes:
- Legacy content is moved into the target space layout:
{space_id}/manifest/saved_objects.json
- At runtime the target space is resolved from
KIBANA_SPACE, falling back todefault.
Use Cases
For Kibana Admins
Back up and version control your dashboards. Easily restore or roll back changes.
For Developers
Store dashboards and related Kibana assets in your application's Git repository. Deploy observability alongside code.
For DevOps Engineers
Automate dashboard and asset deployments in CI/CD pipelines. Keep environments consistent from dev to production.
Documentation
- User Guide - Comprehensive command reference and workflows
- Architecture - Technical deep-dive for contributors
- Examples - Real-world usage scenarios
- Migration Guide - Migrating from legacy format
- Quick Reference - Command cheat sheet
- Contributing - Development guidelines
Agent Skill
This repository includes a Codex skill for kibob workflows:
skills/kibob/SKILL.mdskills/kibob/references/kibob-commands.md
The skill is designed to help with:
- Selecting the right
kibobcommand and flags - Environment promotion workflows (
pull->git commit->push) - Managed mode policy by environment:
- Production:
--managed true - Dev/test:
--managed false
- Production:
Example promotion flow:
# Pull from dev
# Push to stage (dev/test posture)
# Promote to production (production posture)
Authentication
kibob supports multiple authentication methods.
Basic Authentication
API Key
Architecture
kibob uses a modern ETL (Extract-Transform-Load) pipeline architecture:
Pull: Kibana → Extract → Transform → Store Files
Push: Read Files → Transform → Load → Kibana
Built with:
- Rust - memory-safe, fast, reliable
- Tokio - async runtime for efficient I/O
- reqwest - HTTP client with connection pooling
- Clap - CLI framework
- serde - JSON serialization
- dotenvy - dotenv loading
- env_logger - CLI logging
- owo-colors - readable terminal output
Project Structure
A multi-space project typically looks like this:
my-dashboards/
├── spaces.yml
├── default/
│ ├── space.json
│ ├── manifest/
│ │ ├── saved_objects.json
│ │ ├── workflows.yml
│ │ ├── agents.yml
│ │ └── tools.yml
│ ├── objects/
│ │ ├── dashboard/
│ │ │ ├── abc-123.json
│ │ │ └── xyz-789.json
│ │ ├── visualization/
│ │ │ └── def-456.json
│ │ └── index-pattern/
│ │ └── logs-*.json
│ ├── workflows/
│ │ ├── my-workflow.json
│ │ └── alert-workflow.json
│ ├── agents/
│ │ └── my-agent.json
│ └── tools/
│ └── search-tool.json
├── marketing/
│ ├── space.json
│ ├── manifest/
│ │ ├── workflows.yml
│ │ └── tools.yml
│ ├── workflows/
│ │ └── campaign-workflow.json
│ └── tools/
│ └── campaign-tool.json
└── bundle/
├── default/
│ ├── saved_objects.ndjson
│ ├── workflows.ndjson
│ ├── agents.ndjson
│ └── tools.ndjson
├── marketing/
│ ├── workflows.ndjson
│ └── tools.ndjson
└── spaces.ndjson
A freshly initialized single-space project from kibob init starts simpler:
my-dashboards/
├── manifest/
│ └── saved_objects.json
└── objects/
Managing Kibana Spaces
kibob can manage Kibana Spaces alongside saved objects. Create a top-level spaces.yml:
spaces:
- id: default
name: Default
- id: marketing
name: Marketing
- id: engineering
name: Engineering
Then use the same workflow:
Each space definition is stored in its own directory as {space_id}/space.json. For example:
default/space.jsonmarketing/space.jsonengineering/space.json
See the Spaces Guide for complete documentation.
Migrating from Bash Version
If you have an existing project using the old Bash script:
# Migrate the legacy structure
# Review the migrated manifest
# Test by pulling from Kibana
See Migration Guide for details.
Environment Variables Reference
| Variable | Description | Default |
|---|---|---|
KIBANA_URL |
Kibana base URL | Required |
KIBANA_USERNAME |
Basic auth username | Optional |
KIBANA_PASSWORD |
Basic auth password | Optional |
KIBANA_APIKEY |
API key authentication | Optional |
KIBANA_SPACE |
Default target space used by some workflows | default |
KIBANA_MAX_REQUESTS |
Maximum number of concurrent requests | 8 |
Support
- Issues: https://github.com/VimCommando/kibana-object-manager/issues
- Discussions: https://github.com/VimCommando/kibana-object-manager/discussions
Contributing
Contributions are welcome. See CONTRIBUTING.md for development setup and guidelines.
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.