OB

obsidian-cost-tuning

Guide to reducing Obsidian Sync and Publish costs by managing vault size and plugin API consumption.

Install

mkdir -p .claude/skills/obsidian-cost-tuning && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/1602" && unzip -o skill.zip -d .claude/skills/obsidian-cost-tuning && rm skill.zip

Installs to .claude/skills/obsidian-cost-tuning

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Optimize Obsidian resource usage, sync storage, Publish hosting, and
68 charsno explicit “when” trigger
Intermediate

Key capabilities

  • Audit total vault size and file types
  • Identify top largest files in a vault
  • Exclude files from Obsidian Sync using patterns
  • Compress images for storage savings
  • Implement API caching for community plugins
  • Set up rate limiting for external API calls

How it works

The skill audits vault storage and identifies large files or types. It then provides methods to exclude files from sync, compress media, and implement caching or rate limiting for plugin API calls.

Inputs & outputs

You give it
Obsidian vault directory path and community plugin configurations
You get back
Analysis of vault storage, optimized sync patterns, or code for API cost control

When to use obsidian-cost-tuning

  • Reducing Obsidian Sync storage usage
  • Optimizing Publish bandwidth costs
  • Auditing vault file size
  • Implementing API caching for plugins

About this skill

Obsidian Cost Tuning

Overview

Optimize costs across Obsidian's paid services and third-party plugin API usage. Covers Obsidian Sync storage management ($4-$10/mo), Publish hosting optimization ($8/mo per site), vault size reduction strategies, plugin API cost control with caching and quotas, and self-hosted alternatives for zero-cost sync.

Prerequisites

  • Understanding of your Obsidian subscription tier
  • Terminal access to the vault directory
  • Knowledge of which community plugins make external API calls

Cost Structure

ServicePriceStorageCost Driver
Obsidian (core)FreeN/ANone
Catalyst (early access)$25 one-timeN/AOne-time
Sync (Standard)$4/mo1 GBVault size, attachment count
Sync (Plus)$8/mo10 GBLarge vaults with media
Publish$8/mo per siteN/APublished page count, bandwidth
Plugin API costsVariesN/APer-call pricing (AI, translation, etc.)

Instructions

Step 1: Audit Vault Size and Storage Usage

set -euo pipefail
VAULT_PATH="${1:-$HOME/MyVault}"

echo "=== Vault Storage Audit ==="
echo "Total vault size: $(du -sh "$VAULT_PATH" 2>/dev/null | cut -f1)"
echo ".obsidian size: $(du -sh "$VAULT_PATH/.obsidian" 2>/dev/null | cut -f1)"
echo ""

# File counts by type
echo "=== Files by Type ==="
command find "$VAULT_PATH" -type f -not -path '*/.obsidian/*' -not -path '*/.trash/*' \
  | sed 's/.*\.//' | sort | uniq -c | sort -rn | head -15

echo ""
echo "=== Top 20 Largest Files ==="
command find "$VAULT_PATH" -type f -not -path '*/.obsidian/*' \
  -exec du -h {} + 2>/dev/null | sort -rh | head -20

echo ""
echo "=== Plugin Cache Sizes ==="
for dir in "$VAULT_PATH/.obsidian/plugins"/*/; do
  [ -f "$dir/data.json" ] || continue
  size=$(du -h "$dir/data.json" 2>/dev/null | cut -f1)
  echo "  $(basename "$dir")/data.json: $size"
done

Step 2: Reduce Sync Storage — Exclusion Patterns

Obsidian Sync respects .obsidian/sync-exclude.json for excluding paths:

{
  "patterns": [
    "*.pdf",
    "*.mp4",
    "*.mov",
    "*.zip",
    "*.tar.gz",
    "attachments/archives/**",
    "node_modules/**",
    ".git/**"
  ]
}

For manual file-level control:

# Find files over 5MB that consume sync bandwidth
command find "$VAULT_PATH" -type f -size +5M -not -path '*/.obsidian/*' \
  -exec du -h {} + | sort -rh

# Count sync-heavy file types
echo "PDF count: $(command find "$VAULT_PATH" -name '*.pdf' | wc -l)"
echo "Image count: $(command find "$VAULT_PATH" \( -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) | wc -l)"
echo "Total attachments: $(du -sh "$VAULT_PATH/attachments" 2>/dev/null | cut -f1)"

Strategies to stay under the 1 GB Sync Standard tier:

  • Move PDFs to a local folder outside the vault, link with ` URIs
  • Compress images before adding: pngquant --quality=65-80 *.png or ImageOptim
  • Use external image hosting (Cloudinary free tier: 25 credits/mo, ~25K transforms)
  • Exclude .obsidian/plugins/*/data.json — plugin caches regenerate on launch

