Privacy-first, self-hosted social media manager for feeds, cross-posting, scheduling, media, drafts, and local AI assistance across major platforms. NO FEATURE PAYWALL
|
|
1 개월 전 | |
|---|---|---|
| .github | 1 년 전 | |
| services | 1 개월 전 | |
| ui | 1 개월 전 | |
| .env.example | 1 개월 전 | |
| .gitignore | 1 개월 전 | |
| LICENSE.txt | 1 년 전 | |
| README.md | 1 개월 전 | |
| docker-compose.yml | 1 개월 전 | |
| nginx.conf | 1 개월 전 | |
| package-lock.json | 2 년 전 | |
| socialMediaManager.png | 2 년 전 |
A self-hosted, local-first social media management platform. Aggregate feeds from all your platforms, compose and cross-post content, schedule posts, and get AI-powered suggestions — all from one dashboard.
| Layer | Technology |
|---|---|
| Frontend | Vue 3, TypeScript, Vite, Tailwind CSS, Pinia, Vue Router, vue-i18n |
| API Gateway | Node.js / Fastify |
| Message Broker | RabbitMQ |
| Database | MongoDB |
| Job Queue | Redis + BullMQ |
| AI Service | Python / HappyTransformer (T5) |
| Platform SDKs | twitter-api-v2, masto, @atproto/api |
| Reverse Proxy | Nginx |
| Containerization | Docker Compose |
| Service | Port | Description |
|---|---|---|
nginx |
8081 | Reverse proxy — main entry point |
ui |
— | Vue 3 frontend (Vite dev server) |
gateway |
8084 | REST API gateway |
socket |
8085 | WebSocket server (real-time feed updates) |
formatter |
— | Platform-specific content formatter |
ai-grammar-correction |
— | AI grammar correction (T5) |
feed-aggregator |
3010 | Pulls feeds from all platforms periodically |
scheduler |
3011 | Scheduled post management (BullMQ) |
twitter |
3001 | Twitter/X integration |
linkedin |
3002 | LinkedIn integration |
mastodon |
3003 | Mastodon integration |
bluesky |
3004 | Bluesky (AT Protocol) integration |
mongodb |
27018 | Database |
redis |
6379 | Cache & job queue |
messageBroker |
5672 / 15672 | RabbitMQ (+ management UI) |
git clone https://github.com/mehmetkirkoca/social-media-manager.git
cd social-media-manager
cp .env.example .env
Edit .env and fill in your API credentials for the platforms you want to use. You can start with just Mastodon or Bluesky — both have free, open APIs.
# Mastodon (easiest — get token from instance Settings > Development)
MASTODON_INSTANCE_URL=https://mastodon.social
MASTODON_ACCESS_TOKEN=your_token_here
# Bluesky (use an App Password from Settings > App Passwords)
BLUESKY_IDENTIFIER=yourhandle.bsky.social
BLUESKY_APP_PASSWORD=your_app_password_here
docker compose up -d
Open http://localhost:8081 in your browser.
| Platform | API Cost | Feed | Post | Notes |
|---|---|---|---|---|
| Mastodon | Free | ✅ | ✅ | Easiest — open REST API |
| Bluesky | Free | ✅ | ✅ | App Password auth, no OAuth needed |
| Free | ✅ | ✅ | Register an app at reddit.com/prefs/apps | |
| Twitter/X | Paid ($100/mo Basic) | ⚠️ | ✅ | Free tier very limited |
| Free | ⚠️ | ✅ | Personal feed read not available via API | |
| Free | ✅ | ✅ | Business/Creator account + Facebook Page required | |
| Free | ✅ | ✅ | Facebook Page required (personal timelines not supported) | |
| YouTube | Free | ✅ | ❌ | Subscription feed read-only |
Both Instagram and Facebook share one Facebook Developer App. You set it up once, then connect everything from the Settings UI — no token copying required.
SocialManager Local)In your app dashboard:
Under Client OAuth Settings, add to Valid OAuth Redirect URIs:
http://localhost:8081/api/auth/meta/callback
(If hosting remotely, replace http://localhost:8081 with your APP_BASE_URL)
Enable in Development mode — no App Review needed for your own accounts:
| Permission | Used for |
|---|---|
pages_manage_posts |
Post to Facebook Page |
pages_read_engagement |
Read Facebook Page feed |
instagram_basic |
Read Instagram media |
instagram_content_publish |
Publish Instagram posts |
instagram_manage_insights |
Required alongside content_publish |
That's it. Tokens are stored in MongoDB — no .env editing required. You can connect multiple Pages and Instagram accounts simultaneously.
| Token | Expiry | How it is handled |
|---|---|---|
| Short-lived user token | 1–2 hours | Exchanged automatically during OAuth |
| Long-lived user token | ~60 days | Stored in MongoDB; reconnect via Settings when it expires |
| Page access token | Never expires | Fetched during OAuth and stored; does not need refreshing |
Instagram publishing: Instagram does not support text-only posts via the Graph API. Every post requires at least one image URL (
imageUrl) or video URL (videoUrl) in addition to the caption. The compose view will need these fields when targeting Instagram.
ui/src/locales/xx.ts (copy en.ts and translate)In ui/src/locales/index.ts:
import xx from './xx'
// Add to messages: { en, tr, xx }
// Add to SUPPORTED_LOCALES: { code: 'xx', label: '...', flag: '🇽🇽' }
Done — language will appear in the NavBar dropdown automatically
services/{platform}/ with index.js, package.json, DockerfileBasePlatformService and implement fetchFeed(), publishPost(), getStatus()docker-compose.ymlfeed-aggregator and scheduler environment variablesui/src/stores/platforms.ts.
├── services/
│ ├── utils/ # Shared: RabbitMQ, MongoDB, BasePlatformService
│ ├── gateway/ # API gateway
│ ├── socket/ # WebSocket server
│ ├── formatter/ # Content formatter
│ ├── ai_grammar_correction/
│ ├── feed-aggregator/
│ ├── scheduler/
│ ├── twitter/
│ ├── linkedin/
│ ├── mastodon/
│ └── bluesky/
├── ui/
│ └── src/
│ ├── views/ # Dashboard, Compose, Scheduler, Settings
│ ├── components/
│ ├── stores/ # Pinia: feed, compose, platforms
│ ├── locales/ # i18n: en, tr
│ └── router/
├── docs/ # Architecture, roadmap, platform guides (gitignored)
├── docker-compose.yml
├── nginx.conf
└── .env.example