Direct and group chats that update live, with typing indicators, read receipts, online presence and reactions, all without a page refresh. A Laravel API and WebSocket server sit behind a React 19 and TypeScript app.
Laravel Reverb delivers messages, typing and presence live; Redis holds that short-lived state so it never touches the main database.
Group roles with promote, demote and admin-only actions. Members who leave keep read access to the history up to that point.
PostgreSQL full-text search across message history, and private, short-lived signed URLs for attachments.
Sanctum cookie sessions, Google sign-in and a complete password-reset flow by email.
Light and dark themes, keyboard navigation and screen-reader live regions.
128 backend tests with Pest, CI, and zero-downtime automated deploys to Docker Compose on Oracle Cloud.
Designo
A CMS-driven agency website
A seven-page agency site where every page, menu and label is edited in Strapi instead of being hard-coded. Editors build each page from reusable sections.
Next.js 15
React 19
TypeScript
SCSS + Bulma
Framer Motion
Strapi 4
SQLite
Docker
Caddy
GitHub Actions
The visual design comes from a Frontend Mentor challenge. The build, CMS setup and deployment are my own.
Ten section types, rendered by a single catch-all Next.js route.
Pages are static and refresh every two minutes. If the API is down, the last good version stays online.
The contact API validates, length-limits and HTML-escapes input, and accepts 5 requests per 15 minutes per IP.
Strapi 4 is hardened: a middleware blocks filter queries on admin fields, and unused auth endpoints are closed on every start.
A push to master deploys through GitHub Actions and waits for a healthy container. SQLite is backed up daily.
Contact formposts to the API,5 per 15 minper IP
ClientVisitorBrowserGets prerendered HTML. The locations map loads in the browser from OpenStreetMap.
page request, static HTML back
Vercelrefreshes every 2 minNext.js 15 and React 19One catch-all route renders any page from its list of CMS sections.
REST, at build time and on refresh
Oracle Cloud VMDockerStrapi 4 REST APIBehind a Caddy proxy with automatic HTTPS. SQLite and uploads live on Docker volumes.
Contact form posts to the API, 5 per 15 min per IP
Where I’ve worked
04/2025 – now
Freelance and own projects
Fullstack web development
Built RTM, a real-time chat app with a Laravel REST API and a React and TypeScript frontend.
Authentication and authorisation with Laravel Sanctum, plus OAuth2 social login with Laravel Socialite.
Real-time features with Laravel Reverb and Echo, including live typing indicators and Redis-backed presence.
06/2023 – 03/2025
Aleks & Shantu GmbH
Fullstack web developer, Berlin
Built and optimised web apps with React, Next.js, TypeScript, Node.js and the WordPress REST API.
Interactive animations and dynamic UI with Framer Motion; responsive builds from prototypes and style guides.
Accessible frontends following WCAG, external API integrations and ongoing maintenance in an agile team.
09/2021 – 05/2022
Radscheit GmbH (happycoding)
Fullstack web developer, Berlin
Websites with React (Gatsby) on headless WordPress.
WordPress theming and maintenance in PHP, SCSS and JavaScript, plus custom PHP API endpoints.
Performance optimisation, code reviews, and feature planning with the design and marketing teams.
05/2021 – 07/2021
Jobvector GmbH
Web development intern, Düsseldorf
Frontend features and UI changes in Vue.js and Nuxt, including a dashboard that shows incidents.
Testing, bug fixing and release preparation in a test-driven CI/CD setup.
“Majd was always helpful, easy to work with, and at the same time someone a less experienced developer could learn a lot from. […] I remember our time together very fondly and can recommend Majd without reservation, both professionally and personally.”