Skip to content

Releases: AgriciDaniel/claude-obsidian

Claude Obsidian v2.1.0 - Native Windows Compatibility

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 31 Jul 18:05
a3b3df4

Native Windows Compatibility

Native Windows previously crashed on every vault command with
AttributeError: os has no attribute 'O_DIRECTORY' (#147). Now:

  • Read-only works natively: inspection, dry-runs, and retrieval run on
    Windows with real equivalent safety checks (path-based alias auditing,
    lstat identity, symlink and junction rejection).
  • Writes fail closed, cleanly: ERR UNSUPPORTED_PLATFORM (exit 2) before
    any side effect — use WSL for mutations.
  • CRLF fixes for every platform: binary-mode reads end false hash
    mismatches, and retrieval no longer returns zero results on CRLF vaults.
  • Windows CI: a new windows-smoke job plus a 16-test compatibility
    suite guard against regressions.

Full notes: CHANGELOG.md · Closes #147 via #150

Claude Obsidian v2.0.0 — Reliability and Evidence Refoundation

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 29 Jul 21:52

Claude Obsidian v2.0.0 — Reliability and Evidence Refoundation

Claude Obsidian 2.0 rebuilds the product around recoverable operations,
source-grounded knowledge, and a clean separation between product code and
user-owned vaults.

Highlights

  • Added the host-neutral claude_obsidian standard-library core.
  • Added inspected, recoverable transactions with crash recovery and explicit
    Git checkpoints.
  • Added source and claim provenance ledgers, deterministic linting, capability
    contracts, and package validation.
  • Added dry-run-first vault initialization, adoption, migration, capture, and
    extension setup.
  • Added a reproducible public-artifact builder with privacy, secret, path,
    archive, and symlink defenses.
  • Normalized all 15 skills around one portable operation contract.
  • Hardened retrieval, including bounded CJK tokenization and deterministic BM25
    fallback behavior.
  • Replaced automatic shared writes and lifecycle commits with explicit,
    reviewed operations.
  • Removed contributor-vault state, duplicate command mirrors, stale templates,
    and unsupported claims from the public distribution.

Compatibility

Existing vaults remain readable. Migration is additive and idempotent, and
legacy raw-source metadata is preserved.

Verification

  • Full hermetic suite and executable contracts: passed on Ubuntu and macOS,
    Python 3.11–3.14
  • Focused release tests: 39/39 passed
  • Package validation: 15 skills, zero findings
  • Secret review: 208 raw scanner detections classified as deterministic hashes,
    examples, or negative security fixtures; zero unresolved secrets and zero
    open GitHub secret-scanning alerts
  • Audited public artifact: zero symlinks; SHA-256
    cafecd7090d8460b1485ec7ffc9fc3653b81a3805f59cdd6283face2d3430aeb

See CHANGELOG.md
for the complete change history and
README.md for
installation and usage.

v1.9.2: Compound Vault, Methodology Modes, and the Thinking Framework

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 28 May 00:33

This release brings the public repo current with the full v1.7 to v1.9.2 line. claude-obsidian is a self-organizing AI second brain for Obsidian + Claude Code: drop any source and Claude reads, links, and files it into one connected knowledge graph of plain Markdown you own.

Highlights since v1.6.0

  • v1.7 "Compound Vault": Obsidian CLI as the default transport, hybrid retrieval (contextual prefix + BM25 + cosine rerank, per Anthropic's Sept 2024 contextual retrieval research), and per-file advisory locking that closes a latent multi-writer corruption hole. Verified at +32pp top-1 accuracy over the v1.6 baseline on a 50-query benchmark.
  • v1.8 Methodology Modes: first-class organizational support for LYT, PARA, Zettelkasten, and Generic. New pages route automatically based on the mode you pick.
  • v1.9 Thinking Framework: the 10-principle thinking loop as an invocable /think skill, plus audit hardening across the plugin.
  • v1.9.2: Anthropic prompt-cache hardening and path-handling robustness in the contextual-prefix generator. Cache markers now attach only above the Haiku cacheable floor, with integer-only cache telemetry that preserves the opt-in data-egress posture. make test is 9 hermetic suites green.

Install

claude plugin marketplace add AgriciDaniel/claude-obsidian
claude plugin install claude-obsidian@agricidaniel-claude-obsidian

Or clone as a vault:

git clone https://github.com/AgriciDaniel/claude-obsidian
cd claude-obsidian && bash bin/setup-vault.sh

Free and open source (MIT). Your notes stay plain Markdown that you own. Full details in CHANGELOG.md.

v1.6

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 24 Apr 10:17

DragonScale is now a four-mechanism, opt-in memory layer for LLM wiki vaults.

DragonScale Memory mechanism overview

TL;DR

  • Shipped: DragonScale now has fold rollups, deterministic page addresses, semantic tiling lint, and boundary-first autoresearch.
  • Gated on: bash bin/setup-dragonscale.sh, plus local dependencies per mechanism.
  • Did not ship: fold-of-folds, calibrated tiling thresholds, hosted mode, or multi-vault rollup.

Same-day release sequence

The plugin version is 1.6.0 and the annotated tag v1.6.0 points at the release commit on main.

The narrative below includes 1.5.0, 1.5.1, and 1.6.0 because 2026-04-24 bundled three local release states into one cycle.

1.5.0 was Phase 3.5.
It hardened the DragonScale base.
It added the installer, test harness, changelog, Makefile targets, and opt-in wiring for the first three mechanisms.
It also synced plugin metadata to 1.5.0.

1.5.1 was Phase 3.6.
It fixed five narrow issues before Phase 4.
Those fixes covered tiling report path confinement, rollout baseline date, AGENTS wording, .raw/ manifest wording, and install-guide version drift.

1.6.0 was Phase 4.
It shipped Mechanism 4: boundary-first autoresearch.
It added scripts/boundary-score.py, wired no-topic /autoresearch into frontier suggestions, added boundary-score tests, and bumped the DragonScale spec to v0.4.

Four mechanisms

1. Fold operator

What:
extractive rollups of wiki/log.md entries into fold pages under wiki/folds/.

Invoke:
ask fold the log, dry-run k=3, then fold the log, commit k=3 if the output is right.

Skip:
skip when the log has no coherent batch, or when you want deletion-based compaction.
Folds summarize.
They do not garbage collect.

Status:
shipped in 1.5.0.

First real run:
wiki/folds/fold-k3-from-2026-04-23-to-2026-04-24-n8.md.

Observed output:
115 lines.
8 children.
Flat extractive fold.

2. Deterministic page addresses

What:
stable address: c-NNNNNN frontmatter for new non-meta wiki pages.

Invoke:
run ./scripts/allocate-address.sh directly, or let wiki-ingest assign addresses after DragonScale setup.

Skip:
skip when you do not need stable page IDs, or when more than one writer may assign addresses at the same time.

Status:
shipped in 1.5.0.

Format:
c-000042.

Important limit:
this is a creation-order counter.
It is not a content hash.

Validation run:
counter advanced from 2 to 3.
It returned c-000002.
The unassigned reservation gap is acceptable under the spec.

3. Semantic tiling lint

What:
embedding-based duplicate-page detection for the wiki.

Invoke:
run python3 ./scripts/tiling-check.py --peek for readiness, or python3 ./scripts/tiling-check.py --report wiki/meta/tiling-report-YYYY-MM-DD.md for a saved report.

Skip:
skip when ollama or nomic-embed-text is unavailable, or when uncalibrated review bands would create more noise than signal.

Status:
shipped in 1.5.0.

Default model:
local nomic-embed-text through ollama.

Default bands:
>= 0.90 error.
0.80 to 0.90 review.
Below 0.80 pass.

Important limit:
the defaults are seed values.
They are not calibrated to this vault.

First full report:
wiki/meta/tiling-report-2026-04-24.md.

4. Boundary-first autoresearch

What:
frontier scoring for wiki pages, used as candidate selection for no-topic /autoresearch.

Invoke:
run /autoresearch with no topic in a DragonScale-enabled vault, or run python3 ./scripts/boundary-score.py --json --top 5.

Skip:
skip when you want explicit topic control only, or when you want DragonScale limited to pure memory operations.

Status:
shipped in 1.6.0.

Formula:
boundary_score(p) = (out_degree(p) - in_degree(p)) * exp(-days_since_updated / 30).

What it does:
finds pages that point outward, receive few inbound links, and are still recent enough to be useful.

What it is not:
it is not pure memory.
It is agenda control.
The user still chooses the topic.

First run artifact:
wiki/meta/boundary-frontier-2026-04-24.md.

Top frontier facts:
22 scoreable pages.
7 positive-score pages reported.
Top score was 4.693.
DragonScale Memory scored 4.000.

The dragon curve, briefly

The Heighway dragon is built by paperfolding recursion.
Each construction step folds a turn sequence into a larger self-similar sequence.
The turn sequence is the regular paperfolding sequence, OEIS A014577.
See Dragon curve.

Its boundary has fractal dimension about 1.5236.
That number is useful here as orientation, not as proof.
It says the boundary is not a simple line and not a filled plane.
It is structured frontier.

That makes it a good analogy for a memory layer.
Recursive structure suggests hierarchical rollup.
Self-similar boundary suggests frontier-first agenda.
But this is analogy, not derivation.
DragonScale does not prove optimal memory behavior from curve geometry.

Enablement

Run:

bash bin/setup-dragonscale.sh

Prereqs:
base vault setup first, flock for allocator and tiling locks, python3 for Mechanisms 3 and 4, and local ollama plus nomic-embed-text for Mechanism 3.

Guide:
docs/dragonscale-guide.md.

Validation

Six-test validation flow

Validation date:
2026-04-24.

Source:
wiki/log.md, entry DragonScale end-to-end validation pass (Teams, 6 tests).

Result:
the six-test menu passed.
make test stayed green throughout.

T0:
pulled nomic-embed-text for local embeddings.

Observed:
274 MB.
15 seconds wall time.

T1:
ran Mechanism 1 dry-run with k=3.

Observed:
dry-run OK.
8 children.
No em dashes in generated fold content.

T2:
ran Mechanism 2 real allocation.

Observed:
counter advanced from 2 to 3.
Returned c-000002.
The address was an unassigned reservation.
Gap accepted by spec.

T3:
ran Mechanism 3 full tiling with model present.

Observed:
41 pages scanned.
21 pages embedded.
20 pages skipped.
0 errors at >= 0.90.
15 review pairs in 0.80 to 0.90.

Top review pair:
0.8822 for Compounding Knowledge and LLM Wiki Pattern.

Interpretation:
legitimate semantic neighbor.
Not an automatic merge.

Report:
wiki/meta/tiling-report-2026-04-24.md.

T4:
ran Mechanism 1 commit.

Observed:
first real fold committed.
115 lines.
8 children.
Flat extractive fold.

Fold:
wiki/folds/fold-k3-from-2026-04-23-to-2026-04-24-n8.md.

Why it matters:
it flips the old status from dry-run only to one committed fold in this vault.

Closeout test status:
make test passed.

Closeout counts:
12 shell assertions for address allocation.
18 Python assertions for tiling.
44 Python assertions for boundary scoring.
Zero ollama dependency.

T6:
ran Mechanism 4 no-topic autoresearch.

Observed:
selected How does the LLM Wiki pattern work?.
Score 1.7022.
It was candidate number 3 after skipping the top source page and top self-reference.

Fetches:
6 web fetches.

Inputs included:
Karpathy gist.
RAG paper arXiv:2005.11401.
MemGPT paper arXiv:2310.08560.
Obsidian docs.

Output:
3 new concept pages filed.
Each included Primary Sources.

New concept pages:

  • wiki/concepts/Persistent Wiki Artifact.md
  • wiki/concepts/Source-First Synthesis.md
  • wiki/concepts/Query-Time Retrieval.md

Integration:
the new concepts were added to wiki/index.md and wiki/concepts/_index.md.
They extend How does the LLM Wiki pattern work?.
They cross-reference LLM Wiki Pattern.

Boundary-first autoresearch: frontier picked, pages filed

What is not in v1.6.0

  • No fold-of-folds.
  • No hierarchical level stacking beyond one flat committed fold.
  • No automatic deletion or compaction of child pages.
  • No calibrated M3 thresholds.
  • No literature-backed M3 bands for this specific vault.
  • No automatic merging from tiling results.
  • No pure-memory claim for M4.
  • No hidden topic choice in M4.
  • No hosted or managed mode.
  • No multi-vault fold rollup.
  • No multi-writer address-assignment guarantee.
  • No alias-aware full Obsidian wikilink resolver in boundary scoring.
  • No persistent boundary-score cache.
  • No automatic autoresearch trigger.

Upgrade from v1.4.x

This is non-breaking for base users.

Upgrade path:

  1. Pull main.
  2. Reinstall as a plugin if your agent setup requires it.
  3. Keep using the normal v1.4.x wiki workflow if you do not want DragonScale.
  4. Opt into DragonScale only when ready:
bash bin/setup-dragonscale.sh

If you do not opt in, nothing changes from your v1.4.x workflow.

DragonScale is feature-detected.
wiki-ingest, wiki-lint, and /autoresearch fall back when the setup state or helper dependencies are absent.

Attribution

Diagrams in this release note are original SVGs under the repo license (MIT).

The dragon curve and paperfolding references are text-only. For images and construction history, see the Wikipedia article linked above.

Fonts used in the SVGs: Space Grotesk (SIL Open Font License), with system-ui fallback.

Credits

  • Karpathy LLM Wiki pattern.
  • Heighway paperfolding and the dragon curve analogy.
  • Codex sub-agent delegation for the release validation and review loop.

v1.4.3

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 10 Apr 15:34

Cross-link with claude-canvas

Links claude-obsidian and claude-canvas so users can discover both plugins and understand when to use which.

Changes

  • plugin.json: Added canvas and visual keywords for discoverability
  • canvas SKILL.md: Added "See Also" section directing users to claude-canvas for advanced canvas orchestration (12 templates, 6 layout algorithms, AI generation, presentations)
  • README.md: Added callout after canvas commands table pointing to claude-canvas

Scope clarification

Plugin Use when
claude-obsidian /canvas Wiki-scoped visual boards inside your vault
claude-canvas Full visual production — templates, layout algorithms, AI generation, presentations, export

Both plugins complement each other. Install both for the complete canvas experience.

v1.4.2

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 09 Apr 15:58

Bug Fix

Fixed: Infinite Stop hook loop (#critical)

The Stop hook used "type": "prompt" with an empty matcher, causing an infinite loop for all users:

  1. Claude stops → Stop hook fires → prompt asks Claude to evaluate a condition
  2. Claude responds "nothing to do" → that's a new Stop event → hook fires again
  3. Repeat forever, burning context and blocking the session

Fix: Replaced with "type": "command" that runs a shell script checking git diff for actual wiki/ file changes. If no wiki files were modified, it exits silently — no output means Claude is never prompted, breaking the loop.

Improved: Hook architecture

  • SessionStart: Added startup|resume matcher (was empty — fired in every project). Added command hook to cat wiki/hot.md directly for faster context restore.
  • PostCompact (new): Re-injects hot cache after context compaction so wiki context survives long sessions.
  • PostToolUse (new): Auto-commits wiki changes on Write/Edit operations.

Upgrade

Users on v1.4.1 or earlier should update to stop the loop. No configuration changes needed.

v1.4.1: Fix plugin install command syntax

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 08 Apr 19:38

Hotfix for an incorrect install command in the v1.4.0 docs.

The Problem

The README and install guide in v1.4.0 (and all prior releases) showed this install command:

claude plugin install github:AgriciDaniel/claude-obsidian

This form does not exist in Claude Code. Users trying it see:

Failed to install plugin "github:AgriciDaniel/claude-obsidian": Plugin "github:AgriciDaniel/claude-obsidian" not found in any configured marketplace

The Fix

Per the official plugin-marketplaces docs, plugin installation is a two-step process. First you add the marketplace catalog, then install the plugin from it.

# Step 1: add the marketplace
claude plugin marketplace add AgriciDaniel/claude-obsidian

# Step 2: install the plugin
claude plugin install claude-obsidian@claude-obsidian-marketplace

Verify the install:

claude plugin list

In any Claude Code session, type /wiki to start.

Files Changed

  • README.md: Option 2 install section rewritten with the two-step flow
  • docs/install-guide.md: Same correction
  • .claude-plugin/plugin.json: 1.4.0 to 1.4.1
  • .claude-plugin/marketplace.json: 1.4.0 to 1.4.1

Upgrade

If you are on v1.4.0 or earlier and could not install:

claude plugin marketplace add AgriciDaniel/claude-obsidian
claude plugin install claude-obsidian@claude-obsidian-marketplace

If you already have the plugin installed and want to update:

claude plugin marketplace update claude-obsidian-marketplace

v1.4.0: Audit Fixes, Multi-Agent Compatibility, Bases Dashboard

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 08 Apr 14:42

External audit (compass artifact, 21 sources) flagged 8 actionable items against current best practices for Agent Skills, Claude Code hooks, Obsidian v1.9 to v1.12, and JSON Canvas 1.0. This release addresses all of them and adds multi-agent compatibility files at zero cost to existing users.

Audit score: 6.5/10, target 8/10 after this release.

Security Note

This release also scrubs a placeholder email reference from marketplace.json and supporting docs, and rewrites git history to remove it from all prior commits. The owner field in marketplace.json now uses the GitHub profile URL instead of an email.

Tier 1: Critical Fixes

Dataview to Bases Dashboard

  • NEW wiki/meta/dashboard.base: native Obsidian Bases dashboard with 6 views (Recent Activity, Seed Pages, Entities Missing Sources, Open Questions, Comparisons, Sources). Works in Obsidian v1.9.10+ with zero plugin install.
  • wiki/meta/dashboard.md: now embeds the Bases file as primary. Legacy Dataview queries retained as optional fallback for older Obsidian versions.
  • README.md and skills/wiki/references/plugins.md: Plugins section reorganized. Bases (core, no install) is now primary, Dataview marked optional/legacy.

Canvas Spec Completeness

skills/canvas/references/canvas-spec.md updated with previously missing JSON Canvas 1.0 fields:

  • Group nodes: background and backgroundStyle (cover / ratio / repeat)
  • Edges: fromEnd (default "none") and toEnd (default "arrow"). Asymmetric defaults that produce a single arrow without explicit specification.
  • Hex ID format documented as the official JSON Canvas convention alongside the descriptive ID alternative.

Version Alignment

Bumped from 1.3.0 to 1.4.0 to keep plugin.json in lockstep with the GitHub release tag (v1.4.0).

Tier 2: Important Improvements

Hooks Hardening + PostCompact

hooks/hooks.json:

  • SessionStart now uses both command and prompt types. The command type runs [ -f wiki/hot.md ] && cat wiki/hot.md || true as the canonical safety check. Works in non-vault sessions without erroring. Matcher: startup|resume.
  • NEW PostCompact hook re-injects wiki/hot.md after context compaction. Hook-injected context does NOT survive compaction (only CLAUDE.md does), so this restores the hot cache mid-session.
  • PostToolUse auto-commit now guarded by [ -d .git ] so it never errors in non-git directories.
  • NEW hooks/README.md documents all hooks plus the known plugin-hooks STDOUT bug (anthropics/claude-code#10875) and workarounds.

MCP Setup Updated

skills/wiki/references/mcp-setup.md:

  • NEW Option D: Obsidian CLI (v1.12+). No MCP server, no plugins, no TLS workarounds. Recommended for new installs.
  • > [!warning] callout above the NODE_TLS_REJECT_UNAUTHORIZED: "0" line explaining the process-wide TLS bypass and pointing users to Option D as the secure alternative.

Custom Callouts Documented

  • skills/wiki-ingest/SKILL.md: explicit note that [!contradiction] is a custom callout requiring vault-colors.css.
  • skills/wiki/references/css-snippets.md: full documentation of all four custom callouts (contradiction, gap, key-insight, stale) with their colors, icons, use cases, and built-in fallback equivalents.

Tier 3: Multi-Agent Compatibility

The plugin now ships with bootstrap files for 6 AI agents at zero compatibility cost. Skills are already in the cross-platform Agent Skills format (only name + description in frontmatter, matching the kepano/obsidian-skills convention).

File For
AGENTS.md Codex CLI, OpenCode
GEMINI.md Gemini CLI, Antigravity
.cursor/rules/claude-obsidian.mdc Cursor (always-on rules)
.windsurf/rules/claude-obsidian.md Windsurf Cascade
.github/copilot-instructions.md GitHub Copilot
bin/setup-multi-agent.sh Idempotent symlink installer

Run once to wire up the skills directory in every agent's expected location:

bash bin/setup-multi-agent.sh

Style Cleanup

Scrubbed all em dashes from every skill, hook, doc, and bootstrap file (249 total replacements across 26 files). Skills now use periods, commas, and colons throughout for cleaner natural prose.

Already Resolved in v1.1 (audit was outdated)

For completeness, these audit findings were already addressed in v1.1:

  • defuddle, obsidian-bases, obsidian-markdown skills shipped
  • URL ingestion, vision ingestion, delta tracking documented in wiki-ingest
  • Multi-depth wiki-query (Quick / Standard / Deep modes)
  • PostToolUse auto-commit hook
  • Invalid allowed-tools field removed from all SKILL.md files
  • All templates use plural tags/aliases (Obsidian v1.9.10+ requirement)
  • Custom callouts CSS already in .obsidian/snippets/vault-colors.css

Deferred to v1.5.0

  • /adopt command (import existing vaults)
  • Vault graph analysis enhancement to wiki-lint
  • Semantic search via qmd MCP server
  • Marp slide output

Verification

After upgrading:

  1. Open wiki/meta/dashboard.base in Obsidian. Confirm the table view renders.
  2. Disable Dataview plugin. Confirm the Bases dashboard still works.
  3. Open Claude Code in a non-vault directory. SessionStart hook should not error.
  4. Run bash bin/setup-multi-agent.sh. Symlinks created in ~/.codex/skills/, etc.
  5. Edit any wiki page. Auto-commit hook fires.

v1.1 — URL ingestion, vision, delta tracking, 3 new skills

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 08 Apr 09:25

What's New in v1.1

3 New Skills

/obsidian-markdown — Full Obsidian Flavored Markdown syntax reference. Covers wikilinks, embeds, all callout types, properties rules, highlights, math, Mermaid diagrams, and what not to do. Consulted automatically when writing wiki pages.

/obsidian-bases — Create and edit Obsidian Bases (.base files) — Obsidian's native database layer. Correct filters:/views:/formulas: syntax with wiki-specific templates for dashboards, entity indexes, and source trackers. First LLM wiki plugin to support this feature.

/defuddle — Web page cleaner powered by defuddle-cli. Strips ads, nav bars, cookie banners, and boilerplate before ingesting web content. Saves 40–60% tokens on typical articles.


wiki-ingest Upgrades

  • URL ingestion — Pass any https:// URL directly. Auto-fetches, runs defuddle if installed, saves to .raw/articles/, then proceeds through normal ingest pipeline.
  • Image/vision ingestion — Pass .png, .jpg, .gif, .webp etc. Claude reads the image, extracts text and concepts via vision, saves description to .raw/images/, then ingests.
  • Delta tracking.raw/.manifest.json tracks a hash per ingested source. Re-running ingest on unchanged files is skipped automatically. Use force ingest to override.

wiki-query: 3 Query Depths

Mode Trigger Token cost Best for
Quick query quick: ... ~1,500 Fast fact lookups from hot cache + index
Standard default ~3,000 Most questions
Deep query deep: ... ~8,000+ Synthesis, comparisons, full analysis

Auto-Commit Hook

Every Write or Edit to wiki/ or .raw/ now triggers an automatic git commit. The vault is always versioned without manual intervention.


Fixes

  • Removed invalid allowed-tools field from all 10 SKILL.md files — it was never a valid skill frontmatter attribute and was being silently ignored. Skills now match the Agent Skills spec (same format as kepano/obsidian-skills).
  • Canvas skill now references the JSON Canvas open standard and kepano/obsidian-skills as the authoritative cross-platform spec.

Ecosystem Research Filed

Comprehensive research across 16+ Claude + Obsidian projects now filed in the demo vault:

  • wiki/comparisons/claude-obsidian-ecosystem.md — full feature matrix
  • wiki/concepts/cherry-picks.md — prioritised v1.2+ roadmap
  • 6 new entity pages for key projects in the ecosystem