One-way synchronization from Obsidian to Ghost CMS with post scheduling, YAML metadata control, automatic sync, and an editorial calendar view.
- 🔄 One-way sync from Obsidian to Ghost (keeps Ghost as your publishing platform)
- 📅 Editorial calendar - Sidebar view of all scheduled and published posts for the month
- 📝 YAML frontmatter control - Manage all Ghost metadata directly in Obsidian
- 🕐 Post scheduling - Schedule posts for future publication with
g_published_at - 🔄 Automatic sync - Debounced sync on file save (2s delay)
- ⏰ Periodic sync - Configurable interval sync (default: 15 minutes)
- ✨ Markdown to Lexical conversion - Full markdown support including images
- 🔒 Paywall marker - Control the public preview line with
--members-only-- - 🔐 Secure credentials - API keys stored in Obsidian's secure keychain
- 🔑 JWT authentication - Secure Ghost Admin API integration
- 📊 Status bar indicator - Visual feedback on sync status
- 🎯 Flexible configuration - Custom sync folder, prefix, and intervals
- Go to the Releases page
- Download the latest release files:
main.jsmanifest.jsonstyles.css
- In your vault, navigate to
.obsidian/plugins/folder - Create a new folder called
ghost-writer-manager - Move the downloaded files into
.obsidian/plugins/ghost-writer-manager/ - Restart Obsidian or reload the app
- Go to Settings → Community Plugins
- Enable Ghost Writer Manager
-
Clone this repository:
git clone https://github.com/diegoeis/ghost-writer-manager-plugin.git cd ghost-writer-manager-plugin -
Install dependencies:
npm install
-
Configure your vault path for hot reload:
cp dev.config.example.json dev.config.json # Edit dev.config.json with your vault path -
Start dev mode with hot reload:
npm run dev
This will automatically:
- Watch for file changes
- Build on every change
- Copy
main.js,manifest.json, andstyles.cssto your vault - No manual copying needed!
-
Enable the plugin in Obsidian settings
-
Reload Obsidian (Ctrl/Cmd + R) to see changes
- Log in to your Ghost Admin panel
- Navigate to Settings → Integrations
- Click Add custom integration
- Give it a name (e.g., "Obsidian Sync")
- Copy the Admin API Key (format:
id:secret)
-
Open Obsidian Settings
-
Navigate to Ghost Writer Manager under Community Plugins
-
Configure the following:
- Ghost URL: Your Ghost site URL (e.g.,
https://yourblog.ghost.io) - Admin API Key: The key you copied from Ghost (stored securely in Obsidian's keychain)
- Sync Folder: Where Ghost posts will be stored in your vault (default:
Ghost Posts) - Sync Interval: How often to check for changes in minutes (default: 15)
- YAML Prefix: Prefix for Ghost metadata fields (default:
g_)
- Ghost URL: Your Ghost site URL (e.g.,
-
Click Test Connection to verify your credentials
Note: Your Admin API Key is stored securely using Obsidian's keychain and is not saved in plain text.
Open the editorial calendar from the ribbon icon or via Cmd/Ctrl + P → "Open Ghost editorial calendar". The sidebar shows all published and scheduled posts for the current month:
- Purple dot — post is published
- Green dot — post is scheduled
- Both dots — day has both published and scheduled posts
- Click a day to filter the post list to that day; click again to show all
- Click a post title to open the linked vault note in a new tab
- Click the external link icon to open the post directly in Ghost Admin
- Use the Today button to return to the current month
Available commands (Cmd/Ctrl + P):
- Sync with Ghost - Manually sync all files in sync folder
- Test Ghost connection - Verify your Ghost credentials
- Open Ghost editorial calendar - Open the calendar sidebar view
- Create new Ghost post - Generate new post with Ghost properties template
- Add Ghost properties to current note - Add Ghost properties to existing note
- Sync current note to Ghost - Force sync of active file
- Debug commands - Show properties, test JWT, view file data
Control all Ghost post metadata using YAML frontmatter:
---
g_post_access: paid # Visibility: public, members, or paid
g_published: false # Draft (false) or published (true)
g_published_at: "" # Schedule: ISO date (e.g., "2026-12-25T10:00:00.000Z")
g_featured: false # Mark as featured post
g_tags: [obsidian, ghost] # Post tags
g_excerpt: "Post summary" # Custom excerpt/description
g_feature_image: "" # Featured image URL
g_slug: "custom-url" # Custom URL slug
g_no_sync: false # Disable sync for this post
---
# Your Post Title
Your post content here...Control where the public preview ends for members-only posts. Add --members-only-- on its own line anywhere in the post body:
# My Post
This paragraph is visible to everyone.
--members-only--
This content is only visible to paying members.- The marker is rendered as a styled banner in the Obsidian editor (uses your theme's accent color)
- Everything above the marker is the public preview; everything below is behind the Ghost paywall
- Only one marker is allowed — if you add a second one, the first is removed automatically
- Works together with
g_post_access: paidorg_post_access: members
Control when posts are published:
- Draft:
g_published: false(ignoresg_published_at) - Publish now:
g_published: true+g_published_at: "" - Schedule:
g_published: true+g_published_at: "2026-12-25T10:00:00.000Z"(future date) - Backdate:
g_published: true+g_published_at: "2020-01-01T10:00:00.000Z"(past date)
ghost-writer-manager-plugin/
├── main.ts # Main plugin file
├── src/
│ ├── types.ts # TypeScript interfaces
│ ├── ghost/
│ │ └── api-client.ts # Ghost Admin API client
│ └── views/
│ └── calendar-view.ts # Editorial calendar sidebar
├── styles.css # Plugin styles
├── manifest.json # Plugin manifest
├── package.json # Dependencies
└── tsconfig.json # TypeScript config
npm run dev- Build in development mode with watchnpm run build- Build for productionnpm run lint- Run ESLint
The plugin includes a DEV_MODE flag in main.ts that enables auto-sync on file changes:
const DEV_MODE = true; // Set to false for production buildsWhen DEV_MODE = true:
- Files auto-sync 2 seconds after last change (debounced)
- Useful for testing during development
When DEV_MODE = false (production):
- Files only sync according to the configured interval
- Manual sync still available via commands
Important: Always set DEV_MODE = false before building for production/release.
- Ghost API authentication (JWT with HMAC-SHA256)
- Settings interface
- Connection testing
- One-way sync engine (Obsidian → Ghost)
- YAML metadata control (full Ghost properties support)
- Markdown to Lexical format conversion
- Periodic sync (configurable interval)
- Post scheduling system
- Status bar indicator
- Manual sync commands
- Development mode with auto-sync (debounced)
- Editorial calendar sidebar view
- Paywall marker (
--members-only--) with live editor decoration and auto-deduplication
- Two-way sync (Ghost → Obsidian)
- Ghost pages support
- Media upload support
- Conflict resolution
- Bulk operations
- Post templates
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
If you encounter any issues or have questions, please open an issue.