Skip to main content
Ammar Bin Shakir - Fullstack Engineer

Ammar Bin Shakir

Hi :)

šŸ‘‹ Hey there! I'm Ammar Bin Shakir, a fullstack engineer experienced in React, Node.js, Next.js, React Native, and AWS services. I specialize in building dynamic web and mobile applications with a strong emphasis on utilizing AWS to enhance scalability, security, and overall performance. If you need help or have any questions regarding fullstack development, AWS integrations, or any of these technologies, feel free to reach out. I'm here to assist you in bringing your ideas to life!

TECHNICAL EXPERTISE

Skills & Technologies

A comprehensive overview of my technical expertise spanning frontend, backend, cloud technologies, and development tools that power modern applications.

76 Skills
9 Categories

Languages

4 skills
JavaScript
TypeScript
Python
Java

Frontend

12 skills
React
Next.js
Vue.js
Nuxt.js
React Native
HTML5
CSS3
Tailwind CSS
Bootstrap
Material-UI
Ant Design
Gatsby

Backend

8 skills
Node.js
Express.js
Nest.js
FastAPI
GraphQL
Socket.IO
Firebase
REST API

Databases

10 skills
MongoDB
PostgreSQL
MySQL
Redis
Elasticsearch
Supabase
Prisma
TypeORM
Sequelize
Cassandra

Devops

11 skills
Docker
Kubernetes
Git
GitHub
GitLab
Jenkins
GitHub Actions
Nginx
Apache
Linux
Ubuntu

Cloud

11 skills
AWS
EC2
S3
Lambda
API Gateway
CloudFront
Route 53
Cognito
Google Cloud
Azure
Digital Ocean

Ai

4 skills
Python
NumPy
OpenAI
LangChain

Tools

8 skills
VS Code
Postman
Figma
Slack
Notion
Jira
Trello
Discord

Others

8 skills
Stripe
PayPal
Netlify
Vercel
Heroku
Hostinger
Namecheap
Cloudflare
JOURNEY

Career Board

My professional journey organized by growth phases

Early Career

2 positions
2
5

Seven Technologies

Web Development Intern

Feb 2020 - Apr 2020
Professional

Gained hands-on experience in web development fundamentals. Contributed to various client projects and learned industry best practices.

HTMLCSSJavaScript+3
Completed
4

Cipher Savvy

MERN Stack Developer

Sep 2020 - Mar 2021
Professional

Developed and maintained web applications using MERN stack. Focused on creating user-friendly interfaces and robust backend systems.

ReactNode.jsMongoDB+3
Completed

Add new position

Growth Phase

2 positions
2
3

SAS Technology

MERN Stack Developer

Apr 2021 - Apr 2022
Professional

Built responsive web applications and RESTful APIs. Collaborated with cross-functional teams to deliver client solutions.

MongoDBExpress.jsReact+3
Completed
2

Geekinate

Senior Web Engineer

May 2022 - Dec 2022
Professional

Developed high-performance web applications and implemented CI/CD pipelines. Improved application performance by 40%.

Next.jsReactNode.js+3
Completed

Add new position

Expertise

1 position
1
1

Pixelpk Technologies

Senior Software Engineer

Jan 2023 - Present
Professional

Leading full-stack development projects using modern technologies. Architected scalable solutions and mentored junior developers.

ReactNode.jsTypeScript+3
Completed

Add new position

Drag & Drop Enabled
Career Timeline Board
CREDENTIALS

Certifications & Achievements

A collection of my professional certifications and verified skills across various technologies and platforms

AWS Educate Introduction to Cloud 101

AWS

Issued: June 2025

SKILLS VERIFIED

Cloud ComputingAWS FundamentalsCloud ArchitectureInfrastructure
Verified
Verify

ID: 2bb4a608-5218-4087-b27c-fe3ab34f75f9

LangChain for LLM Application Development

deeplearning.ai

Issued: June 2025

SKILLS VERIFIED

LangChainLLM DevelopmentAI ApplicationsPythonNatural Language Processing
Verified
Verify

ID: 287b5763-e6ff-4920-99a8-d9cad593328a

ChatGPT Prompt Engineering for Developers

deeplearning.ai

Issued: June 2025

SKILLS VERIFIED

Prompt EngineeringChatGPTAI IntegrationDeveloper ToolsConversational AI
Verified
Verify

