Full-Stack / Production
A modern freelancing platform built with React, TypeScript, and Node.js featuring real-time messaging, order management, and a polished UI.
A full-stack web application for connecting freelancers with clients. Built from the ground up with modern technologies and a focus on clean architecture and user experience.
Stack: React 18 + TypeScript + Vite + Material-UI
client/src/
├── components/
│ ├── atoms/ # Basic UI elements
│ ├── molecules/ # Composite components
│ ├── organisms/ # Complex features
│ └── modals/ # Modal dialogs
├── pages/
│ ├── AuthPage # Login/registration
│ ├── SearchPage # Service discovery
│ ├── ProfilePage # User profiles
│ ├── MessagesPage # Conversations
│ ├── OrdersPage # Order management
│ └── CreatePage # Content creation
├── hooks/ # Custom React hooks
├── store/ # Redux state management
├── api/ # API client functions
└── types/ # TypeScript definitions
Key Frontend Features:
useListings, usePosts, etc. for data fetchingStack: Node.js + Express + Prisma + PostgreSQL
server/src/
├── routes/
│ ├── auth.ts # JWT authentication
│ ├── users.ts # User CRUD
│ ├── posts.ts # Feed content
│ ├── listings.ts # Service listings
│ ├── orders.ts # Order lifecycle
│ └── messages.ts # Conversations
├── middleware/
│ └── auth.ts # JWT verification
├── services/ # Business logic
└── types/ # Shared types
Key Backend Features:
User
├── id, email, username, avatarUrl
├── bio, skills[], isVerified
└── listings[], orders[], messages[]
Post (polymorphic)
├── TEXT: title, content, imageUrls[]
├── EVENT: date, time, location, rsvpCount
└── LISTING: price, category, deliveryDays
Order
├── id, status, price, requirements
├── buyer (User), seller (User)
└── listing (Post), messages[]
Conversation
├── participants (User[])
└── messages[]
The app supports multiple post types with polymorphic rendering:
Global modals managed through Redux:
ListingDetailModal: Full service detailsCreateListingModal: Service creation flowCommentModal: Discussions on any postSendMessageModal: Direct messagingEditProfileModal: Profile updatesconst PostCard: React.FC<{ post: PostPreview }> = ({ post }) => {
switch (post.type) {
case 'TEXT':
return <TextPostCard {...textProps} />;
case 'EVENT':
return <EventPostCard {...eventProps} />;
case 'LISTING':
return <ServiceCard {...listingProps} />;
default:
return <FeedPost {...defaultProps} />;
}
};
const FeedFilterPills: React.FC = () => {
const dispatch = useAppDispatch();
const activeFilters = useAppSelector(state => state.ui.feedFilterTypes);
return (
<Stack direction="row" spacing={1}>
{['TEXT', 'EVENT', 'LISTING'].map(type => (
<Chip
key={type}
selected={activeFilters.includes(type)}
onClick={() => dispatch(toggleFeedFilter(type))}
/>
))}
</Stack>
);
};
Currently in active development. Core features implemented:
Coming soon: