fodoj25 downloadsSync selected notes and folders to formatted Basecamp documents.
Publish selected Obsidian notes as formatted documents in Basecamp Docs & Files. Edit a note and push it again to update the same document.
Built by mkdev. MIT licensed. Uses the official Basecamp TypeScript SDK.
Works on desktop and iOS with Obsidian 1.11.4 or later. Connect once on each device, choose a Basecamp destination, and preview the notes you want to publish.

The plugin is free and MIT licensed. You need a Basecamp account with permission to write to the destination project; Basecamp's own account and plan terms apply. The shared mkdev integration needs no separate app registration or plugin subscription.
3.basecampapi.com): receives selected note titles, rendered text and optional embedded attachments, and supplies accounts, projects and existing documents for sync.launchpad.37signals.com): handles Basecamp sign-in and authorization.basecamp-obsidian-sync.fodoj.com): exchanges authorization codes and renews tokens for the shared integration. It is hosted on Cloudflare and processes credentials during these requests; note text and attachments go directly to Basecamp. Its implementation is maintained in mkdev's private infrastructure repository and is not included in this open-source plugin. You can use My own integration to connect directly instead, or configure an organization-operated compatible login service.There is no client telemetry or analytics. The plugin does not read files outside your vault; credentials are stored through Obsidian's device-local Secret storage. It makes no network requests on load. See Privacy for data handling and Authentication for login options.
The plugin uses Obsidian APIs and browser APIs only. Desktop and iOS have been exercised; Android is supported by the same mobile-compatible build but has not been tested on a physical device. There is no background process, periodic polling, framework or AI dependency. The production bundle is approximately 364 KiB uncompressed, including third-party license notices.
The Basecamp Sync Community listing is public. In Obsidian, open Settings → Community plugins → Browse, search for Basecamp Sync, then choose Install and Enable.
The initial automated review completed on 2026-09-08 with no blocking errors. New entries can take up to 24 hours to appear in the app. If it is not listed yet, use BRAT or the release files below.
https://github.com/mkdev-me/obsidian-basecamp-sync (the short form mkdev-me/obsidian-basecamp-sync also works). Use this HTTPS address, rather than the SSH clone address.BRAT installs the files and can check for future releases. The same process works on desktop and mobile, without building the plugin or copying files manually. The public repository does not require a GitHub token. A token can still help with GitHub's API rate limits.
Already using BRAT? If you pinned an earlier version, switch it to Latest version to receive updates. Basecamp authentication is separate from any GitHub token used for downloading releases.
npm ci && npm run package, or obtain the three plugin files from a release.main.js, manifest.json and styles.css from dist/basecamp-sync/ into <vault>/<config-folder>/plugins/basecamp-sync/. The default config folder is .obsidian.On mobile, transfer the same files into the vault's plugin folder with your vault/file sync tool. Ensure custom plugin files actually reach the device; syncing note text alone is insufficient. Restart Obsidian if the plugin does not appear. No computer or Node.js runtime is needed to run the installed plugin.
Open Settings → Basecamp Sync and choose a login method:
| Method | Who registers an integration? | Notes |
|---|---|---|
| Shared mkdev integration | mkdev, once (registered) | The service URL is filled in automatically. Click Connect to Basecamp, then sign in and approve access. No app credentials are needed. You can override the URL for your own hosted service. |
| My own integration | The user or their organization | Enter the client ID, select the client secret in Obsidian Secret storage, and set the registered redirect URI. |
| Existing access token | No new registration if you already have a valid bearer token | Advanced option. Replace the token yourself when it expires. |
See authentication and integration setup for the complete instructions. Connect once on each device, even if your vault and plugin settings have already synced there. The plugin refreshes OAuth tokens automatically after that initial sign-in. Tokens and private client secrets are stored in Obsidian's device-local Secret storage, outside plugin data.json and note properties. This storage is shared with other plugins in the vault; it is not a separate password-manager security boundary.
Connect, then Load accounts and choose an account.
Load projects and choose a project. Its Docs & Files root is selected automatically. To use a specific Basecamp subfolder, replace the destination ID with that folder's ID.
Add one selection per line under Include, for example:
Work/Handbook
Projects/Launch.md
Meeting notes/**/*.md
Add exclusions, if needed:
Work/Handbook/Private
**/Drafts/**
Use Preview selection, then Sync selected notes.
An empty include list syncs nothing. Paths are case-sensitive and relative to the vault. A folder includes all its descendants. Globs support * for a single path segment, ** across folders and ? for one character. **/*.md selects all Markdown notes except hidden paths and exclusions. The current-note command also respects these selection rules.
To keep a note private regardless of folder selection, add this property:
basecamp_sync: false
Set Source folder to the vault folder that should map directly into your Basecamp destination. With Preserve folders enabled, only the folders below this root are recreated. Your local folders and notes stay where they are. For example:
| Setting or path | Value |
|---|---|
| Source folder | Work/Basecamp |
| Include | Work/Basecamp/Handbook |
| Local note | Work/Basecamp/Handbook/Getting started.md |
| Basecamp location | Handbook/Getting started below the chosen destination |
Include and exclude patterns remain relative to the vault root, including the source folder prefix. Notes outside the source folder cannot sync. Leave Source folder empty to preserve paths from the vault root, as earlier versions did. Turn Preserve folders off to put every new document directly in the destination.
Existing Basecamp folders with exactly matching names are reused; ambiguous duplicates stop that note's sync. Preview selection shows where each new document will go. Changing Source folder affects new documents; already linked documents keep their current Basecamp location. Move those in Basecamp and link the note to the resulting document URL if its ID changes. The plugin never moves or deletes existing remote documents automatically.
New documents are published as active documents visible to project members, with client visibility off and an empty subscriber list. Basecamp still controls its own activity feeds, permissions and notification behavior. Existing documents retain their visibility and subscriptions.
The plugin writes a small basecamp_sync object to each published note's properties. It stores the destination, document identity and sync fingerprints. Keep those properties with the note when syncing your vault between devices. They contain no login credentials and are omitted from the published body.
Published documents contain the rendered note content, without an added source link, folder link or hidden sync marker. After upgrading from a version that added a footer, the next sync removes it from selected linked documents, including unchanged notes. Existing conflict checks still protect edits made in Basecamp.
Copying a note also copies its identity. Remove basecamp_sync from the copy before syncing it as a new document. To intentionally publish a linked note to a different destination, remove its sync properties after reviewing its original Basecamp page. That creates a new document and leaves the old one intact.
| Obsidian content | Basecamp result |
|---|---|
| Paragraphs and line breaks | Blank lines between paragraphs; single newlines remain line breaks |
| Headings | Basecamp heading style; heading levels flatten because its documented HTML subset only includes h1 |
| Bold, italic, strike, lists, quotes | Native rich text |
| Task lists | Readable checked/unchecked symbols; not Basecamp to-dos |
| Fenced code | Escaped, preformatted text; no execution or syntax highlighting |
| Inline code | Emphasized text because Basecamp strips code |
| Tables | Labeled rows with cell formatting and links preserved |
| Wiki links and Markdown note links | Basecamp links when the target is synced to the same destination; otherwise Obsidian links |
| Local embedded images/files | Native Basecamp attachments, up to 20 MB per file |
| Remote images | Clickable external links; the plugin does not download them |
| Embedded notes | Links, without publishing the embedded note's contents |
| Callouts | Blockquotes with their callout label |
Properties and %%comments%% |
Omitted |
| Raw HTML | Escaped text |
| Math, diagrams and third-party renderers | Source text or code blocks; no third-party execution |
Attachments referenced by a selected note may live outside your include folders. Turn off attachment uploads if you only want to publish text. Ordinary local file links remain Obsidian links; embed a file to upload it. Basecamp may sanitize custom Obsidian URI links; links between synced documents use ordinary HTTPS URLs. Heading/block links point to the document because Basecamp does not preserve Obsidian anchors. A full sync makes one additional pass after creating documents so links between newly published notes can resolve.
The local formatting preview never uploads anything. Final rendering in Basecamp may differ slightly because Basecamp sanitizes and normalizes HTML.
Requires Node.js 22.12+ for development.
npm ci
npm run check # Obsidian lint rules, behavior tests, typecheck, mobile bundle audit
npm run dev # Watch and rebuild main.js
npm run package # Validate and prepare dist/basecamp-sync/ plus a ZIP
See CONTRIBUTING.md, architecture, privacy and the release checklist. No credentials are needed for automated tests, and the test suite does not contact live Basecamp.