ID: be46561c-d7c2-4b2b-860a-7b18b44b892d

Reasoning with OpenAI o1 Model

deeplearning.ai

Issued: June 2025

SKILLS VERIFIED

OpenAI o1Advanced ReasoningAI Problem SolvingModel OptimizationMachine Learning
Verified
Verify

ID: f11185c2-0ac8-40e7-a3ba-44b3d56171fc

SHOWCASE

Projects

Explore my development work and technical projects

ALL PROJECTS

P-001

Diazo - Food Delivery Service

A web application for a fast-food chain, offering menu selection, order tracking, and Google Maps integration, using Firebase for efficient service.

DEPLOYED
P-002

Mindshift - Psychology Health Center

A healthcare app with features for psychotherapy, habit tracking, and mood monitoring, developed using AWS, React, and MongoDB for mental wellness.

DEPLOYED
P-003

Peplog - HR Platform

An HR platform focused on diversity and accessibility, built with Next JS, Tailwind CSS, AWS Lambda, and DynamoDB to streamline HR processes.

DEPLOYED
P-004

Zaidoc - AI-Based Healthcare Product

A scalable solution for live AI avatars, featuring multi-cloud architecture and performance monitoring through AWS CloudWatch for healthcare.

DEPLOYED
P-005

Yacht Crew Management Admin Portal

An admin portal to manage yacht crew operations, with WhatsApp integration to enable seamless interaction between crew and portal users.

DEPLOYED
P-006

DADSS - Demand A Driver Share Service

An app offering on-demand drivers to transport vehicles across Sydney, allowing users to arrange repairs or relocations without interruptions.

DEPLOYED
P-007

Muraadso - E-commerce Platform

An e-commerce platform providing a variety of products and services online, designed to facilitate easy shopping experiences for users.

DEPLOYED
P-008

Eezup - Social Media Application

A social media app with audio and video calls, live streaming, and real-time chat, developed with React, Socket.io, and MongoDB for engagement.

DEPLOYED

Diazo - Food Delivery Service

PROJECT P-001
DEPLOYED

A web application for a fast-food chain, offering menu selection, order tracking, and Google Maps integration, using Firebase for efficient service.

Technologies Used

ReactFirebaseFirebase AuthFiebase databaseFirebase Cloud FunctionsGoogle Maps APIMaterial-UIStripeNode JS
WRITTEN CONTENT

My Curated Blog Posts

Insights, tutorials, and thoughts on development, design, and technology trends from my Medium publications.

