Files
obsidian-jekyll-publish/README.md
Claude 61910acac3
All checks were successful
CI / test (push) Successful in 17s
fix: remove non-portable askpass bridge; rely on native git credentials
The askpass bridge bound a Unix-domain socket to a vault filesystem path
(net.createServer().listen(...sock)). That is invalid on Windows, where
Node's listen() expects a named pipe, so publish aborted with
'listen EACCES: permission denied ...askpass.sock' before git ever ran —
even when the user's git could authenticate. The bridge was non-portable in
general (Windows named pipes; the helper script needs a node binary on PATH).

Remove the bridge and let the user's system git handle credentials via its
native helpers (Git Credential Manager / osxkeychain / libsecret) for https
and ssh-agent for ssh — the 'store nothing' model we already chose.
GIT_TERMINAL_PROMPT=0 stays so git fails fast instead of hanging, and
publish errors now include a credential/identity hint. Deletes askpass.ts
and its test (3 tests); suite 32/32, tsc clean, build OK.

Co-Authored-By: Claude
2026-06-19 03:02:28 +00:00

4.6 KiB

Obsidian Jekyll Publish

An Obsidian plugin that publishes the active note as a Jekyll blog post via git. Images are copied alongside the post using one of two configurable strategies, and credentials are handled by your system git — nothing is stored inside Obsidian.

What it does

  1. Opens a "Publish to Jekyll" modal for the currently active markdown file.
  2. Lets you confirm or adjust the slug, date, frontmatter, image strategy, and commit message.
  3. Clones (or updates) your Jekyll site repository into a temporary directory.
  4. Writes the post as _posts/<date>-<slug>.md (or your configured path).
  5. Copies any embedded images according to the selected strategy.
  6. Commits and pushes to your configured remote and branch.

Installation

  1. Build the plugin (see Development below) or download the release assets.
  2. Copy dist/main.js, dist/manifest.json, and dist/styles.css into:
    <your-vault>/.obsidian/plugins/jekyll-publish/
    
  3. Reload Obsidian and enable Jekyll Publish under Settings → Community plugins.

Settings

Setting Description Default
Remote URL Git remote URL for your Jekyll site (HTTPS or SSH) (empty)
Branch Branch to push to main
Posts directory Destination directory inside the repo _posts
Images directory Where images are copied inside the repo assets/img
Default image strategy flat-slug or per-post-folder (see below) flat-slug
Preset frontmatter Key/value pairs always injected into every post (empty)
Commit message template Template; {{title}} is replaced by the note title Publish: {{title}}
Author name Git author name for commits (empty)
Author email Git author email for commits (empty)

Image strategies

flat-slug — all images for the post are copied flat into <images-dir>/. A single image is renamed to <slug>.<ext>; multiple images are renamed to <slug>-1.<ext>, <slug>-2.<ext>, … (the original Obsidian filename is discarded). Keeps the images directory shallow; suitable for sites with few images per post.

per-post-folder — images are copied into <images-dir>/<slug>/ preserving their original filenames. Keeps each post's images grouped together; suitable for posts with many images.

Credentials model

The plugin uses your system git binary for all remote operations and stores no passwords or tokens inside Obsidian or the plugin's data files. Authentication is delegated entirely to git's own credential handling, which works across platforms:

  • HTTPS remotes — git uses your configured credential helper: Git Credential Manager (bundled with Git for Windows), osxkeychain (macOS), or libsecret (Linux). The first push prompts you through that helper's own dialog and caches the result in your OS keychain. If no helper is configured, the publish fails fast with a clear message (the plugin sets GIT_TERMINAL_PROMPT=0 so git never hangs waiting on a non-existent terminal).
  • SSH remotes — git uses your existing SSH agent / ~/.ssh key configuration. Use an ssh:// URL and make sure your key (or agent) is set up; no extra steps in the plugin.

Commits are authored with the Author name/email from the plugin settings if set; otherwise git uses your machine's git identity (user.name / user.email). If neither is configured, git will refuse to commit — set an author in settings or configure a global git identity.

Development

Requirements

  • Node.js 20+
  • npm

Build

npm install
npm run build
# Output: dist/main.js  dist/manifest.json  dist/styles.css

Unit tests

npm test

Runs the Vitest suite (frontmatter parsing, slug derivation, image path logic, git helpers, publish pipeline).

E2E tests

The E2E suite boots the real Obsidian binary in a headless X display and drives it via the Chrome DevTools Protocol.

Prerequisites:

  • xvfb-run on PATH (install: sudo apt install xvfb)
  • Obsidian AppImage placed at ~/.cache/obsidian-e2e/Obsidian.AppImage (download from https://obsidian.md/download)
npm run e2e

The script:

  1. Extracts the AppImage (once, cached).
  2. Provisions a throwaway vault at .obsidian-e2e/ with the plugin installed.
  3. Launches Obsidian with --remote-debugging-port and connects Playwright over CDP.
  4. Runs the smoke spec: plugin loads, command jekyll-publish:publish-current-note is registered, opening a note and executing the command shows a modal with heading "Publish to Jekyll".

The .obsidian-e2e/ directory and Playwright test-results/ are excluded from git.