OmniPost is a modern, all-in-one content publishing tool designed to help content creators and operators efficiently publish video content to multiple mainstream social media platforms with a single click. The project implements video upload and scheduled publishing functionality for platforms such as Douyin (TikTok), Xiaohongshu (Little Red Book), Kuaishou, and WeChat Channels.
- π Project Overview
- π‘ Features
- π§ Tech Stack
- π Supported Platforms
- πΎ Installation Guide
- π Quick Start
- π Project Structure
- π€ Contributing Guidelines
- π Acknowledgments
- π License
OmniPost is an open-source, multi-platform content publishing tool that supports video publishing automation across various mainstream platforms. The project adopts a Monorepo architecture, providing a professional web interface and RESTful API endpoints, while maintaining a flexible CLI approach and comprehensive testing infrastructure.
- Content creators batch-publishing videos to multiple platforms
- Operations teams managing multi-account scheduled publishing tasks
- Workflow automation integration with other systems
- β Multi-Platform Support: Covers major Chinese social media platforms
- β Article Publishing: Support for Markdown publishing to Zhihu and Juejin (New!)
- β Browser Session Reuse: Direct use of local Chrome sessions for zero-friction login (New!)
- β Unified CLI: Powerful command-line tool for developers (New!)
- β Scheduled Publishing: Support for precise publication timing
- β Separated Frontend & Backend: Intuitive web management interface
- β API Encapsulation: Support for integration with other systems
- β Cookie Management: Multi-account cookie storage and management
- β Comprehensive Testing: Extensive test suite for reliability
- β Automated CI/CD: GitHub Actions workflows for continuous integration
- β OpenCLI Extensions: Plug-in architecture for adding new platforms via CLI tools (New!)
| Platform | Status |
|---|---|
| Douyin (TikTok) | β |
| WeChat Channels | β |
| Xiaohongshu (Little Red Book) | β |
| Kuaishou | β |
- Framework: Vue 3 + Vite
- UI Component Library: Element Plus
- State Management: Pinia
- Routing: Vue Router
- HTTP Client: Axios
- Language: Node.js 20+ (TypeScript 5.x)
- Framework: Express.js (ESM)
- Browser Automation: Playwright (Node.js version)
- Database: SQLite
- Testing Framework: Vitest
This project implements video upload functionality through platform-specific uploader modules:
| Platform Name | Primary Uploader Module |
|---|---|
| Douyin | apps/backend-node/src/uploader/douyin/main.ts |
| WXChannels (WeChat Channels) | apps/backend-node/src/uploader/wx_channels/main.ts |
| Xiaohongshu | apps/backend-node/src/uploader/xiaohongshu/main.ts |
| Kuaishou | apps/backend-node/src/uploader/kuaishou/main.ts |
| Bilibili | apps/backend-node/src/uploader/bilibili/main.ts |
OmniPost supports dynamically adding new platform uploaders through OpenCLI extensions. Each extension is a self-contained CLI tool with a JSON manifest that declares its capabilities.
apps/backend-node/extensions/<platform_slug>/
βββ cli.js # CLI entry point (Commander-based)
βββ manifest.ocs.json # OCS capability manifest
- Create the directory under
apps/backend-node/extensions/using the platform slug (e.g.,wx_official_account) - Write
manifest.ocs.jsondeclaring the platform ID, supported actions, and required arguments: - Write
cli.jsimplementing the declared actions. The runner invokes it withnode cli.js <action> --<arg> <value>. - Sync extensions via the API:
POST /api/opencli/sync
The backend will automatically discover the extension and make it available for publishing through the standard task pipeline.
- Node.js >= 20.0.0
- npm >= 9.0.0
- Modern browser (Chrome, Firefox, Safari, or Edge)
git clone https://github.com/RbBtSn0w/omni-post.git
cd omni-postImportant: The maintained development path is the Node.js monorepo workspace. Use the root workspace scripts rather than ad-hoc installs inside subdirectories.
# Recommended Node.js workspace setup
npm install
npx playwright install chromiumStarting from v1.2.0, OmniPost uses a strict monorepo workspace configuration. Here are the core commands you should use:
- Initialize project:
npm install(Installs workspace dependencies) - Run dev servers:
npm run dev:nodeandnpm run dev:frontend - Run all tests:
npm run test(Primarily Vitest across maintained packages) - Lint all code:
npm run lint - Check workspace integrity:
npm run check:workspace(Validates package naming and scripts) - Clean build artifacts:
npm run clean(Safely removesdist/andcoverage/, preservingdata/and.env)
# Run lint/test across all workspaces
npm run lint
npm run test
# Clean workspace artifacts
npm run clean
# Validate workspace contract
npm run check:workspace
# Measure install time (SC-001 baseline)
time npm installnpx playwright install chromiumIf this is a fresh installation, initialize the database (not needed if upgrading):
npm run db:init -w apps/backend-nodeIf you are upgrading from a version older than v1.3.1, please run the one-time data migration script to sync your historical WeChat Channels (Tencent) tasks to the new WXChannels standard:
cd apps/backend-node
node scripts/migrate-wx-channels.mjs# Start the backend and frontend
npm run dev:node
npm run dev:frontend
# Or individually
npm run dev:node # Node.js Backend (http://localhost:5409)
npm run dev:frontend # Vue 3 Frontend (http://localhost:5173)- After starting the services, navigate to
http://localhost:5173 - Add account credentials and log in within the web interface
- Upload video files and fill in metadata (title, tags, etc.)
- Select target platforms and publishing time
- Click publish, and the system will automatically execute the publishing task
omni-post/
βββ apps/
β βββ backend-node/ # Node.js TypeScript Backend (Primary)
β β βββ src/
β β β βββ app.ts # Express Application
β β β βββ routes/ # HTTP Route Layer
β β β βββ services/ # Business Logic & Task Execution
β β β βββ uploader/ # TS Playwright Uploaders
β β βββ extensions/ # OpenCLI extension plugins
β β βββ tests/ # Vitest suite
β β
β βββ frontend/ # Vue.js 3 Frontend (Shared)
β βββ src/
β β βββ views/ # Page components (Dashboard, Publish, etc.)
β β βββ components/ # Reusable components
β β βββ stores/ # Pinia state management
β β βββ api/ # API service layer
β β βββ router/ # Vue Router configuration
β β βββ composables/ # Composition API utilities
β β βββ utils/ # Helper functions
β β βββ assets/ # Static assets
β βββ tests/ # Frontend test suite
β βββ vite.config.js # Vite configuration
β βββ vitest.config.js # Vitest configuration
β
βββ packages/
β βββ shared/ # Shared logic (SSOT for types/constants)
β βββ shared-config/ # Standardized lint/TS configs
β βββ cli/ # Node-based CLI automation tool
β
βββ .github/
β βββ workflows/ # GitHub Actions CI/CD
β βββ test.yml # Automated testing
β βββ lint-backend.yml # Backend code quality
β
βββ package.json # Monorepo root configuration
βββ ARCHITECTURE.md # Architecture documentation
βββ CONTRIBUTING.md # Contribution guidelines
βββ README_CN.md # Chinese README
βββ README.md # English README (this file)
βββ LICENSE # MIT License
- routes/: API endpoint definitions (
account.ts,publish.ts,article.ts,browser.ts,file.ts) - services/: Business logic layers (
task-service.ts,publish-service.ts,publish-executor.ts,login-service.ts,cookie-service.ts) - uploader/: Platform-specific upload implementations (
main.tsentry points) - utils/: Network utilities and file helpers (
path.ts,response.ts) - db/: Database management and migrations (
migrations.ts)
- views/: Main pages (
Dashboard,AccountManagement,PublishCenter,TaskManagement,MaterialManagement) - components/: UI components (
GroupSelector) - stores/: Pinia stores (
user,account,task,group,app) - api/: specific API clients (
account.js,task.js,material.js,user.js) - Shared Package (@omni-post/shared):
- SSOT: Single Source of Truth for platform IDs, task interfaces, and enum mappings.
- logic/: Common validation and transformation utilities.
- tests/: Vitest suite ensures cross-platform logic consistency.
# Run all linters
npm run lint
# Lint frontend
npm run lint:frontend
# Clean build artifacts
npm run clean# Development
npm run dev # Start both backend and frontend
# Building
npm run build # Build frontend for production
npm run preview # Preview production build
# Information
npm run info # Display project informationWe welcome contributions in all forms! For detailed information, please refer to CONTRIBUTING.md.
- Fork this repository
- Create a feature branch (
git checkout -b feature/YourFeature) - Commit your changes (
git commit -m 'Add some feature') - Push to the branch (
git push origin feature/YourFeature) - Create a Pull Request
- Frontend: Follow Vue 3 best practices and ES6+ conventions
- Backend: Follow Node.js/TypeScript best practices
- Testing: Ensure tests pass with
npm test - Code Quality: Run linters before committing with
npm run lint
Use clear, descriptive commit messages following this pattern:
<type>(<scope>): <subject>
<body>
Types: feat, fix, docs, style, refactor, test, chore
- Language: TypeScript (Backend), JavaScript/Vue (Frontend)
- Test Coverage: Extensive unit and integration tests
- Architecture: Monorepo with Workspaces
- License: MIT
- Status: Active Development
This project is inspired by dreammis/social-auto-upload and has been completely redesigned and rewritten. Thanks to the original project team for their pioneering work!
This project is licensed under the MIT License.
- Documentation: Check CONTRIBUTING.md and ARCHITECTURE.md
- Issues: Use GitHub Issues for bug reports and feature requests
- Discussions: Start a discussion for questions and ideas
If this project has been helpful to you, please give it a β Star to show your support!
Last Updated: March 2026

{ "ocs_version": "1.0", "name": "my-platform", "version": "1.0.0", "platform_id": 101, // Use 100+ for dynamic local extensions "actions": { "publish_article": { "command": "publish", "args": { "title": "--title", "content": "--content" } } } }