Medium
Aug 7, 2025
Kubernetes for Full-Stack Developers: A Gentle Introduction
What I learned transitioning from Docker Compose to Kubernetes, one manifest at aĀ time. As a full-stack developer who’s spent most of his time building with React, Node.js, PostgreSQL, and Redis, Kubernetes always felt like something that belonged in the world of DevOps engineers orĀ SREs. I used Docker Compose to spin up local dev environments, wrote decent CI pipelines, and deployed apps to Heroku or Vercel. That workedā€Šā€”ā€Šuntil itĀ didn’t. When I started working on a URL shortener project that needed scalable infrastructure and fine-grained container control, I decided it was time to get serious about Kubernetes. This post reflects my beginner journeyā€Šā€”ā€Šno buzzwords, no jargonā€Šā€”ā€Šjust the practical lessons I learned while containerizing and deploying a full-stack app using Kubernetes. 🧩 What is Kubernetes, really? In simple terms, Kubernetes (K8s) is a system that helps you run and manage containers (like your Docker apps) at scale. It handles things like auto-restarting crashed apps, distributing traffic, storing persistent data, and moreā€Šā€”ā€Šacross clusters of machines. Think of it as Docker Compose on steroidsā€Šā€”ā€Šbut with a learningĀ curve. šŸ™‹ā€ā™‚ļø New to Kubernetes? Don’t worry if the YAML looks scary. It did for me too. Stick with itā€Šā€”ā€Šthe core ideas willĀ click. 🧠 Why I Decided to Learn Kubernetes I was building a URL shortener app with the following stack: Node.js API (Express)ā€Šā€”ā€Šhandles shortening and redirection PostgreSQLā€Šā€”ā€Šstores theĀ URLs Redisā€Šā€”ā€Šcaches popular URLs for performance šŸ“¦ Want to follow along? The complete source code and Kubernetes manifests are available onĀ GitHub Docker Compose worked fine locally, but I knew it wouldn’t scale or survive container crashes in production. IĀ wanted: Resilience (auto-restart, auto-healing) Environment parity (dev, staging,Ā prod) Persistent storage Secure environment variable management Built-in service discovery Kubernetes offered all of this and moreā€Šā€”ā€Šbut the learning curve wasĀ steep. 🧱 Writing My First Deployment YAML I started with a simple goal: run my Node.js API in Kubernetes. Here’s a minimal Deployment and Service manifest: apiVersion: apps/v1 kind: Deployment metadata: name: url-shortener-api spec: replicas: 2 selector: matchLabels: app: url-shortener template: metadata: labels: app: url-shortener spec: containers: - name: api image: ammarbinshakir/url-shortener:latest ports: - containerPort: 3000 --- apiVersion: v1 kind: Service metadata: name: url-shortener-service spec: selector: app: url-shortener ports: - port: 80 targetPort: 3000 type: ClusterIP Why 2 replicas? So I could test load balancing and see how Kubernetes handled pod scaling and restarts. Takeaway: Kubernetes is declarative. You define the desired state, and it ensures the cluster converges towardĀ that. šŸ’¾ Persisting PostgreSQL withĀ Volumes Next, I added PostgreSQLā€Šā€”ā€Šbut hit my first realĀ problem: Every time the Postgres pod restarted, the data vanished. Unlike Docker Compose, Kubernetes doesn’t automatically persist container data. I had to define a PersistentVolumeClaim (PVC): apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi And then mount it inside the deployment: volumeMounts: - mountPath: /var/lib/postgresql/data name: postgres-storage volumes: - name: postgres-storage persistentVolumeClaim: claimName: postgres-pvc šŸ” ReadWriteOnce means the volume can be mounted as read-write by a singleĀ node. I also needed a Service to expose Postgres internally: apiVersion: v1 kind: Service metadata: name: postgres-service spec: selector: app: postgres ports: - port: 5432 targetPort: 5432 type: ClusterIP Lesson learned: Stateful apps need persistent volumes, or your data isĀ toast. šŸ” Understanding StatefulSets Initially, I ran both PostgreSQL and Redis using Deployments. It workedā€Šā€”ā€Šuntil I realized that pods were being replaced with new names/IPs during scaling or restarts, which broke the connection logic. This is where StatefulSets comeĀ in. StatefulSets assign stable DNS and identities to pods (redis-0, redis-1, etc.). This is crucial for services like Redis or Postgres that expect consistency in hostnames orĀ storage. After switching Redis to aStatefulSet, my caching layer stopped randomly failing on restarts. šŸ” Managing Secrets andĀ Configs Coming fromĀ .env files, I wondered: How does Kubernetes handleĀ secrets? Kubernetes has: ConfigMapsā€Šā€”ā€Šfor non-sensitive config like feature flags or API endpoints. Secretsā€Šā€”ā€Šfor sensitive data like DB passwords andĀ tokens. Example: apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: POSTGRES_PASSWORD: c3VwZXJzZWNyZXQ= # base64 encoded Injecting the secret into the container: env: - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: db-secret key: POSTGRES_PASSWORD You can also mount secrets as files ifĀ needed. ā± Boot Order and Service Dependencies A common frustration: my API would start before Postgres wasĀ ready. There’s no depends_on in Kubernetes, like in Docker Compose. I solved thisĀ using: readinessProbes to mark the Postgres pod as ā€œreadyā€ only when it accepts connections. initContainers In the API pod to wait for Postgres before starting the mainĀ app. Example readinessProbe for Postgres: readinessProbe: exec: command: - pg_isready initialDelaySeconds: 5 periodSeconds: 10 This approach ensured that my services came online in the right orderā€Šā€”ā€Šand stayed thatĀ way. 🧪 Local Testing withĀ Minikube To test everything locally, IĀ used: Minikubeā€Šā€”ā€Šthe easiest way to spin up a local K8sĀ cluster kubectlā€Šā€”ā€Šessential CLI tool for interacting with theĀ cluster Once you get the hang of kubectl apply -fKubernetes starts to feel manageable. šŸ“š LessonsĀ Learned Here are a few takeaways from my first real Kubernetes experience: āœ… YAML fatigue is real, but you can reduce repetition using Helm or Kustomize āœ… StatefulSets are a must for databases and caching services āœ… Debugging is differentā€Šā€”ā€Šrely on kubectl logs, describe, and exec āœ… Start smallā€Šā€”ā€Šdon’t jump straight to Ingress, autoscaling, or Helm āœ… Kubernetes doesn’t replace Dockerā€Šā€”ā€Šit orchestrates it āœ… Embrace the declarative mindsetā€Šā€”ā€Šit's a shift, but worthĀ it šŸ”— Resources That HelpedĀ Me šŸ“˜ Kubernetes OfficialĀ Docs 🧪 Play with Kubernetes šŸ“š Kelsey Hightower’s Kubernetes the HardĀ Way šŸŽØ Learnk8s VisualĀ Guides 🧠 FinalĀ Thoughts Learning Kubernetes as a full-stack developer may seem intimidatingā€Šā€”ā€Šbut it’s one of the most powerful tools you can add to your engineering toolkit. You don’t need to master everything on day one. Start with the basics: Deployments, Services, Volumes, Secrets. Build something real. Break it. Fix it. Learn byĀ doing. Most developers stop at Docker Compose. If you go even one step beyond thatā€Šā€”ā€Šyou’re ahead of theĀ curve. šŸš€ Up Next: In the next post, I’ll walk through how I deployed this app with Ingress, TLS, and autoscaling on a cloudĀ cluster. šŸ“¬ Follow me here on Medium, or connect with me on LinkedIn | Portfolio
5 min read
Medium
Dec 21, 2024
Implementing Server-Sent Events (SSE) in Node.js with Next.js: A Complete Guide
Server-Sent Events (SSE) offer a simple way to stream real-time updates from the server to the client, ideal for use cases like live notifications or dashboards. This guide walks you through implementing SSE with a Node.js backend and a Next.js client, enabling a modern, efficient solution for real-time data streaming. 1. Setting Up the SSE Server inĀ Node.js Create a simple Node.js SSE server (same asĀ before): const express = require('express'); const app = express(); const PORT = 3000; app.get('/events', (req, res) => { // Set SSE headers res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); // Initial message res.write('data: Welcome to Server-Sent Events!\n\n'); // Send messages every 5 seconds const intervalId = setInterval(() => { const message = { time: new Date().toISOString() }; res.write(`data: ${JSON.stringify(message)}\n\n`); }, 5000); // Clean up on disconnect req.on('close', () => { clearInterval(intervalId); res.end(); }); }); app.listen(PORT, () => { console.log(`SSE server running on http://localhost:${PORT}`); }); 2. Setting Up the Next.jsĀ Client Step 1: Initialize a Next.jsĀ Project Create a new Next.jsĀ project: npx create-next-app@latest sse-nextjs cd sse-nextjs Start the development server: npm run dev Step 2: Create a Page for SSE inĀ Next.js Create a new file in the pages directory, e.g., pages/sse.js. Add the following code to consume the SSEĀ stream: import { useState, useEffect } from 'react'; export default function SSEPage() { const [messages, setMessages] = useState([]); useEffect(() => { // Create an EventSource to listen to SSE events const eventSource = new EventSource('http://localhost:3000/events'); // Handle incoming messages eventSource.onmessage = (event) => { const data = JSON.parse(event.data); setMessages((prevMessages) => [...prevMessages, data]); }; // Handle errors eventSource.onerror = () => { console.error('Error connecting to SSE server.'); eventSource.close(); }; // Cleanup on unmount return () => { eventSource.close(); }; }, []); return (

Server-Sent Events (SSE) with Next.js

{messages.map((message, index) => (

Message received at: {message.time}

))}
); } Step 3: Add Navigation (Optional) Update the pages/index.js file to include a link to the SSEĀ page: import Link from 'next/link'; export default function Home() { return (

Welcome to Next.js SSE Example

Go to SSE Page
); } 3. Running the Application Start the Node.js SSEĀ server: node server.js Run the Next.js development server: npm run dev Open your browser and visit http://localhost:3000/sse to see the live SSEĀ updates. How ThisĀ Works EventSource in React: The EventSource API listens to the SSE stream provided by the Node.jsĀ server. State Management: Incoming messages are appended to the messages state array using React's useState and useEffect. Real-Time UI Updates: React automatically re-renders the UI whenever the messages stateĀ changes. Conclusion Server-Sent Events (SSE) offers a lightweight, easy-to-implement solution for real-time data streaming from the server to the client. While it’s not as versatile as WebSockets, SSE is perfect for scenarios where only server-to-client communication isĀ needed. With its simplicity and browser-native support, SSE can be a great addition to your toolkit for building dynamic and engaging web applications. If you enjoyed this tutorial, let me know in the comments or share your experience with SSE! Happy coding!Ā šŸš€
8 min read
Medium
Jul 20, 2024
WhatsApp API Integration with Node.js
WhatsApp is one of the most widely used messaging platforms globally, and integrating it with your applications can enhance communication with your users. Meta (formerly Facebook) offers a Cloud API for WhatsApp that allows developers to send and receive messages programmatically. In this blog, we’ll walk through the steps to integrate the Meta Cloud WhatsApp API with a Node.js application. Step 1: Set Up a Node.jsĀ Project First, create a new Node.js project and install the necessary dependencies. mkdir whatsapp-nodejs cd whatsapp-nodejs npm init -y npm install express axios body-parser Step 2: Create a Basic ExpressĀ Server Create a file named server.js and set up a basic ExpressĀ server. const express = require('express'); const axios = require('axios'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.json()); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); Step 3: Configure Environment Variables Create aĀ .env file to store your API credentials. WHATSAPP_API_URL=https://graph.facebook.com/v13.0/YOUR_PHONE_NUMBER_ID/messages ACCESS_TOKEN=YOUR_ACCESS_TOKEN Load these variables in your server.js file using the dotenvĀ package. npm install dotenv Update server.js to includeĀ dotenv. require('dotenv').config(); const WHATSAPP_API_URL = process.env.WHATSAPP_API_URL; const ACCESS_TOKEN = process.env.ACCESS_TOKEN; Step 4: Implement SendingĀ Messages Add an endpoint to send WhatsApp messages. app.post('/send-message', async (req, res) => { const { phoneNumber, message } = req.body; try { const response = await axios.post( WHATSAPP_API_URL, { messaging_product: 'whatsapp', to: phoneNumber, text: { body: message } }, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${ACCESS_TOKEN}` } } ); res.status(200).json({ success: true, data: response.data }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); Step 5: Implement Receiving Messages To receive messages, you need to set up a webhook. First, create an endpoint to handle incoming messages. app.post('/webhook', (req, res) => { const data = req.body; console.log('Webhook received:', data); // Handle the incoming message here res.sendStatus(200); }); Configure your webhook URL in the Meta Developer Portal. If you’re developing locally, use ngrok to expose your localhost. ngrok http 3000 Use the ngrok URL in the Meta Developer Portal for the webhook configuration. Step 6: Verify theĀ Webhook Meta requires webhook verification. Add an endpoint for verification. app.get('/webhook', (req, res) => { const VERIFY_TOKEN = 'your-verify-token'; const mode = req.query['hub.mode']; const token = req.query['hub.verify_token']; const challenge = req.query['hub.challenge']; if (mode && token === VERIFY_TOKEN) { res.status(200).send(challenge); } else { res.sendStatus(403); } }); Step 7: Test Your Integration Start your server and test sending and receiving messages. node server.js Use Postman or a similar tool to send a POST request to http://localhost:3000/send-message with the following JSONĀ body: { "phoneNumber": "whatsapp:+1234567890", "message": "Hello from Node.js!" } Conclusion Integrating the Meta Cloud WhatsApp API with Node.js allows you to leverage the power of WhatsApp for your applications. Following these steps, you can set up a basic integration to send and receive messages. Explore the API documentation further to unlock more features and capabilities for your applications. #NodeJS #WhatsAppAPI #MetaAPI #WebDevelopment #JavaScript #MessagingApp #CloudAPI #ExpressJS #FullStackDevelopment #APIntegration #Coding #SoftwareDevelopment #TechBlog https://developers.facebook.com/docs/whatsapp/cloud-api/
14 min read

Let's Connect

Ready to turn ideas into reality? I'd love to hear about your next project.

Email

Drop me a line

ammarbinshakir557@gmail.com

Social

Follow my journey

Thank you for taking the time to explore my portfolio!

Built withusing Next.js & Tailwind CSS