--- title: Obsidian Publisher & Sync url: https://blog.guigpap.com/en/workflows/obsidian-publish/ url_md: https://blog.guigpap.com/en/workflows/obsidian-publish.md category: automation date: '2026-03-28' maturite: production techno: - astro - n8n - odoo - github - qdrant application: - automation - content - knowledge --- # Obsidian Publisher & Sync > Automatic publication from Obsidian to the Astro blog and two-way sync with Odoo Knowledge ## 1. What? — Definition and context The [Content Pipeline](/en/workflows/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. > **Note - Astro Starlight** > > **Astro Starlight** is the framework that powers this blog. It reads MDX files (Markdown + components) to produce static pages. Publishing an article means creating an MDX file in the right folder and opening a Pull Request. ### Two complementary workflows | Workflow | Nodes | Trigger | Role | |----------|-------|---------|------| | **Obsidian Blog Publisher** | ~12 | Telegram callback | Obsidian note → Astro blog PR | | **Obsidian-Odoo Sync** | ~40 | GitHub webhook + Odoo + schedule | Two-way sync vault ↔ Odoo Knowledge | ### Architecture ```mermaid flowchart TD Vault["Obsidian vault · GitHub repo guigpap/obsidian-vault"] subgraph Publisher["Blog Publisher · ~12 nodes"] direction TB Trigger1["Callback content_publish_"] Parse["Parse YAML frontmatter"] Route["Route by tags · workflows / infrastructure / reference"] Convert["Convert wikilinks + callouts → MDX"] PR["Create branch + commit + open PR"] end subgraph Sync["Obsidian-Odoo Sync · ~40 nodes"] direction TB GHHook["GitHub webhook · push notes/*"] OdooSched["Hourly schedule · modified Odoo articles"] SyncLogic["Mapping tags → Knowledge categories"] Embed["Embedding · text-embedding-3-small"] Qdrant["Upsert Qdrant"] Article["Upsert knowledge.article"] end BlogRepo["Astro blog · GuiGPaP/blog"] OdooKB["Odoo Knowledge"] Vault --> Trigger1 --> Parse --> Route --> Convert --> PR --> BlogRepo Vault --> GHHook --> SyncLogic OdooKB --> OdooSched --> SyncLogic SyncLogic --> Article SyncLogic --> Embed --> Qdrant Article --> OdooKB ``` --- ## 2. Why? — Stakes and motivations ### Problems solved | Problem | Without these workflows | With these workflows | |---------|-------------------------|----------------------| | **Manual publication** | Copy-paste, format conversion | One Telegram button | | **Knowledge silos** | Notes in Obsidian, articles in Odoo | Two-way sync | | **Fragmented search** | Search in 3 different places | Unified search through Qdrant | --- ## 3. How? — Technical implementation ### Blog Publisher 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: | Tags | Blog folder | |------|-------------| | workflow, automation | `workflows/` | | infrastructure, docker, stack | `infrastructure/` | | reference, glossary | `reference/` | | (default) | `workflows/` | 3. **Converts** Obsidian syntax to Starlight MDX: - Wikilinks `[[page|label]]` → Markdown links `[label](/docs/en/path/)` - Callouts `> [!note]` → `> **Note** > > ` components > > 4. **Creates** a Git branch, commits the MDX file, and opens a Pull Request with an auto-generated title > > 5. **Notifies** on Telegram with the PR link > > ### Obsidian-Odoo Sync > > 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). > >