Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

📅 Post Scheduler

A full-stack social media post scheduling platform built as a monorepo. Users can connect their social media accounts and schedule posts to be published automatically.


🏗️ Architecture

This project is a Turborepo monorepo powered by pnpm workspaces, containing a Next.js frontend, a FastAPI backend, and a shared auto-generated API client.

post-scheduler/
├── apps/
│ ├── web/ # Next.js 16 frontend (React 19, Tailwind CSS v4, shadcn/ui)
│ └── backend/ # FastAPI backend (Python 3.13, SQLAlchemy, Alembic)
└── packages/
├── api-client/ # Auto-generated TypeScript API client (@hey-api/openapi-ts)
├── eslint-config/ # Shared ESLint configuration
└── typescript-config/ # Shared TypeScript configuration

✨ Features

  • 🔐 User Authentication — Signup & login with hashed passwords (bcrypt)
  • 🌐 Social Media Integration — LinkedIn OAuth integration (Facebook, LinkedIn supported)
  • 🗓️ Post Scheduling — Schedule posts with recurrence support (minutes, hours, days)
  • 🧠 Autonomous Posting Agent — AI-powered post writer using LangChain and Google Gemini (gemini-2.0-flash)
  • 💾 Long-Term Memory — Persistent context tracking using Supermemory (via isolated per-scheduler tags) to prevent content duplication across runs
  • 🔄 Auto-Generated API Client — TypeScript client generated from the FastAPI OpenAPI schema
  • 🛡️ Async Backend — Fully async FastAPI + SQLAlchemy with PostgreSQL via asyncpg

🛠️ Tech Stack

LayerTechnology
FrontendNext.js 16, React 19, Tailwind CSS v4, shadcn/ui
BackendFastAPI, SQLAlchemy 2, Alembic, Uvicorn
AI EngineLangChain, langchain-google-genai, supermemory
DatabasePostgreSQL (async via asyncpg)
API Client@hey-api/openapi-ts (auto-generated from OpenAPI)
MonorepoTurborepo, pnpm workspaces
LanguageTypeScript 5.9 (frontend), Python 3.13 (backend)

📋 Prerequisites


🚀 Getting Started

1. Clone the repository

git clone git@github.com:codernex/post-scheduler.git
cd post-scheduler

2. Install JavaScript dependencies

pnpm install

3. Set up the Python backend

cd apps/backend
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -r pyproject.toml

4. Configure environment variables

Create a .env file in apps/backend/:

DATABASE_URL="postgresql+asyncpg://<user>:<password>@127.0.0.1:5432/scheduler"LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"JWT_SECRET="your_secure_jwt_secret_key"# AI Agent ConfigurationGEMINI_API_KEY="your_gemini_api_key_here"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

5. Run database migrations

# From apps/backend/ with the venv activated
alembic upgrade head

6. Seed the database

Populates the social_media table with initial platforms (Facebook, LinkedIn):

# From apps/backend/ with the venv activated
make seed

🐳 Running with Docker

You can run the entire stack (Next.js frontend, FastAPI backend, and a PostgreSQL database) inside Docker using Docker Compose.

1. Configure root environment variables

Create a .env file in the project root directory (next to docker-compose.yml):

# Database Settings (handled automatically by Docker Compose postgres service)DATABASE_URL="postgresql+asyncpg://postgres:123456@postgres:5432/scheduler"# Authentication & JWTJWT_SECRET="your_secure_jwt_secret_key"# Social Media Integration (LinkedIn / Facebook OAuth)LINKEDIN_CLIENT_ID="your_linkedin_client_id"LINKEDIN_CLIENT_SECRET="your_linkedin_client_secret"LINKEDIN_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/linkedin/callback"FACEBOOK_CLIENT_ID="your_facebook_client_id"FACEBOOK_CLIENT_SECRET="your_facebook_client_secret"FACEBOOK_REDIRECT_URI="http://localhost:8081/api/v1/social-media/connect/facebook/callback"# AI Agent ConfigurationOPENROUTER_API_KEY="your-openrouter-key"OPENROUTER_MODEL="openai/gpt-4o"SUPERMEMORY_API_KEY="your_supermemory_api_key_here"

