|
|
--- |
|
|
title: PostGen - LinkedIn Content Scheduler |
|
|
emoji: π |
|
|
colorFrom: blue |
|
|
colorTo: indigo |
|
|
sdk: docker |
|
|
pinned: false |
|
|
--- |
|
|
|
|
|
# PostGen - AI-Powered LinkedIn Content Scheduler |
|
|
|
|
|
PostGen is a comprehensive LinkedIn content scheduling application that integrates with Canva and LinkedIn APIs to automate content creation and posting. The app uses GPT for AI-generated content and Canva brand templates for consistent visual design. |
|
|
|
|
|
## Features |
|
|
|
|
|
- **Agentic AI System**: Multi-step AI planning that analyzes assets, extracts insights, and generates context-aware content |
|
|
- **Document Parsing**: Automatic OCR analysis of uploaded documents using integrated OCR API |
|
|
- **AI Content Generation**: Uses GPT with extracted asset insights to generate engaging, authentic LinkedIn posts |
|
|
- **Canva Integration**: Access and apply Canva brand templates using the Autofill API |
|
|
- **LinkedIn Scheduling**: Schedule and publish posts directly to LinkedIn |
|
|
- **Asset Repository**: Upload and organize marketing materials by product categories with automatic content extraction |
|
|
- **Smart Scheduler**: Agentic AI automatically generates content schedules based on date ranges, products, and post types |
|
|
- **Product Categories**: Support for OCR, P2P, and O2C products with sub-categories |
|
|
|
|
|
## Tech Stack |
|
|
|
|
|
- **Frontend**: React, React Router, Tailwind CSS, Framer Motion, shadcn/ui |
|
|
- **Backend**: FastAPI, Python |
|
|
- **AI**: OpenAI GPT (latest model) |
|
|
- **APIs**: Canva Connect API, LinkedIn API |
|
|
|
|
|
## Setup Instructions |
|
|
|
|
|
### Prerequisites |
|
|
|
|
|
1. **Canva Account**: |
|
|
- Canva Teams account (free trial available) |
|
|
- Canva Connect API integration created |
|
|
- Autofill API access registered |
|
|
|
|
|
2. **LinkedIn Account**: |
|
|
- LinkedIn Developer account |
|
|
- LinkedIn App created with appropriate permissions |
|
|
|
|
|
3. **OpenAI Account**: |
|
|
- OpenAI API key with access to GPT models |
|
|
|
|
|
### Environment Variables |
|
|
|
|
|
Create a `.env` file in the backend directory with the following variables: |
|
|
|
|
|
```env |
|
|
# OpenAI |
|
|
OPENAI_API_KEY=your_openai_api_key |
|
|
OPENAI_MODEL=gpt-4o |
|
|
|
|
|
# OCR API (for document parsing and asset analysis) |
|
|
OCR_API_URL=https://seth0330-ezofisocr.hf.space |
|
|
OCR_API_KEY=your_ocr_api_key |
|
|
|
|
|
# Canva (optional - can be passed via API) |
|
|
CANVA_ACCESS_TOKEN=your_canva_access_token |
|
|
|
|
|
# LinkedIn (optional - can be passed via API) |
|
|
LINKEDIN_ACCESS_TOKEN=your_linkedin_access_token |
|
|
LINKEDIN_PERSON_URN=your_linkedin_person_urn |
|
|
|
|
|
# Database (CockroachDB connection string) |
|
|
# Format: postgresql://username:password@host:port/database?sslmode=verify-full |
|
|
DATABASE_URL=postgresql://seth:YOUR_PASSWORD@ezofis-11210.jxf.gcp-us-east1.cockroachlabs.cloud:26257/defaultdb?sslmode=verify-full |
|
|
``` |
|
|
|
|
|
### Local Development |
|
|
|
|
|
1. **Install Frontend Dependencies**: |
|
|
```bash |
|
|
cd frontend |
|
|
npm install |
|
|
``` |
|
|
|
|
|
2. **Install Backend Dependencies**: |
|
|
```bash |
|
|
cd backend |
|
|
pip install -r requirements.txt |
|
|
``` |
|
|
|
|
|
**Note for PDF Viewer**: The PDF viewer requires `poppler-utils` to be installed on your system: |
|
|
- **macOS**: `brew install poppler` |
|
|
- **Ubuntu/Debian**: `sudo apt-get install poppler-utils` |
|
|
- **Windows**: Download from [poppler-windows](https://github.com/oschwartz10612/poppler-windows/releases) and add to PATH |
|
|
|
|
|
3. **Run Frontend** (development mode): |
|
|
```bash |
|
|
cd frontend |
|
|
npm run dev |
|
|
``` |
|
|
|
|
|
4. **Run Backend**: |
|
|
```bash |
|
|
cd backend |
|
|
uvicorn app.main:app --reload --port 8000 |
|
|
``` |
|
|
|
|
|
### Building for Production |
|
|
|
|
|
1. **Build Frontend**: |
|
|
```bash |
|
|
cd frontend |
|
|
npm run build |
|
|
``` |
|
|
|
|
|
2. **Build Docker Image**: |
|
|
```bash |
|
|
docker build -t postgen . |
|
|
``` |
|
|
|
|
|
3. **Run Docker Container**: |
|
|
```bash |
|
|
docker run -p 7860:7860 --env-file .env postgen |
|
|
``` |
|
|
|
|
|
## Deployment to HuggingFace Spaces |
|
|
|
|
|
### Step 1: Prepare Your Repository |
|
|
|
|
|
1. Ensure all code is committed and pushed to your Git repository |
|
|
2. Make sure the `Dockerfile` is in the root directory |
|
|
3. Ensure `README.md` has the HuggingFace Spaces configuration at the top |
|
|
|
|
|
### Step 2: Create a HuggingFace Space |
|
|
|
|
|
1. Go to [HuggingFace Spaces](https://huggingface.co/spaces) |
|
|
2. Click "Create new Space" |
|
|
3. Choose: |
|
|
- **SDK**: Docker |
|
|
- **Name**: postgen (or your preferred name) |
|
|
- **Visibility**: Public or Private |
|
|
|
|
|
### Step 3: Configure Environment Variables |
|
|
|
|
|
1. In your HuggingFace Space settings, go to "Variables and secrets" |
|
|
2. Add the following secrets: |
|
|
- `OPENAI_API_KEY`: Your OpenAI API key |
|
|
- `OPENAI_MODEL`: gpt-4o (or your preferred model) |
|
|
- `DATABASE_URL`: Your CockroachDB connection string (format: `postgresql://username:password@host:port/database?sslmode=verify-full`) |
|
|
- `CANVA_ACCESS_TOKEN`: (Optional, can be set per user) |
|
|
- `LINKEDIN_ACCESS_TOKEN`: (Optional, can be set per user) |
|
|
|
|
|
**Note**: The app will work with dummy/mock data if `DATABASE_URL` is not set. As you implement features, they will gradually use the database instead of mock data. |
|
|
|
|
|
### Step 4: Connect Your Repository |
|
|
|
|
|
1. In Space settings, connect your Git repository |
|
|
2. Or push your code directly to the HuggingFace Space repository |
|
|
|
|
|
### Step 5: Deploy |
|
|
|
|
|
1. HuggingFace will automatically build and deploy your Docker image |
|
|
2. Monitor the build logs in the Space interface |
|
|
3. Once deployed, your app will be available at: `https://huggingface.co/spaces/your-username/postgen` |
|
|
|
|
|
## API Integration Guide |
|
|
|
|
|
### Canva Integration |
|
|
|
|
|
1. **Get Access Token**: |
|
|
- Create a Canva Connect API integration |
|
|
- Complete OAuth flow to get access token |
|
|
- Token should have scopes: `design:content:write`, `design:content:read`, `brandtemplate:content:read`, `brandtemplate:meta:read` |
|
|
|
|
|
2. **Using Brand Templates**: |
|
|
- Call `/api/canva/brand-templates` to get available templates |
|
|
- Call `/api/canva/brand-templates/{id}/dataset` to get template structure |
|
|
- Call `/api/canva/autofill` to create a design from template |
|
|
- Poll `/api/canva/autofill/{job_id}` to check status |
|
|
|
|
|
### LinkedIn Integration |
|
|
|
|
|
1. **Get Access Token**: |
|
|
- Create a LinkedIn App |
|
|
- Request permissions: `w_member_social`, `r_liteprofile` |
|
|
- Complete OAuth flow to get access token |
|
|
|
|
|
2. **Posting to LinkedIn**: |
|
|
- Call `/api/linkedin/post` with your access token and post content |
|
|
- Media can be included via `media_uris` parameter |
|
|
|
|
|
### AI Content Generation |
|
|
|
|
|
1. **Generate Content**: |
|
|
- Call `/api/ai/generate-content` with: |
|
|
- `product_category`: 'ocr', 'p2p', or 'o2c' |
|
|
- `post_type`: 'carousel', 'cover_content', 'content_only', or 'webinar' |
|
|
- `context`: Optional additional context |
|
|
- `assets`: Optional list of asset IDs |
|
|
|
|
|
## Project Structure |
|
|
|
|
|
``` |
|
|
PostGen/ |
|
|
βββ frontend/ |
|
|
β βββ src/ |
|
|
β β βββ components/ |
|
|
β β β βββ ui/ # shadcn/ui components |
|
|
β β β βββ Layout.jsx # Main layout component |
|
|
β β βββ pages/ |
|
|
β β β βββ Dashboard.jsx |
|
|
β β β βββ Repository.jsx |
|
|
β β β βββ Scheduler.jsx |
|
|
β β β βββ PostEditor.jsx |
|
|
β β β βββ Integrations.jsx |
|
|
β β βββ App.jsx |
|
|
β β βββ main.jsx |
|
|
β β βββ utils.js |
|
|
β βββ package.json |
|
|
β βββ vite.config.js |
|
|
βββ backend/ |
|
|
β βββ app/ |
|
|
β β βββ services/ |
|
|
β β β βββ canva_service.py |
|
|
β β β βββ linkedin_service.py |
|
|
β β β βββ ai_service.py |
|
|
β β βββ models.py |
|
|
β β βββ schemas.py |
|
|
β β βββ main.py |
|
|
β βββ requirements.txt |
|
|
βββ Dockerfile |
|
|
βββ README.md |
|
|
``` |
|
|
|
|
|
## Database Setup (CockroachDB) |
|
|
|
|
|
### Setting Up CockroachDB Connection |
|
|
|
|
|
1. **Get Your Connection String**: |
|
|
- From your CockroachDB dashboard, copy the connection string |
|
|
- Format: `postgresql://username:password@host:port/database?sslmode=require` |
|
|
- Example: `postgresql://seth:YOUR_PASSWORD@ezofis-11210.jxf.gcp-us-east1.cockroachlabs.cloud:26257/defaultdb?sslmode=require` |
|
|
- **Note**: The app automatically uses `sslmode=require` (secure SSL without certificate file requirement) |
|
|
- If you use `sslmode=verify-full`, the app will automatically fall back to `require` if the certificate file is not available |
|
|
|
|
|
2. **Add to HuggingFace Spaces**: |
|
|
- Go to your Space settings β "Variables and secrets" |
|
|
- Add `DATABASE_URL` with your connection string |
|
|
|
|
|
3. **Database Tables**: |
|
|
- Tables are automatically created on first startup |
|
|
- The app will initialize: `users`, `integrations`, `assets`, `posts`, `campaigns` |
|
|
|
|
|
4. **Dummy Data**: |
|
|
- The app currently uses dummy/mock data for all endpoints |
|
|
- As features are implemented, they will gradually use the database |
|
|
- Dummy data will be removed feature by feature as database integration is completed |
|
|
|
|
|
## Next Steps After Deployment |
|
|
|
|
|
1. **Connect Integrations**: |
|
|
- Go to the Integrations page |
|
|
- Connect your Canva account |
|
|
- Connect your LinkedIn account |
|
|
|
|
|
2. **Upload Assets**: |
|
|
- Go to Repository page |
|
|
- Upload marketing materials, screenshots, and documents |
|
|
- Classify them by product category |
|
|
|
|
|
3. **Create Campaign**: |
|
|
- Go to Scheduler page |
|
|
- Click "Campaign Settings" |
|
|
- Configure date range, products, post types, and frequency |
|
|
- Click "Generate Schedule" |
|
|
|
|
|
4. **Review and Schedule**: |
|
|
- Review AI-generated posts |
|
|
- Edit content if needed |
|
|
- Confirm and schedule posts |
|
|
|
|
|
## Troubleshooting |
|
|
|
|
|
### Build Issues |
|
|
|
|
|
- **Frontend build fails**: Check Node.js version (requires 18+) |
|
|
- **Backend import errors**: Ensure all Python packages are installed |
|
|
- **Docker build fails**: Check Dockerfile syntax and paths |
|
|
|
|
|
### Runtime Issues |
|
|
|
|
|
- **API errors**: Verify environment variables are set correctly |
|
|
- **Canva API errors**: Check access token and scopes |
|
|
- **LinkedIn API errors**: Verify OAuth permissions |
|
|
- **AI generation fails**: Check OpenAI API key and quota |
|
|
|
|
|
### Common Issues |
|
|
|
|
|
1. **CORS errors**: Already handled in backend CORS middleware |
|
|
2. **Port conflicts**: HuggingFace Spaces uses port 7860 |
|
|
3. **File uploads**: Ensure uploads directory has write permissions |
|
|
|
|
|
## Support |
|
|
|
|
|
For issues or questions: |
|
|
- Check the API documentation in the code |
|
|
- Review Canva API docs: https://www.canva.dev/docs/connect/ |
|
|
- Review LinkedIn API docs: https://docs.microsoft.com/en-us/linkedin/ |
|
|
|
|
|
## License |
|
|
|
|
|
This project is private and proprietary. |
|
|
|