A dynamic, full-stack web application that allows users to post and view messages in real-time. This project was built to practice the fundamentals of Node.js, Express, and Server-Side Rendering.
- Backend: Node.js/Express hosted on Render (Free Tier).
- Database: PostgreSQL hosted on Neon platform.
- This project is on a free server that hibernates during inactivity. Please be patient for about a minute while it boots up; it will work perfectly immediately after that!
You can explore the live application at the link this link 👉 🔥 Live Demo
Index: A clean list of cards showcasing user messages.

Form page: A user-friendly form with real-time validation feedback.

Error Page: A custom-designed error page for a polished user experience.

- Real-time Feed: View a list of messages with author names and timestamps.
- Message Submission: A dedicated form to capture user input and add it to the board.
- PostgreSQL Persistence: Full CRUD integration with a Neon-hosted Postgres database, ensuring messages are stored securely and persist across server restarts.
- Dynamic Detail Views: Individual pages for each message to view granular details via dynamic routing.
- Robust Data Handling: Implements the Post/Redirect/Get (PRG) pattern to prevent duplicate form submissions and ensure a smooth UX.
- Data Validation: Integrated server-side validation to ensure message integrity and protect against malicious input.
- Backend: Node.js, Express.js
- Database: PostgreSQL
- Frontend: EJS (Embedded JavaScript Templates), CSS3
During this project, I mastered the following concepts:
- Relational Database Management: Designing schemas and performing SQL queries to store and retrieve user messages.
- Database Connection Pooling: Managing efficient connections between a Node.js backend and a remote Postgres instance.
- The Request-Response Cycle: Managing GET and POST requests to handle data flow between the client and server.
- Middleware Configuration: Utilizing app-level middleware to parse incoming form data into usable JavaScript objects.
- Dynamic Templating: Using EJS to loop through data arrays and inject dynamic content into HTML.
- Form Security: Implementing input sanitization and escaping to prevent Cross-Site Scripting (XSS) attacks.
- Parameterized Routing: Setting up dynamic routes (e.g., /messages/:id) to display specific data points.
