π Live Demo Β Β·Β π Report Bug Β Β·Β β¨ Request Feature
- About The Project
- What's New in v2.0
- Tech Stack
- Features
- Getting Started
- Project Structure
- Context Architecture
- API Documentation
- Pages & Routes
- Contributing
- Contact
Nexora is a full-featured social media platform where users can connect, share posts, react to content, follow people, and build their network. Built with the latest React 19, TanStack Query v5, and HeroUI, Nexora delivers a seamless and polished experience across all devices.
| π React 19 | Latest features for optimal rendering and concurrent mode |
| β‘ TanStack Query v5 | Infinite queries, optimistic updates, and smart cache invalidation |
| π¨ HeroUI + Tailwind 4 | Beautiful, accessible components with utility-first styling |
| π Context Architecture | Dedicated contexts for Auth, Posts, Follow, QuickActions, Comments, Notifications |
| π± Fully Responsive | Mobile-first design that looks great on every screen |
| π Dark Mode Native | First-class dark mode support across every component |
Full changelog at
/updates
- Follow / Unfollow with optimistic UI, mutual follower badges, and paginated suggestions
- Infinite pagination on suggestions, comments, and replies via
useInfiniteQuery - Real-time notifications β unread badge, mark-one-read, mark-all-read
- Full comment & reply system β create, edit, delete, like, paginated replies via
CommentContext - Repost with caption β inline on feed, post card, and post page
- Bookmark toggle with paginated library, sort by date or popularity
- Image expand modal on ProfilePostCard with download support
- Pricing page β Free / Pro / Elite with monthly/yearly toggle and feature comparison table
- Features showcase page with interactive hover cards
- Updates & changelog page
- All like / bookmark mutations extracted to
QuickActionsContextβ no more prop-drilled mutations CommentContextis now the single source of truth for all comment state across the appFollowContextmigrated touseInfiniteQueryfor proper paginated suggestionsqueryClient.invalidateQueriesupdated to TQ v5 object syntax throughout
- Fixed
FollowContextcrash βQueryClientcalled on class instead of hook instance - Fixed
axios.putauth header passed as body instead of config - Fixed
WhoToFollowundefined context crash when rendered outside provider - Fixed post liked state initialization using unreliable
likes[]array - Fixed
PostPagedeprecatedonSuccesscallback replaced withuseEffect
| Package | Version | Purpose |
|---|---|---|
react |
^19.2.0 | UI library |
react-dom |
^19.2.0 | DOM renderer |
react-router-dom |
^7.13.0 | Client-side routing |
axios |
^1.13.5 | HTTP client |
@tanstack/react-query |
^5.90.21 | Server state, caching, infinite queries |
| Package | Version | Purpose |
|---|---|---|
@heroui/react |
^2.8.9 | Component library |
tailwindcss |
^4.1.18 | Utility-first CSS |
framer-motion |
^12.34.0 | Animations |
react-icons |
^5.5.0 | Icon sets |
| Package | Version | Purpose |
|---|---|---|
react-hook-form |
^7.71.1 | Form state & validation |
react-head |
^3.4.2 | Document head / SEO |
emoji-picker-element |
^1.29.0 | Emoji support in posts |
| Package | Version | Purpose |
|---|---|---|
vite |
^7.3.1 | Build tool |
@vitejs/plugin-react |
^5.1.1 | React fast refresh |
eslint |
^9.39.1 | Linting |
- Base URL:
https://linked-posts.routemisr.com - Auth: Bearer token (JWT) via
Authorizationheader - Storage: Cloudflare R2 for media
- Registration, login, and JWT token management
- Profile photo upload to Cloudflare R2
- Password change with token rotation
- Follow / unfollow with mutual follower count
- Paginated follow suggestions
- Create posts with body text and image upload
- Edit and delete own posts
- Home timeline β All / Following / Me tabs
- Privacy per post β Public, Followers only, Private
- Like / unlike with optimistic updates
- Bookmark / unbookmark with instant toggle
- Repost with optional caption
- Paginated comments via infinite scroll
- Nested replies with their own pagination
- Like comments
- Edit and delete own comments
- Images in comments
- Real-time unread badge count
- Mark individual or all notifications as read
- Paginated notification list
- Explore feed with trending topics sidebar and Who to Follow
- Bookmarks library with sort controls
- Suggested friends grid with search and filter
- Individual post page with full comment thread
- User profiles with posts grid
- Pricing page (Free / Pro / Elite)
- Features showcase
- Changelog / Updates
- About, Contact, Support, Download App
- Privacy Policy, Terms of Service, Cookie Policy, Licensing, Press Kit
- Node.js v18 or higher
- npm or yarn
# 1. Clone the repository
git clone https://github.com/Abdelrahman968/nexora-route.git
cd nexora-route
# 2. Install dependencies
npm install
# 3. Create environment file
cp .env.example .envVITE_BASE_URL=https://linked-posts.routemisr.comnpm run dev
# β http://localhost:5173npm run build
npm run previewnpm run dev # Start dev server with HMR
npm run build # Production build β dist/
npm run preview # Preview production build locally
npm run lint # Run ESLintnexora/
βββ public/
β βββ logo.png
βββ src/
β βββ assets/
β βββ component/
β β βββ Comment/
β β β βββ Comment.jsx # Comments sheet + DeleteModal + ShareModal
β β βββ CreatePost/
β β β βββ CreatePost.jsx
β β βββ Donation/
β β βββ DownloadApp/
β β βββ Error/
β β βββ Explore/
β β β βββ Explore.jsx # Feed tabs + WhoToFollow sidebar
β β βββ ForgotPassword/
β β βββ Loading/
β β βββ Login/
β β βββ Navbar/
β β βββ Notifications/
β β βββ PostCard/
β β β βββ PostCard.jsx # Feed post card (optimistic like/bookmark)
β β βββ Postpage/
β β β βββ Postpage.jsx # Full post page with comments
β β βββ Profile/
β β β βββ Profile.jsx
β β β βββ UserProfile.jsx
β β βββ ProfilePostCard/
β β β βββ ProfilePostCard.jsx # Grid card with hover overlay
β β βββ Register/
β β βββ SEO/
β β β βββ SEO.jsx
β β βββ Settings/
β β βββ SuggestedFriends/
β β β βββ SuggestedFriends.jsx # Full suggested friends page
β β βββ Support/
β β βββ Footer/
β β βββ WhoToFollow/
β β βββ WhoToFollow.jsx # Sidebar widget (real API)
β βββ context/
β β βββ AuthContext.jsx # JWT token + user session
β β βββ CommentContext.jsx # Comments, replies, likes CRUD
β β βββ FollowContext.jsx # Suggestions (infinite), follow toggle
β β βββ NotificationContext.jsx # Notifications + unread count
β β βββ PostContext.jsx # Home feed with tab switching
β β βββ ProfileInfoContext.jsx # Current user profile data
β β βββ ProtectedRoute.jsx # Auth guard HOC
β β βββ QuickActionsContext.jsx # Post like, likes list, bookmark
β β βββ ToastContext.jsx # Global toast notifications
β βββ pages/
β β βββ About/
β β βββ Bookmarks/
β β β βββ Bookmarks.jsx
β β βββ Contact/
β β βββ Cookiepolicy/
β β βββ Error404/
β β βββ Features/
β β β βββ Features.jsx # Feature showcase page
β β βββ Home/
β β βββ Layout/
β β β βββ Layout.jsx
β β βββ Licensing/
β β βββ Presskit/
β β βββ Pricing/
β β β βββ Pricing.jsx # Plans + comparison table + FAQ
β β βββ PrivacyPolicy/
β β βββ Termsofservice/
β β βββ Updates/
β β βββ Updates.jsx # Changelog page
β βββ App.jsx
β βββ index.css
β βββ main.jsx
βββ .env
βββ .gitignore
βββ eslint.config.js
βββ index.html
βββ package.json
βββ vite.config.js
Nexora uses a layered context system. Each context has a single responsibility:
App
βββ HeroUIProvider
βββ QueryClientProvider
βββ ToastContextProvider
βββ RouterProvider
βββ AuthContextProvider # JWT session
βββ ProfileInfoContextProvider # Current user data
βββ NotificationProvider # Unread count + list
βββ QuickActionsProvider # Post like / bookmark
βββ CommentProvider # Comments / replies
βββ ProtectedRoute
βββ Layout
βββ PostContextProvider # Feed (per route)
βββ FollowContextProvider # Suggestions (per route)
| Context | Exports | Used by |
|---|---|---|
AuthContext |
userToken, userData, logout |
All authenticated requests |
ProfileInfoContext |
safeProfileInfo |
Avatar, name, isOwner checks |
QuickActionsContext |
toggleLike, toggleBookmark, usePostLikes |
PostCard, PostPage, ProfilePostCard |
CommentContext |
useComments, useReplies, createComment, createReply, editComment, deleteComment, toggleCommentLike |
Comment, PostPage |
FollowContext |
suggestions, loadMore, handleFollow, isFollowed |
WhoToFollow, SuggestedFriends |
PostContext |
safeHomeFeedData, fetchHomeFeedType |
Explore |
NotificationContext |
notifications, unreadCount, markRead, markAllRead |
Notifications, Navbar |
https://linked-posts.routemisr.com
Success
{
"success": true,
"message": "success",
"data": {},
"meta": {}
}Error
{
"success": false,
"message": "Validation error message",
"errors": ["field error 1", "field error 2"]
}| Method | Endpoint | Purpose | Auth |
|---|---|---|---|
POST |
/users/signup |
Create account, returns token + user | No |
POST |
/users/signin |
Sign in, returns token + user | No |
PATCH |
/users/change-password |
Rotate password and token | Yes |
PUT |
/users/upload-photo |
Upload profile photo to R2 | Yes |
GET |
/users/profile-data |
Current authenticated user profile | Yes |
GET |
/users/suggestions?page=&limit= |
Follow suggestions with pagination | Yes |
PUT |
/users/:userId/follow |
Toggle follow / unfollow | Yes |
POST /users/signup
Content-Type: application/json
{
"name": "string",
"email": "string",
"password": "string",
"rePassword": "string",
"dateOfBirth": "YYYY-MM-DD",
"gender": "male | female"
}POST /users/signin
Content-Type: application/json
{
"email": "string",
"password": "string"
}| Method | Endpoint | Purpose | Auth |
|---|---|---|---|
GET |
/posts |
Public post listing (newest first) | Yes |
GET |
/posts/feed?only=&page=&limit= |
Home timeline (following / me / all) | Yes |
GET |
/posts/:postId |
Single post with comments | Yes |
POST |
/posts |
Create post with body / image | Yes |
PUT |
/posts/:postId |
Update body / image | Yes |
DELETE |
/posts/:postId |
Delete own post | Yes |
PUT |
/posts/:postId/like |
Toggle like | Yes |
GET |
/posts/:postId/likes?page=&limit= |
Users who liked a post | Yes |
PUT |
/posts/:postId/bookmark |
Toggle bookmark | Yes |
POST |
/posts/:postId/share |
Create repost linked to original | Yes |
POST /posts
Authorization: Bearer {token}
Content-Type: multipart/form-data
body: "string"
image: File (optional)
privacy: "public | following | private"| Method | Endpoint | Purpose | Auth |
|---|---|---|---|
GET |
/posts/:postId/comments?page=&limit= |
Paginated post comments | Yes |
POST |
/posts/:postId/comments |
Create comment (text / image) | Yes |
PUT |
/posts/:postId/comments/:commentId |
Edit comment (owner only) | Yes |
DELETE |
/posts/:postId/comments/:commentId |
Delete (owner or post owner) | Yes |
PUT |
/posts/:postId/comments/:commentId/like |
Toggle comment like | Yes |
GET |
/posts/:postId/comments/:commentId/replies?page=&limit= |
Paginated replies | Yes |
POST |
/posts/:postId/comments/:commentId/replies |
Create reply | Yes |
| Method | Endpoint | Purpose | Auth |
|---|---|---|---|
GET |
/notifications?page=&limit= |
Notifications list with entity details | Yes |
GET |
/notifications/unread-count |
Unread badge count | Yes |
PATCH |
/notifications/:notificationId/read |
Mark one as read | Yes |
PATCH |
/notifications/read-all |
Mark all as read | Yes |
| Method | Endpoint | Purpose | Auth |
|---|---|---|---|
GET |
/users/bookmarks?page=&limit= |
Paginated bookmarks library | Yes |
PUT |
/posts/:postId/bookmark |
Toggle bookmark on a post | Yes |
| Route | Component | Auth Required |
|---|---|---|
/ |
Home |
No |
/explore |
Explore |
Yes |
/posts/:postId |
PostPage |
Yes |
/profile |
Profile |
Yes |
/profile/:id |
UserProfile |
Yes |
/notifications |
Notifications |
Yes |
/bookmarks |
Bookmarks |
Yes |
/suggestions |
SuggestedFriends |
Yes |
/settings |
Settings |
Yes |
/login |
Login |
No |
/register |
Register |
No |
/forgot-password |
ForgotPassword |
No |
/pricing |
Pricing |
No |
/features |
Features |
No |
/updates |
Updates |
No |
/about |
About |
No |
/contact |
Contact |
No |
/support |
Support |
No |
/download |
DownloadApp |
No |
/donation |
Donation |
No |
/privacy |
PrivacyPolicy |
No |
/terms |
TermsOfService |
No |
/cookies |
CookiePolicy |
No |
/licensing |
Licensing |
No |
/press-kit |
PressKit |
No |
* |
Error404 |
No |
Contributions are welcome and greatly appreciated!
- Fork the repository
- Create your feature branch β
git checkout -b feature/your-feature - Commit your changes β
git commit -m 'feat: add your feature' - Push to the branch β
git push origin feature/your-feature - Open a Pull Request
Please follow the existing code patterns β use the context system for shared state, prefer optimistic updates for UX-sensitive actions, and keep components focused on presentation.
This project is licensed under the MIT License β see the LICENSE file for details.
Abdelrahman
- GitHub: @Abdelrahman968
- Email: se.abdelrahman968@gmail.com
- Live Demo: nexora-route.netlify.app
- Project: github.com/Abdelrahman968/nexora-route
- React β UI library
- TanStack Query β Server state management
- Vite β Blazing fast build tool
- Tailwind CSS β Utility-first CSS
- HeroUI β Beautiful component library
- Framer Motion β Animations
- Route Academy β API provider
- Netlify β Hosting & CI/CD
β Star this repo if you find it useful!
Made with β€οΈ by Abdelrahman