Skip to content

Obsidian Publisher & Sync

The Content Pipeline captures ideas inside an Obsidian vault. Then what? Two workflows complete the chain: one publishes blog notes to the Astro Starlight site, the other syncs the vault with Odoo Knowledge for multi-channel access.

WorkflowNodesTriggerRole
Obsidian Blog Publisher~12Telegram callbackObsidian note → Astro blog PR
Obsidian-Odoo Sync~40GitHub webhook + Odoo + scheduleTwo-way sync vault ↔ Odoo Knowledge

Obsidian-Odoo Sync · ~40 nodes

Blog Publisher · ~12 nodes

Obsidian vault · GitHub repo guigpap/obsidian-vault

Callback content_publish_

Parse YAML frontmatter

Route by tags · workflows / infrastructure / reference

Convert wikilinks + callouts → MDX

Create branch + commit + open PR

GitHub webhook · push notes/*

Hourly schedule · modified Odoo articles

Mapping tags → Knowledge categories

Embedding · text-embedding-3-small

Upsert Qdrant

Upsert knowledge.article

Astro blog · GuiGPaP/blog

Odoo Knowledge


ProblemWithout these workflowsWith these workflows
Manual publicationCopy-paste, format conversionOne Telegram button
Knowledge silosNotes in Obsidian, articles in OdooTwo-way sync
Fragmented searchSearch in 3 different placesUnified search through Qdrant

When a note in the vault has the frontmatter type: blog and status: ready, the user can trigger publication from Telegram via a content_publish_{shortId} callback.

The workflow:

  1. Parses the Obsidian YAML frontmatter (title, tags, description)
  2. Routes to the right folder based on the tags:
TagsBlog folder
workflow, automationworkflows/
infrastructure, docker, stackinfrastructure/
reference, glossaryreference/
(default)workflows/
  1. Converts Obsidian syntax to Starlight MDX:

    • Wikilinks [[page|label]] → Markdown links [label](/docs/en/path/)
    • Callouts > [!note]<Aside type="note"> components
  2. Creates a Git branch, commits the MDX file, and opens a Pull Request with an auto-generated title

  3. Notifies on Telegram with the PR link

The two-way sync runs in three phases:

Phase 1 — GitHub → Odoo (push webhook)

When a file is changed in the vault (notes/* or knowledge/*), the GitHub webhook triggers the sync:

  • YAML frontmatter parsing
  • Mapping Obsidian tags to Odoo Knowledge categories
  • Upsert of the article into knowledge.article
  • Embedding generation (OpenAI text-embedding-3-small)
  • Vector upsert into Qdrant

Phase 2 — Odoo → GitHub (hourly schedule)

Odoo articles changed (apart from those with source “obsidian”) are converted into Markdown with YAML frontmatter and committed to the vault. The conflict strategy is “latest wins”, and deletions trigger archiving (no destruction).

Phase 3 — Unified search (Telegram command)

The /search Telegram command queries Qdrant with an embedding of the request and returns the 5 most relevant results, grouped by source (Obsidian, Odoo, YouTube).


LimitImpactMitigation
No automatic translationBlog in French onlytranslate: true flag prepared (v1 deferred)
Sync conflictSimultaneous Obsidian + Odoo edits”Latest wins”
In-memory QdrantVector loss on restartRe-sync from sources

If multilingual blog:

  • Enable automatic translation through Claude
  • Generate MDX files in en/ alongside fr/

If the knowledge base grows:

  • Add full-text search alongside the vector one
  • Dedicated web UI to browse the vault
  • Automatic suggestions of related notes (AI wikilinks)