James Hooker93 downloadsTwo-way sync of your JokeBakery jokes, sprints, lists and crashes with your vault as Markdown. Requires a JokeBakery account.
Two-way sync between JokeBakery and an Obsidian vault. Your sprints, jokes and lists become Markdown files you can read and edit in Obsidian; edits flow back to JokeBakery on the next sync.
<folder>/
Sprints/
2026-06-06.md # one "10 in 10" sprint per file, named by its date
Jokes/
whats-the-deal-with-airline-food.md
Lists/
dentist.md # one reusable list per file
Conflicts/ # auto-created only when a sync conflict happens
Sprints/YYYY-MM-DD.md. A numbered list of joke lines. If you do
two sprints in one day the second is …-2.md; identity is the bw-id in the
file's frontmatter, not the filename, so renaming is safe.Jokes/<slug>.md. Editable prose under ## Setup,
## Development, ## Punchline, plus ## Notes and ## Scratchpad.
Structured fields (stage, families, tags, theme, angle) are Obsidian
properties; rhythm/IEN markup rides in an opaque bw-meta property.Lists/<slug>.md. A user-owned, reusable list: its items are a
plain bullet list in the body; edit them here. A list can be attached to many
jokes (attach/detach in JokeBakery).A joke's ## Lists section is now a read-only list of the labels attached to
that joke — open the matching note in Lists/ to edit a list's contents.
## Alternative punchlines and ## Setup versions are likewise read-only —
manage those in JokeBakery.
https://jokebakery.comJokeBakery<folder>/Sprints named after its date
(2026-06-10.md) and write one joke per line (numbered or not).<folder>/Jokes. Use ## Setup / ## Punchline
headings, or just write freeform — freeform text lands in the joke's
scratchpad.<folder>/Lists. The note title (or label
property) is the list name; write one item per bullet line.On the next sync these are created in JokeBakery and get their bw-id written
back into the file.
Sync is last-writer-wins by modified time. If the same item changed on both
sides between syncs, nothing is lost: the losing version is written to
<folder>/Conflicts/… for you to merge by hand.
Deletions sync both ways:
As a safety net, if 20 or more deletions are queued at once (e.g. the sync folder itself was deleted), they are held back: auto-syncs skip them and a manual Sync now asks for confirmation before deleting anything server-side.
Caveat: Obsidian-side deletions are detected while the plugin is running. Delete items as individual files — deleting a synced file you no longer want is the reliable signal. If a synced file goes missing without a delete event (e.g. it was removed outside Obsidian), the next pull treats the server as authoritative and restores it.
The easiest way to add this to Obsidian today:
https://github.com/jimhooker/jokebakery-obsidianBRAT keeps the plugin updated as new releases are published here.
main.js, manifest.json, styles.css and versions.json from
the latest release,
or build them yourself with npm install && npm run build.<your-vault>/.obsidian/plugins/jokebakery-sync/.0.4.0 changed the plugin id from bakerwriter-sync to jokebakery-sync, so
Obsidian treats it as a new plugin. To keep your settings and sync state:
<vault>/.obsidian/plugins/bakerwriter-sync/data.json into
<vault>/.obsidian/plugins/jokebakery-sync/.Skipping step 2 also works — re-enter your token and folder and run a sync;
files are matched by their bw-id, so nothing duplicates.
npm run dev runs esbuild in watch mode. Symlink this folder into your vault's
.obsidian/plugins/ to iterate live. npm test runs the serialization
round-trip suite (vitest) — run it after touching src/serialize.ts.
This plugin is a companion to the hosted JokeBakery
service and talks only to https://jokebakery.com (the Server URL setting
exists for development builds). On each sync it sends the contents of notes
inside the configured sync folder (your jokes, sprints, lists and crashes)
together with your access token, and pulls your items back. No other part of
your vault is read or transmitted, and there are no analytics or third-party
services. Your access token is stored in the plugin's data.json inside your
vault — treat it as a secret; you can revoke it any time in JokeBakery under
Settings → Obsidian sync.
Using the plugin requires a JokeBakery account (currently invite-only).
The plugin talks to JokeBakery's /api/sync REST API with a Bearer token.
Each sync runs push (send new/edited vault files) then pull (write
changed server items into the vault). All Markdown ⇄ JSON translation happens
here in the plugin; the server only ever speaks JSON. See src/serialize.ts
for the file format and src/sync.ts for the sync algorithm.