2. Build and start services

Run the following command from the project root:

docker compose up --build -d

This will build the images and run three containers:

  • PostgreSQL: Exposed locally on port 5435
  • FastAPI Backend: Exposed locally on port 8081 (migrations run automatically on start)
  • Next.js Frontend: Exposed locally on port 3000

3. Seed the database (initial run only)

To populate the database with the initial social media platform definitions inside the running container, run:

docker compose exec backend sh -c "PYTHONPATH=src python -m core.seed"

💻 Development

Run all services concurrently from the repo root:

pnpm dev

This starts:

  • Frontend at http://localhost:3000 (Next.js dev server)
  • Backend at http://localhost:8081 (Uvicorn with --reload)
  • API client generator watching for OpenAPI schema changes

To run services individually:

# Frontend only
pnpm dev:frontend
# Backend only
pnpm dev:backend
# Regenerate the TypeScript API client (backend must be running)
pnpm generate

🔌 API Overview

The backend is served at http://localhost:8081 and exposes interactive docs at:

  • Swagger UI: http://localhost:8081/docs
  • ReDoc: http://localhost:8081/redoc
  • OpenAPI JSON: http://localhost:8081/openapi.json

Auth Endpoints (/api/v1/auth)

MethodEndpointDescription
POST/signupRegister a new user
POST/loginAuthenticate a user

Social Media Endpoints (/api/v1/social-media)

MethodEndpointDescription
GET/connect/linkedinInitiate LinkedIn integration connection (redirects to OAuth)
GET/connect/linkedin/callbackLinkedIn OAuth callback (handles integration token persistence)
GET/statusGet connected/disconnected integration status of platforms
DELETE/disconnect/{platform}Disconnect a connected social media platform

Scheduler Endpoints (/api/v1/scheduler)

MethodEndpointDescription
POST/Create a new post scheduler config
GET/Get all post schedules for the authenticated user
DELETE/{schedule_id}Delete a specific scheduler configuration
GET/{schedule_id}/logsGet execution audit logs for a specific scheduler

📦 Packages

@repo/api-client

A TypeScript API client auto-generated from the FastAPI OpenAPI schema using @hey-api/openapi-ts. It is consumed directly by the web app via a pnpm workspace alias.

To regenerate after backend changes (backend must be running):

pnpm generate

@repo/eslint-config & @repo/typescript-config

Shared linting and TypeScript configurations used across all apps and packages in the monorepo.


🗄️ Database Schema

TableDescription
usersRegistered users with hashed passwords
social_mediaSupported social platforms (Facebook, LinkedIn, …)
user_social_mediaMany-to-many: users ↔ connected accounts
schedulerScheduled post settings (recurrence, runs, user prompts)
task_executionsActive execution queue entries pulled by workers
scheduler_logsAudit log history tracking published contents & generation outcomes
api_tokensOAuth tokens for social media integrations

Migrations are managed with Alembic:

# Generate a new migration
alembic revision --autogenerate -m "description"# Apply migrations
alembic upgrade head
# Roll back one step
alembic downgrade -1

🔧 Available Scripts

Root (from post-scheduler/)

CommandDescription
pnpm devStart all services concurrently
pnpm dev:frontendStart the Next.js dev server only
pnpm dev:backendStart the FastAPI Uvicorn server only
pnpm generateRegenerate the TypeScript API client
pnpm buildBuild all apps via Turborepo
pnpm lintLint all packages
pnpm check-typesType-check all packages
pnpm formatFormat all .ts, .tsx, and .md files

Backend (from apps/backend/)

CommandDescription
make runStart the Uvicorn dev server on port 8081
make seedSeed the database with initial data

About

In this application user will able to connect their social media and create post schedule with prompt that an ai agent gonna use to generate post for

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages