Post directly to LinkedIn from your vault.
Content OS is an Obsidian plugin that bridges the gap between your note-taking and content publishing workflows. Create and publish LinkedIn posts directly from Obsidian without switching between applications.
- Seamless Workflow: Create LinkedIn posts without leaving Obsidian
- User-Friendly Interface: Simple modal for composing and publishing posts
- Character Counter: Real-time character count with LinkedIn limits
- Download the plugin files
- Place them in your Obsidian plugins directory:
.obsidian/plugins/content-os/ - Enable the plugin in Obsidian settings
- Open plugin settings
- Click "Generate LinkedIn access token"
- Complete the login flow in your browser
- Copy and paste the access token into the plugin settings
- Click "Validate token" to verify the token works
- Use the ribbon icon (send icon) to open the post composer
- Or use the command palette: "Create LinkedIn post"
- Write your content in the modal
- Click "Post" to publish
- Ribbon Icon: Click the send icon in the left ribbon
- Command Palette: Search for "Create LinkedIn post"
- Write Content: Enter your post content in the modal
- Character Limit: Stay within LinkedIn's 3000 character limit
- Publish: Click "Post" to publish immediately
- LinkedIn Access Token: Your OAuth token for API access (password field for security)
- Dev Mode: Enable for detailed logging and debugging
- Log Level: Control the verbosity of logs when dev mode is enabled
Content OS uses LinkedIn's OAuth 2.0 for secure authentication:
- Initial Setup: Generate a token through the OAuth proxy
- Token Storage: Tokens are stored securely in Obsidian's data storage
- Auto-Validation: The plugin automatically validates tokens before posting
- User ID Caching: LinkedIn user IDs are cached to avoid repeated API calls
- Node.js 18+
- npm or yarn
npm install
npm run dev # Development with file watching
npm run build # Production build
npm run lint # Code linting
npm run typecheck # TypeScript checking├── main.ts # Main plugin entry point
├── manifest.json # Plugin metadata
├── src/
│ ├── linkedin/
│ │ ├── api.ts # LinkedIn API integration
│ │ └── PostComposer.ts # Post creation modal
│ └── utils/
│ └── logger.ts # Logging utility
└── README.md # This file
Content OS integrates with LinkedIn's v2 API:
- User Info Endpoint:
/v2/userinfofor user identification - Posts Endpoint:
/v2/postsfor content publishing - OAuth Flow: Standard OAuth 2.0 with PKCE for security
- Local Storage: All tokens are stored locally in Obsidian
- No Data Collection: Content OS doesn't collect or transmit user data
- OAuth Security: Uses industry-standard OAuth 2.0 authentication
- Token Validation: Tokens are validated before each use
- I have a small open source repo here where the LinkedIn OAuth flow is driven from. When a user uses the
Generate LinkedIn access tokenbutton within this app, this is the code standing behind the URL where they are pushed.
Token Invalid/Expired
- Generate a new token through the OAuth flow
- Ensure you're using the correct LinkedIn account
- Check that the token hasn't expired
Post Failed to Publish
- Verify your internet connection
- Check that your LinkedIn account has posting permissions
- Ensure content doesn't exceed character limits
Plugin Not Loading
- Enable dev mode in settings for detailed logs
- Check the developer console for error messages
- Verify plugin files are in the correct directory
Enable dev mode in plugin settings to see detailed logs in the developer console:
- Open plugin settings
- Toggle "Dev mode" on
- Set log level to "Debug"
- Check browser developer console for detailed information
MIT License - See LICENSE file for details.
For issues, feature requests, or questions:
- GitHub Issues: Report an issue
- This plugin builds on top of the LinkedIn APIs, but is in no way affiliated or endorsed by LinkedIn.