Step 3: Optimize Plugin API Costs

Plugins that call external APIs (AI assistants, translation, image generation) can incur per-call costs. Implement caching in your plugin:

// src/services/api-cache.ts
import { Plugin } from 'obsidian';

interface CacheEntry<T> {
  result: T;
  timestamp: number;
}

export class APICache<T> {
  private cache = new Map<string, CacheEntry<T>>();
  private ttlMs: number;

  constructor(ttlMinutes: number = 60) {
    this.ttlMs = ttlMinutes * 60 * 1000;
  }

  get(key: string): T | null {
    const entry = this.cache.get(key);
    if (!entry) return null;
    if (Date.now() - entry.timestamp > this.ttlMs) {
      this.cache.delete(key);
      return null;
    }
    return entry.result;
  }

  set(key: string, result: T) {
    this.cache.set(key, { result, timestamp: Date.now() });
    // Prevent unbounded growth
    if (this.cache.size > 1000) {
      const oldest = this.cache.keys().next().value;
      if (oldest) this.cache.delete(oldest);
    }
  }

  /** Wrap an API call with cache-first logic */
  async getOrFetch(key: string, fetchFn: () => Promise<T>): Promise<T> {
    const cached = this.get(key);
    if (cached !== null) return cached;
    const result = await fetchFn();
    this.set(key, result);
    return result;
  }

  clear() { this.cache.clear(); }
  get size() { return this.cache.size; }
}

// Usage in plugin
const aiCache = new APICache<string>(24 * 60); // 24-hour TTL

async function getSummary(noteContent: string): Promise<string> {
  const hash = simpleHash(noteContent);
  return aiCache.getOrFetch(hash, async () => {
    // Only calls API if not cached
    const response = await requestUrl({ url: 'https://api.openai.com/...', ... });
    return response.json.choices[0].message.content;
  });
}

Step 4: Rate Limiting for External Calls

// Prevent runaway API costs with a quota counter
class APIQuota {
  private calls = 0;
  private resetTime = 0;
  private maxCallsPerHour: number;

  constructor(maxPerHour: number) {
    this.maxCallsPerHour = maxPerHour;
  }

  canCall(): boolean {
    const now = Date.now();
    if (now - this.resetTime > 3600000) {
      this.calls = 0;
      this.resetTime = now;
    }
    return this.calls < this.maxCallsPerHour;
  }

  recordCall() { this.calls++; }

  remaining(): number {
    return Math.max(0, this.maxCallsPerHour - this.calls);
  }
}

// Usage
const quota = new APIQuota(100); // max 100 API calls per hour

async function callExternalAPI() {
  if (!quota.canCall()) {
    new Notice('API quota exceeded. Try again later.');
    return;
  }
  quota.recordCall();
  // ... make API call
}

Step 5: Optimize Obsidian Publish Costs

Publish at $8/mo per site. Minimize what you publish to reduce bandwidth:

# In each note's frontmatter, control what gets published
---
publish: true          # Include this note on Publish site
permalink: custom-url  # Custom URL path
---

Cost reduction strategies:

  • Use publish: true frontmatter selectively instead of publishing entire folders
  • Compress images before embedding (target < 200KB per image)
  • Use lazy-loading for heavy media: !alt with external hosting
  • Monitor page count — each additional page adds build time and bandwidth
  • Use Obsidian's built-in image compression in Publish settings

