A full-stack MERN application for managing social media posts across multiple clients and platforms. Built with React Native (Expo) for mobile and Express + MongoDB for the backend.
- User authentication (signup/login with JWT)
- Client management (CRUD operations)
- Post planning and scheduling
- Calendar view for visualizing scheduled posts
- Multi-platform support (Instagram, Facebook, Twitter, LinkedIn, TikTok, YouTube)
- Media support via URLs (works out of the box)
- Optional direct file uploads via Cloudinary (if you configure it)
- Client notes for strategy tracking
- Cross-platform mobile app (iOS and Android)
- Node.js + Express
- MongoDB + Mongoose
- JWT Authentication
- Cloudinary (media uploads)
- bcryptjs (password hashing)
- React Native
- Expo + Expo Router
- React Query (data fetching)
- AsyncStorage (token storage)
- React Native Calendars
manager/
├── backend/
│ ├── config/
│ │ ├── db.js
│ │ └── cloudinary.js
│ ├── models/
│ │ ├── User.js
│ │ ├── Client.js
│ │ ├── Post.js
│ │ └── Note.js
│ ├── routes/
│ │ ├── auth.js
│ │ ├── clients.js
│ │ ├── posts.js
│ │ └── notes.js
│ ├── middleware/
│ │ └── auth.js
│ ├── server.js
│ └── package.json
└── frontend/
├── app/
│ ├── (auth)/
│ │ ├── login.jsx
│ │ └── register.jsx
│ ├── (tabs)/
│ │ ├── posts.jsx
│ │ ├── calendar.jsx
│ │ ├── clients.jsx
│ │ └── profile.jsx
│ ├── post/
│ │ └── create.jsx
│ ├── client/
│ │ └── create.jsx
│ ├── _layout.jsx
│ └── index.jsx
├── src/
│ ├── context/
│ │ └── AuthContext.js
│ └── services/
│ └── api.js
└── package.json
- Node.js (v16 or higher)
- MongoDB (local or MongoDB Atlas)
- Expo CLI (
npm install -g expo-cli) - Android Studio / Xcode (for emulators) or Expo Go app on your phone
- Navigate to the backend directory:
cd backend- Install dependencies (already done):
npm install- Create a
.envfile in the backend directory:
cp .env.example .env- Configure your
.envfile:
PORT=5000
MONGO_URI=mongodb://localhost:27017/post-planner
JWT_SECRET=your_super_secret_jwt_key_change_this
# Optional: Cloudinary for media uploads (NOT required for basic functionality)
# The app works fine with media URLs - only needed for direct file uploads
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secretNote: Cloudinary is optional. The app works perfectly without it - users can paste image/video URLs. Only set up Cloudinary if you want direct file upload functionality.
- Start MongoDB (if running locally):
mongod- Run the backend server:
npm run devThe backend should now be running on http://localhost:5000
- Navigate to the frontend directory:
cd frontend- Dependencies are already installed. If needed:
npm install- Update the API URL in
src/services/api.js:
// For testing on physical device, replace localhost with your computer's IP
const API_URL = 'http://YOUR_IP_ADDRESS:5000/api';
// Example: 'http://192.168.1.10:5000/api'- Start the Expo development server:
npx expo start- Run the app:
- Press
afor Android emulator - Press
ifor iOS simulator (Mac only) - Scan QR code with Expo Go app on your phone
- Press
POST /api/auth/register- Register new userPOST /api/auth/login- Login userGET /api/auth/me- Get current user
GET /api/clients- Get all clientsGET /api/clients/:id- Get single clientPOST /api/clients- Create clientPUT /api/clients/:id- Update clientDELETE /api/clients/:id- Delete clientGET /api/clients/:id/notes- Get client notes
GET /api/posts- Get all posts (with optional filters)GET /api/posts/:id- Get single postGET /api/posts/calendar/view- Get posts grouped by datePOST /api/posts- Create postPUT /api/posts/:id- Update postDELETE /api/posts/:id- Delete postPOST /api/posts/upload- Upload media file
GET /api/notes- Get all notesGET /api/notes/:id- Get single notePOST /api/notes- Create notePUT /api/notes/:id- Update noteDELETE /api/notes/:id- Delete note
- Configure your app.json with proper package name and version
- Build the app:
npx expo build:android- Or create a production build with EAS:
npm install -g eas-cli
eas build --platform androideas build --platform ios- Create a Google Play Developer account
- Build a release AAB:
eas build --platform android --profile production- Download the AAB file
- Upload to Google Play Console
- Fill in store listing details
- Submit for review
- Post editing functionality
- Client details view with notes
- Filter posts by client/platform
- Push notifications for upcoming posts
- Image picker for direct media uploads
- Post templates
- Analytics dashboard
- Team collaboration features
- Backend runs on port 5000
- MongoDB runs on port 27017 (default)
- Frontend uses Expo development server
- JWT tokens expire in 30 days
- All API endpoints (except auth) require authentication
- Replace
localhostwith your computer's IP address infrontend/src/services/api.js - Ensure both devices are on the same network
- Check firewall settings
- Ensure MongoDB is running
- Check MONGO_URI in .env file
- For Atlas, ensure IP is whitelisted
- Clear cache:
npx expo start -c - Delete node_modules and reinstall
- Check for version conflicts
MIT
Built for rapid deployment to Play Store.