Made with β€οΈ for the community
A comprehensive social media management tool designed to help you create, format, and post content across multiple platforms including LinkedIn, Twitter/X, Mastodon, and Bluesky.
Features advanced styling, tagging, reminder, OAuth authentication, and cross-platform posting capabilities.
β Found this tool helpful? Give it a star on GitHub to support the project and help others discover it!
More screenshots can be found in this folder.
- π Multi-Platform Support - Post to LinkedIn, Twitter/X, Mastodon, and Bluesky with OAuth authentication
- β¨ Advanced Formatting - Bold (
**text**
) and italic (_text_
) with Unicode styling - π·οΈ Unified Tagging - Use
@{Person Name}
syntax for cross-platform tagging - π Post Management - Create, edit, and organize multiple posts with auto-save
- π Emoji Picker - 6 categories with easy insertion at cursor position
- β° Scheduling & Reminders - Set posting reminders with timezone support
- π¨ Dark Mode - Toggle between light/dark themes with persistence
- π± Direct Posting - One-click posting with automatic thread creation
π Detailed Features
- LinkedIn: OAuth 2.0 integration with direct posting (3,000 character limit)
- Twitter/X: OAuth 2.0 authentication with automatic thread creation (280 chars, or 25,000 with X Premium)
- Mastodon: OAuth 2.0 integration with instance-specific authentication and posting (500 character limit, configurable per instance)
- Bluesky: App password authentication with native posting (300 character limit)
- Smart Chunking: Automatic text splitting based on platform-specific character limits
- Visual Status: Green checkmarks (β) show authentication status for each platform
- Bold Text: Use
**text**
to create Unicode bold formatting (π―πΌπΉπ±) - Italic Text: Use
_text_
to create Unicode italic formatting (πͺπ΅π’ππͺπ€) - Cross-Platform Compatible: Unicode characters work across all supported platforms
- Live Preview: Real-time preview of formatted text as you type
- Intelligent Text Breaking: Smart chunking at sentence and paragraph boundaries
- Cross-Platform Tagging: Use
@{Person Name}
syntax to tag people across all platforms - Smart Platform Conversion: Automatically converts to platform-specific formats:
- LinkedIn:
@Display Name
(manual tagging required after pasting) - Twitter/X:
@username
(automatic clickable mentions) - Mastodon:
@username@instance.domain
(automatic clickable mentions) - Bluesky:
@handle.domain
(automatic clickable mentions and links with AT Protocol facets)
- LinkedIn:
- Person Management: Add, edit, and delete person mappings with platform-specific handles
- Inline Editing: Edit existing person mappings directly in the tag manager
- Visual Tagging Guide: Clear instructions and examples for each platform
- Persistent Storage: All person mappings saved to localStorage
- Settings UI: Built-in OAuth configuration panel with step-by-step instructions
- LinkedIn OAuth: OAuth 2.0 with
w_member_social
scope for posting - Twitter OAuth: OAuth 2.0 with
tweet.read
,tweet.write
,users.read
scopes - Mastodon OAuth: OAuth 2.0 with
read write
scopes, instance-specific configuration - Bluesky Authentication: Secure app password system
- Token Management: Automatic token storage, persistence, and refresh handling
- Create & Edit: Multiple posts with custom titles and content
- Save & Load: Export/import posts to/from JSON files
- Post Switching: Easy navigation between saved posts
- Auto-Save: Drafts automatically saved to localStorage
- Post Counter: Visual indicator of total saved posts
- Date/Time Picker: Set reminders for when to post
- 32+ Timezone Support: Global timezone selections
- Browser Notifications: Get notified when it's time to post
- Timezone Display: Shows scheduled time in selected timezone
- Dark Mode: Toggle between light and dark themes with persistence
- Responsive Design: Works on desktop and mobile devices
- Visual Feedback: Loading states, success/error messages, and status indicators
- Character Counting: Real-time word and character count with limit warnings
- Multiple Copy Methods: Clipboard API with fallbacks for different browsers
- One-Click Posting: Post directly to authenticated platforms
- Multi-Part Posts: Automatic thread creation for long content
- Posting Status: Real-time feedback during posting process
- Error Handling: Clear error messages and retry options
- Sequential Posting: Automatic delays between multi-part posts
- React 18 with TypeScript for type safety
- Vite for fast development and building
- Tailwind CSS for responsive styling
- Marked for markdown parsing
- DOMPurify for safe HTML sanitization
- localStorage for data persistence
- Express.js backend server for OAuth token exchange
- Node.js server-side API endpoints for secure posting
- Node.js (version 16 or higher)
- npm (comes with Node.js)
-
Clone the repository
git clone https://github.com/terrytangyuan/social-media-kit cd social-media-kit
-
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env # Edit .env file with your LinkedIn and Twitter client secrets
-
Start the production server
npm start
-
Open your browser
- Navigate to
http://localhost:3000
- The app serves both frontend and backend from the same port
- Navigate to
π For detailed setup instructions including OAuth configuration, see Complete Setup Guide
For development with hot reload:
# Terminal 1: Start the backend server
npm run server
# Terminal 2: Start the frontend dev server
npm run dev
npm run build
The built files will be in the dist
directory.
- βοΈ Setup OAuth - Configure LinkedIn/Twitter/Mastodon client IDs or Bluesky app password
- βοΈ Write Posts - Use
**bold**
,_italic_
, and@{Person Name}
for tagging - π― Select Platform - Choose LinkedIn, Twitter/X (with optional X Premium), Mastodon, or Bluesky
- π€ Post - Click "Post to [Platform]" or copy for manual posting
π Detailed Usage Guide
- Click the βοΈ Settings button in the top header
- Follow the platform-specific setup instructions:
- LinkedIn: Get Client ID from LinkedIn Developer Portal
- Twitter: Get Client ID from Twitter Developer Portal
- Bluesky: Generate app password in Bluesky settings
- Paste your credentials and they'll be automatically saved
- Type your content in the main text area
- Use
**text**
for bold formatting - Use
_text_
for italic formatting - Watch the character count and platform limits
- Click the π Emojis button (positioned with Bold/Italic buttons)
- Browse through 6 organized categories
- Click any emoji to insert it at your cursor position
- The picker closes automatically after selection
- Select Platform: Choose from LinkedIn (πΌ), Twitter/X (π¦), Mastodon (π), or Bluesky (π¦)
- X Premium: When Twitter/X is selected, toggle "X Premium Account" for 25,000 character limit
- Authentication: Click "Login" if you see a not-connected status
- Direct Posting: Click "Post to [Platform]" to publish directly
- Copy Option: Use "π Copy for [Platform]" if you prefer manual posting
- Thread Handling: Long posts are automatically split into threads
- Click π·οΈ Tags to open the Tag Manager
- Add Person: Create person mappings with name and platform-specific handles
- Name: Used for tagging syntax (e.g., "Yuan Tang")
- Display Name: What appears in posts (e.g., "Yuan Tang")
- X/Twitter: Username handle (e.g., "TerryTangYuan")
- Bluesky: Handle with domain (e.g., "terrytangyuan.xyz")
- Tag in Posts: Use
@{Person Name}
syntax in your posts - Platform Conversion: Automatically converts to platform-specific formats:
- LinkedIn:
@Yuan Tang
(requires manual @ selection after pasting) - Twitter/X:
@TerryTangYuan
(automatic clickable mention) - Bluesky:
@terrytangyuan.xyz
(automatic clickable mention with AT Protocol facets)
- LinkedIn:
- Edit/Delete: Use the βοΈ Edit and ποΈ Delete buttons to manage mappings
- Click π Posts to access the post manager
- Create: Use "β New Post" to create additional posts
- Switch: Click any post to switch to editing it
- Export/Import: Use "πΎ Save" and "π Load" to backup/restore posts
- Organize: Edit post titles by clicking on them
- Use the "Schedule Post Reminder" datetime picker
- Select your timezone from 32+ global options
- Browser notifications will alert you at the scheduled time
- Reminders persist across browser sessions
- Click the π Dark Mode / π Light Mode toggle
- All interface elements adapt to your chosen theme
- Your preference is automatically saved
π§ Technical Details
The app converts markdown syntax to Unicode characters that work across all platforms:
**bold text**
β π―πΌπΉπ± ππ²π π_italic text_
β πͺπ΅π’ππͺπ€ π΅π¦πΉπ΅
Automatically splits long content based on platform limits:
- LinkedIn: 3,000 characters (generous limit for long-form content)
- Twitter/X: 280 characters (25,000 with X Premium) - creates automatic threads
- Bluesky: 300 characters (creates post series)
Chunking intelligently breaks at:
- Sentence endings (., !, ?)
- Paragraph breaks (\n\n)
- Line breaks (\n)
- Word boundaries (spaces)
- Drafts: Auto-saved to localStorage as you type
- Posts: All posts saved locally with export/import capability
- Settings: OAuth configurations and preferences persist
- Authentication: Tokens securely stored locally
- Theme: Dark mode preference remembered
- LinkedIn: 3,000 characters (professional long-form posts)
- Twitter/X: 280 characters (25,000 with X Premium) - microblogging to long-form
- Mastodon: 500 characters (configurable per instance) - microblogging with threading support
- Bluesky: 300 characters (short-form social content)
- βοΈ Setup First - Configure OAuth credentials before posting
- π·οΈ Use Unified Tagging - Create person mappings, then use
@{Person Name}
syntax - πΌ LinkedIn Tagging - After pasting, manually type
@
and select from dropdown - β¨ Format Wisely - Use bold text sparingly for key points
- π Always Preview - Review formatted content before publishing
Authentication Problems:
- "CLIENT ID NOT CONFIGURED" β Add credentials to
.env
file and restart server - OAuth redirect fails β Verify redirect URLs match exactly (
http://localhost:3000
) - LinkedIn 403 errors β Enable required products in LinkedIn Developer Portal
- Twitter auth errors β Verify app type is "Web App" (not "Confidential Client")
Server Issues:
- Port 3000 in use β Kill existing processes:
sudo lsof -ti:3000 | xargs sudo kill -9
- Module not found β Run
npm install
to install dependencies
π For detailed troubleshooting and recent fixes, see CHANGELOG.md
This project is open source and available under the MIT License.
We welcome contributions from developers of all skill levels! Whether you're fixing bugs, adding features, improving documentation, or enhancing tests, your help makes this project better.
π For detailed guidelines, see CONTRIBUTING.md
Made with β€οΈ for better social media content creation and cross-platform posting