Step 6: Self-Hosted Sync Alternatives (Free)

# Decision matrix for $0/month sync
obsidian_git:
  cost: Free
  setup: Install Obsidian Git plugin, configure repo
  pros: Full version history, unlimited storage, branch per device
  cons: Manual setup, no conflict resolution UI, requires Git knowledge
  best_for: Developers, technical users

syncthing:
  cost: Free
  setup: Install on each device, share vault folder
  pros: Real-time sync, no cloud dependency, encrypted
  cons: Devices must be online simultaneously (or have relay), no web access
  best_for: Privacy-focused users, LAN-only setups

icloud_drive:
  cost: Free (with Apple devices)
  setup: Move vault to ~/Library/Mobile Documents/iCloud~md~obsidian/Documents/
  pros: Zero config on Apple ecosystem, transparent to Obsidian
  cons: .obsidian/ conflicts common, slow on large vaults, Apple-only
  best_for: Apple-only users with small vaults

remotely_save:
  cost: Free (with existing S3/WebDAV)
  setup: Install Remotely Save plugin, configure backend
  pros: Works with S3, Dropbox, OneDrive, WebDAV
  cons: Plugin manages sync (no native integration), manual conflict handling
  best_for: Users with existing cloud storage

Step 7: Ongoing Cost Monitoring Script

#!/bin/bash
# vault-cost-report.sh <vault-path>
VAULT="${1:-$HOME/MyVault}"
echo "=== Monthly Cost Estimate ==="

# Vault size
SIZE_MB=$(du -sm "$VAULT" 2>/dev/null | cut -f1)
echo "Vault size: ${SIZE_MB} MB"

if [ "$SIZE_MB" -lt 1024 ]; then
  echo "Sync tier needed: Standard ($4/mo) — under 1 GB"
elif [ "$SIZE_MB" -lt 10240 ]; then
  echo "Sync tier needed: Plus ($8/mo) — under 10 GB"
else
  echo "WARNING: Vault exceeds 10 GB — Sync Plus limit"
fi

# Published pages
PUB_COUNT=$(grep -rl 'publish: true' "$VAULT"/*.md "$VAULT"/**/*.md 2>/dev/null | wc -l)
echo "Published pages: $PUB_COUNT"
[ "$PUB_COUNT" -gt 0 ] && echo "Publish cost: \$8/mo" || echo "Publish cost: \$0"

# Plugin API costs (estimate by checking for network-calling plugins)
echo ""
echo "=== Plugins with potential API costs ==="
for dir in "$VAULT/.obsidian/plugins"/*/; do
  manifest="$dir/manifest.json"
  [ -f "$manifest" ] || continue
  name=$(python3 -c "import json; print(json.load(open('$manifest')).get('name','?'))" 2>/dev/null)
  # Check if plugin JS makes fetch/requestUrl calls
  if grep -q 'requestUrl\|fetch(' "$dir/main.js" 2>/dev/null; then
    echo "  $name — makes network requests"
  fi
done

Output

  • Vault storage audit with file type breakdown and largest files
  • Sync exclusion patterns reducing bandwidth consumption
  • API response cache with TTL and bounded size
  • Rate limiter preventing runaway API costs
  • Publish optimization with selective frontmatter and image compression
  • Self-hosted sync comparison (Git, Syncthing, iCloud, Remotely Save)
  • Monthly cost estimation script

Error Handling

IssueCauseSolution
Sync storage fullLarge binary attachmentsExclude PDFs/videos from sync, compress images
Plugin API costs spikeNo caching or rate limitingImplement APICache + APIQuota (Steps 3-4)
Vault backup too largeAccumulated .trash and plugin cachesEmpty .trash/, exclude plugins/*/data.json from sync
Publish site slowLarge uncompressed imagesCompress to < 200KB, use external image CDN
Git sync conflicts on .obsidian/Multiple devices editing configAdd workspace.json to .gitignore
iCloud sync corruptionSimultaneous edits on two Apple devicesNever edit same note on two de

Content truncated.

When not to use it

  • When the goal is to optimize general Obsidian performance
  • When the goal is to manage data backup and recovery patterns

Prerequisites

Understanding of your Obsidian subscription tierTerminal access to the vault directoryKnowledge of which community plugins make external API calls

Limitations

  • Obsidian Sync Standard tier has a 1 GB limit
  • Obsidian Publish costs $8/mo per site
  • Obsidian Sync has a 10 GB limit for the Plus tier

How it compares

This skill provides specific commands and code examples for Obsidian's sync, publish, and plugin API costs, unlike general file management or API optimization.

Compared to similar skills

obsidian-cost-tuning side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
obsidian-cost-tuning (this skill)327dReviewIntermediate
nextjs-developer3282moNo flagsAdvanced
sql-optimization-patterns642moNo flagsAdvanced
godot-gdscript-patterns574moNo flagsIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

More by jeremylongshore

View all by jeremylongshore

analyzing-logs

jeremylongshore

Analyze application logs to detect performance issues, identify error patterns, and improve stability by extracting key insights.

14123

ollama-setup

jeremylongshore

Configure auto-configure Ollama when user needs local LLM deployment, free AI alternatives, or wants to eliminate hosted API costs. Trigger phrases: "install ollama", "local AI", "free LLM", "self-hosted AI", "replace OpenAI", "no API costs". Use when appropriate context detected. Trigger with relevant phrases based on skill purpose.

1167

backtesting-trading-strategies

jeremylongshore

Backtest crypto and traditional trading strategies against historical data. Calculates performance metrics (Sharpe, Sortino, max drawdown), generates equity curves, and optimizes strategy parameters. Use when user wants to test a trading strategy, validate signals, or compare approaches. Trigger with phrases like "backtest strategy", "test trading strategy", "historical performance", "simulate trades", "optimize parameters", or "validate signals".

1071

generating-database-seed-data

jeremylongshore

Process this skill enables AI assistant to generate realistic test data and database seed scripts for development and testing environments. it uses faker libraries to create realistic data, maintains relational integrity, and allows configurable data volumes. u... Use when working with databases or data models. Trigger with phrases like 'database', 'query', or 'schema'.

1033

cursor-codebase-indexing

jeremylongshore

Execute set up and optimize Cursor codebase indexing. Triggers on "cursor index setup", "codebase indexing", "index codebase", "cursor semantic search". Use when working with cursor codebase indexing functionality. Trigger with phrases like "cursor codebase indexing", "cursor indexing", "cursor".

885

testing-mobile-apps

jeremylongshore

Execute mobile app testing on iOS and Android devices/simulators. Use when performing specialized testing. Trigger with phrases like "test mobile app", "run iOS tests", or "validate Android functionality".

810

You might also like

nextjs-developer

zenobi-us

Expert Next.js developer mastering Next.js 14+ with App Router and full-stack features. Specializes in server components, server actions, performance optimization, and production deployment with focus on building fast, SEO-friendly applications.

328531

sql-optimization-patterns

wshobson

Master SQL query optimization, indexing strategies, and EXPLAIN analysis to dramatically improve database performance and eliminate slow queries. Use when debugging slow queries, designing database schemas, or optimizing application performance.

64220

godot-gdscript-patterns

sickn33

Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization. Use when building Godot games, implementing game systems, or learning GDScript best practices.

57178

angular

sickn33

Modern Angular (v20+) expert with deep knowledge of Signals, Standalone Components, Zoneless applications, SSR/Hydration, and reactive patterns. Use PROACTIVELY for Angular development, component architecture, state management, performance optimization, and migration to modern patterns.

100129

core-web-vitals

davila7

Optimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking. Use when asked to "improve Core Web Vitals", "fix LCP", "reduce CLS", "optimize INP", "page experience optimization", or "fix layout shifts".

40187

chrome-devtools

mrgoonie

Browser automation, debugging, and performance analysis using Puppeteer CLI scripts. Use for automating browsers, taking screenshots, analyzing performance, monitoring network traffic, web scraping, form automation, and JavaScript debugging.

41157

Search skills

Search the agent skills registry