Khaled Ezzat

Mobile Developer

Software Engineer

Project Manager

Author: Khaled Ezzat

16/07/2025 AI, Developers: The Evolving Software Role

The world of software development is in the midst of a seismic shift, powered by the rapid advancements in Artificial Intelligence. Tools like GitHub Copilot and ChatGPT are no longer futuristic novelties; they are becoming integral parts of the modern developer’s workflow. This integration is sparking a crucial conversation about the future of the profession itself. Is AI merely a sophisticated new tool, an evolution of the autocomplete features we’ve used for years? Or does it represent a fundamental change that will transform developers from hands-on coders into high-level “prompt engineers”? This article will explore how AI is currently augmenting the coding process, the new skills required to leverage it, and ultimately, what the role of a developer will look like in an AI-driven future.

From Autocomplete to Intelligent Co-pilot

The journey of AI in coding began long before today’s headlines. We started with simple syntax highlighting, evolved to intelligent code completion like IntelliSense, and have now arrived at full-fledged AI coding assistants. Tools such as GitHub Copilot, Amazon CodeWhisperer, and Tabnine represent a monumental leap. They don’t just suggest the next variable name; they can generate entire functions, write complex algorithms, and even create comprehensive unit tests based on a simple natural language comment. For instance, a developer can write a comment like “// create a python function that takes a URL, fetches its JSON content, and returns a dictionary”, and the AI will often produce the complete, functional code in seconds. This dramatically accelerates development, reduces time spent on boilerplate, and helps developers learn new languages or frameworks by seeing best-practice examples generated in real-time.

Beyond Code Generation: AI in Debugging and System Design

While generating code snippets is impressive, the true impact of AI extends far deeper into the development lifecycle. Its capabilities are expanding to assist with some of the most challenging aspects of software engineering: debugging and system architecture. When faced with a cryptic error message or a complex stack trace, a developer can now present it to an AI model and receive a plain-English explanation of the potential cause, along with suggested solutions. This transforms debugging from a frustrating process of trial and error into a guided diagnostic session.

On a higher level, AI is becoming a brainstorming partner for system design. A developer can describe a set of requirements—for example, “I need a scalable backend for a social media app with real-time chat”—and the AI can suggest architectural patterns like microservices, recommend appropriate database technologies (SQL vs. NoSQL), and even generate initial configuration files. It acts as a force multiplier, allowing a single developer to explore and validate architectural ideas that would have previously required extensive research or team discussions.

The Art of the Prompt: A New Skill, Not a New Job Title

This brings us to the core of the debate: prompt engineering. As AI becomes more capable, the developer’s primary interaction with it is through crafting effective prompts. This is far more than simply asking a question. A vague prompt like “make a login page” will yield generic, often unusable code. A skilled developer, however, will craft a detailed prompt that specifies the required technologies, security considerations, and design elements:

“Generate a React component for a login form using Formik for state management and Yup for validation. It should include fields for email and password, with client-side validation for a valid email format and a password of at least 8 characters. Implement a ‘Sign In’ button that is disabled until the form is valid. Style the component using Tailwind CSS with a modern, minimalist design.”

This level of detail is crucial. Prompt engineering is not a replacement for coding knowledge; it is an extension of it. To write a good prompt, you must understand what you are asking for. You need to know what “Formik” is, why “Yup” is used for validation, and how “Tailwind CSS” works. Prompting is the new interface, but the underlying technical expertise remains the foundation.

The Irreplaceable Human: Critical Thinking and Strategic Oversight

Even with perfect prompts, AI is a tool, not a replacement for a developer’s mind. It generates code based on patterns it has learned from vast datasets, but it lacks true understanding and context. This is where the human element remains irreplaceable. The most critical skills for the developer of the future will be:

  • Critical Thinking: An AI might generate code that works, but is it efficient? Is it secure? Does it align with the project’s long-term goals? The developer’s job is to review, question, and validate the AI’s output, not blindly accept it.
  • Problem Solving: AI can solve well-defined problems. However, the most important part of software development is often defining the problem in the first place—understanding business needs, user pain points, and translating them into a technical strategy.
  • Accountability and Ethics: If AI-generated code introduces a security vulnerability or perpetuates a bias, the human developer who integrated it is ultimately responsible. This layer of ethical oversight and professional accountability is fundamentally human.
  • Creativity and Innovation: AI is excellent at recombination, but true innovation—the creation of entirely new paradigms—still stems from human creativity and insight.

The role of the developer is evolving from a builder who lays every brick by hand to an architect who directs a team of powerful AI assistants to execute a strategic vision.

In conclusion, the notion that developers will simply become “prompt engineers” is a dramatic oversimplification. While mastering the art of crafting precise, context-aware prompts is becoming an essential new skill, it is an addition to, not a replacement for, core software engineering expertise. AI is automating the repetitive and boilerplate aspects of coding, freeing up developers to focus on higher-value tasks: system architecture, critical thinking, security, and innovative problem-solving. The future of development is not a world without developers; it’s a world of AI-augmented developers who are more productive, strategic, and capable than ever before. The job isn’t disappearing—it’s evolving into something more powerful and impactful, blending human ingenuity with artificial intelligence to build the next generation of technology.

16/07/2025 Free Supabase BaaS: Self-Host with Edge Functions on VPS

Supabase has rapidly emerged as a powerful open-source alternative to Firebase, offering developers a suite of tools built on top of the rock-solid foundation of PostgreSQL. While its managed cloud platform provides an excellent and easy entry point, the true power of open-source lies in the freedom to run it yourself. This article explores the compelling proposition of self-hosting the entire Supabase stack, including the Deno-based Edge Functions, on your own Virtual Private Server (VPS). We will delve into how you can achieve this powerful setup for free, bypassing the limitations of managed free tiers and gaining complete control over your data, infrastructure, and scalability. This is your guide to building a production-ready Backend-as-a-Service without the recurring monthly bill.

Why Self-Host Supabase? The Allure of Full Control

Opting to self-host Supabase is a strategic decision that shifts the balance of power from the platform provider to you, the developer. The most immediate benefit is sovereignty over your data and infrastructure. When you run Supabase on your own VPS, your PostgreSQL database, authentication services, and storage files reside in a server environment you manage. This eliminates vendor lock-in and gives you the freedom to choose your server’s geographic region, a critical factor for data compliance regulations like GDPR. Furthermore, self-hosting allows you to completely bypass the limitations inherent in the official managed free tier. Forget about projects being paused due to inactivity, restrictive database sizes, or limited API request quotas. Your only constraints are the resources of your VPS.

Beyond breaking free from limitations, self-hosting unlocks a deeper level of customization. You gain direct, unfettered access to the underlying PostgreSQL database. This means you can install any trusted Postgres extension you need, perform fine-grained performance tuning, and implement complex backup and replication strategies that go beyond the offerings of the managed platform. While this guide focuses on leveraging free VPS tiers, it’s crucial to understand that this model is also incredibly cost-effective at scale. As your application grows, the predictable cost of a more powerful VPS will often be significantly lower than the equivalent paid tiers on a managed service.

Securing Your Free VPS: The Foundation of Your Stack

Before deploying any application, you must first build a secure foundation. The “free” in “free VPS” is meaningless if your server is vulnerable to attack. Fortunately, several cloud providers offer “Always Free” tiers that are more than capable of running a Supabase instance for development or small-to-medium production workloads. Oracle Cloud’s Free Tier is a popular choice due to its generous offerings, including Ampere A1 ARM-based instances with multiple cores and ample RAM. Alternatives include the free tiers from AWS EC2 and Google Cloud Platform, though their terms can be more restrictive.

Once you’ve provisioned your virtual machine (typically running a Linux distribution like Ubuntu), the next step is server hardening. This is not optional. Follow these essential security practices:

  • Create a Non-Root User: Immediately create a new user account with `sudo` privileges. You will perform all subsequent actions from this account, disabling the root login to reduce the attack surface.
  • Implement a Firewall: A firewall is your first line of defense. Using a simple tool like `ufw` (Uncomplicated Firewall) on Ubuntu, you can set a default policy to deny all incoming traffic and explicitly allow only the necessary ports, such as SSH (port 22), HTTP (port 80), and HTTPS (port 443).
  • Use SSH Key Authentication: Passwords can be cracked. Disable password-based authentication for SSH entirely and rely solely on SSH keys. This method is vastly more secure and ensures that only machines with a corresponding private key can access your server.

Only after these hardening steps is your server truly ready to host your Supabase stack securely.

Deploying Supabase with Docker: A Step-by-Step Overview

The officially supported and most straightforward method for self-hosting Supabase is through Docker. This containerization approach encapsulates each component of the Supabase stack—from the database to the API gateway—into isolated, manageable services. The primary prerequisite is to install Docker and Docker Compose on your hardened VPS.

The deployment process is methodical:

  1. Clone the Official Repository: Begin by cloning the Supabase Docker setup files directly from their GitHub repository. You can do this with the command: `git clone –depth 1 https://github.com/supabase/docker`.
  2. Configure Your Environment: Navigate into the new `docker/` directory. Here you will find a file named `.env.example`. Copy this to a new file named `.env`. This file is the control panel for your entire stack.
  3. Generate Secure Secrets: This is the most critical configuration step. The `.env` file contains placeholders for essential secrets like `POSTGRES_PASSWORD`, `JWT_SECRET`, and the `ANON_KEY` and `SERVICE_ROLE_KEY` for the API. Do not use the default example values. Use a strong password generator to create unique, complex strings for each of these secrets. Compromising these keys would mean compromising your entire application.
  4. Launch the Stack: Once your `.env` file is populated with secure secrets, you can bring your Supabase instance to life with a single command: `docker-compose up -d`. This command tells Docker to pull all the necessary images and start all the services (Kong, GoTrue, PostgREST, Realtime, Storage, etc.) in the background.

After a few minutes, your private, fully functional Supabase backend will be running on your VPS.

Enabling Edge Functions and Securing with a Reverse Proxy

A base Supabase installation is powerful, but modern applications demand serverless logic. The self-hosted stack includes the Deno-based Edge Functions service, allowing you to deploy custom TypeScript code that runs close to your data. This service is part of the `docker-compose.yml` configuration and runs alongside the other components. You can deploy functions to your new instance using the Supabase CLI, but you must first configure it to point to your self-hosted domain instead of the official Supabase cloud.

However, you should never expose the myriad of ports from your Docker containers directly to the internet. This is insecure and impractical. The professional solution is to set up a reverse proxy. A web server like Nginx or Caddy is installed on the host VPS and acts as a single, secure entry point for all web traffic. It then intelligently routes incoming requests to the correct internal Supabase service based on the URL path. For example, a request to `https://your-domain.com/auth/v1/` would be forwarded by the reverse proxy to the internal GoTrue authentication service running on its specific Docker port.

Finally, to make your service production-ready, you must enable SSL/TLS. No modern application should operate over unencrypted HTTP. A reverse proxy makes this simple. Using a free tool like Certbot with Nginx, you can automatically obtain and renew SSL certificates from Let’s Encrypt. This ensures all communication between your users’ clients and your Supabase backend is fully encrypted and secure, completing your professional, self-hosted setup.

In conclusion, self-hosting a Supabase and Edge Functions stack on a free VPS is not only possible but also a strategically sound decision for developers seeking ultimate control and cost-efficiency. We’ve walked through the entire process, starting with the compelling reasons to self-host, such as data sovereignty and the removal of platform limitations. We then established a secure foundation by hardening a free-tier VPS, a non-negotiable first step. From there, we detailed the Docker-based deployment, emphasizing the critical importance of securing your configuration secrets. Finally, we elevated the setup to a production-grade service by integrating a reverse proxy for secure traffic management and enabling SSL/TLS encryption. While this path requires more initial setup than a one-click managed solution, the reward is immense: a powerful, scalable, and entirely free backend infrastructure that you truly own.

16/07/2025 AI & Developer Evolution: Architect, Critic, Prompt Engineer

The landscape of software development is undergoing a seismic shift, powered by the rapid advancements in Artificial Intelligence. Tools like GitHub Copilot and ChatGPT are no longer novelties; they are becoming integrated into the daily workflows of developers worldwide. This integration sparks a compelling and often debated question: is AI merely the next step in developer productivity tools, or does it signal a fundamental transformation of the developer’s role itself? As AI models become more adept at writing, debugging, and even designing code, we must explore whether the core skill of a developer will transition from writing explicit code to crafting precise instructions for an AI. This article delves into how AI is reshaping coding and considers the emerging reality: will developers evolve into prompt engineers?

The AI Co-Pilot: Augmenting Developer Productivity

Before we can talk about a full-blown role change, it’s crucial to understand AI’s current position in the software development world: that of a powerful co-pilot. Tools based on Large Language Models (LLMs) have proven exceptionally effective at handling the repetitive and time-consuming tasks that often bog down development cycles. This includes:

  • Boilerplate Code Generation: Setting up project structures, writing standard functions, or creating data models can be done in seconds with a simple prompt, freeing up developers to focus on more complex, unique business logic.
  • Accelerated Debugging: Instead of spending hours searching for a cryptic bug, a developer can present the problematic code snippet to an AI, ask for an explanation, and receive potential fixes. The AI acts as an ever-present, knowledgeable partner for troubleshooting.
  • Learning and Exploration: When encountering a new framework or library, developers can use AI as an interactive tutor, asking it to explain concepts or generate example implementations. This dramatically shortens the learning curve.

In this capacity, AI is not replacing the developer’s critical thinking. Instead, it’s augmenting it. The developer is still the architect, the decision-maker, and the one responsible for the final product. The AI is a tool, albeit an incredibly sophisticated one, that handles the “how” once the developer has figured out the “what” and the “why”. It removes friction, allowing for a more fluid and creative coding process.

The Rise of Prompt Engineering: A New Layer of Abstraction

As developers become more reliant on AI co-pilots, a new skill is naturally coming to the forefront: prompt engineering. This is the art and science of communicating effectively with an AI to achieve a desired output. Simply asking an AI to “write a user authentication system” will yield generic, likely insecure, and incomplete code. Effective prompt engineering is far more nuanced and demonstrates a deep understanding of the underlying technical requirements.

An expert developer-turned-prompt-engineer would provide detailed context, such as:

  • The Technology Stack: “Using Node.js with Express and a PostgreSQL database…”
  • Specific Libraries and Methods: “…implement password hashing with bcrypt and session management using JWTs (JSON Web Tokens)…”
  • Constraints and Requirements: “…ensure the function handles invalid input gracefully and returns specific HTTP error codes for different failure scenarios.”

This isn’t just asking a question; it’s designing a micro-task through natural language. In a way, this is the next logical step in the history of programming abstraction. We moved from machine code to assembly, then to high-level languages like C++ and Python. Each step allowed us to communicate our intent to the machine more abstractly. Prompt engineering is the newest layer, allowing developers to orchestrate complex code generation using structured natural language. It’s a skill that requires just as much precision as writing the code itself.

Beyond Code: AI’s Integration into the Full Software Development Lifecycle

The impact of AI extends far beyond the act of writing code. It is beginning to weave itself into the entire Software Development Lifecycle (SDLC), changing how we approach everything from planning to deployment. A developer’s job has always been more than just coding, and AI is becoming a partner in these other critical areas as well.

Consider AI’s role in:

  • Automated Testing: AI can analyze a function and automatically generate a suite of unit tests to cover various edge cases, significantly improving code coverage and reliability with minimal manual effort.
  • Intelligent Code Reviews: AI tools can act as a preliminary reviewer, flagging potential bugs, security vulnerabilities, or deviations from team-specific style guides before a human reviewer even sees the code.
  • Documentation Generation: Maintaining up-to-date documentation is a common pain point. AI can parse code and comments to automatically generate and update technical documentation, ensuring it never falls out of sync.
  • Project Planning: AI can assist project managers and senior developers in breaking down large, complex features into smaller, manageable user stories and even provide rough time estimates based on historical data.

This holistic integration means the developer’s role is shifting from a pure implementer to more of a systems orchestrator. Their time is spent less on the granular details of implementation and more on high-level design, quality assurance, and strategic decision-making, using AI as a force multiplier across all stages of a project.

The Future Developer: A Hybrid of Architect, Critic, and Communicator

So, will developers become just prompt engineers? The answer is a definitive no. They will, however, undoubtedly need to become excellent prompt engineers as part of a new, hybrid skillset. The idea that one can simply type commands without a deep understanding of software engineering is a fallacy. AI-generated code is not infallible; it can contain subtle bugs, security flaws, or be inefficient. It lacks true business context and an understanding of a system’s long-term architectural goals.

The developer of the future, therefore, is a hybrid professional who excels in three key areas:

  1. The Architect: They hold the high-level vision for the software, designing scalable, maintainable, and robust systems. They decide what needs to be built and why.
  2. The Critic: They possess the deep technical knowledge to critically evaluate, debug, and refine AI-generated code, ensuring it meets quality and security standards. They are the ultimate quality gate.
  3. The Communicator (Prompt Engineer): They are masters of instructing the AI, translating complex architectural requirements into precise, context-rich prompts that yield useful, high-quality code.

The core, irreplaceable skills will be critical thinking, problem-solving, and systems design. Writing code line-by-line may become less frequent, but understanding code intimately will be more important than ever.

In conclusion, AI is not leading to the obsolescence of the developer but to their evolution. We are moving from a world where a developer’s primary value was in writing code to one where their value lies in directing, validating, and integrating it. The journey began with AI as a co-pilot, augmenting productivity and handling rote tasks. This necessitated the rise of prompt engineering, a new abstraction layer for communicating technical intent. Now, we see AI permeating the entire development lifecycle. The developer of tomorrow will not be a simple prompt engineer; they will be a technical leader who wields AI as a powerful tool. They will absorb prompt engineering as a core competency, but their foundational skills in architecture, critical analysis, and problem-solving will be what truly defines their expertise and indispensability.

16/07/2025 How to Self-Host n8n for Workflow Automation

If you’re diving into self-hosted automation, n8n is a solid choice. Here’s how I set it up on my home lab server using Docker Compose.

## Prerequisites
– A server with Docker and Docker Compose
– A domain name (optional but recommended)

## Step 1: Create the Docker Compose File
“`yaml
version: ‘3.7’
services:
n8n:
image: n8nio/n8n
restart: always
ports:
– ‘5678:5678’
environment:
– N8N_BASIC_AUTH_USER=admin
– N8N_BASIC_AUTH_PASSWORD=supersecretpassword
– N8N_HOST=n8n.example.com
– WEBHOOK_TUNNEL_URL=https://n8n.example.com
volumes:
– ./n8n_data:/home/node/.n8n
“`

## Step 2: Secure Your Instance with HTTPS
Use Traefik or Nginx as a reverse proxy. Here’s a simple Nginx config snippet:
“`nginx
server {
listen 443 ssl;
server_name n8n.example.com;

location / {
proxy_pass http://localhost:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
“`

## Step 3: Run Your Container
“`bash
docker-compose up -d
“`

## Tips
– Use environment variables or `.env` file for secrets
– Set up backups for `./n8n_data`
– Use Cloudflare for DNS + SSL

## Final Thoughts
n8n has made it easy to automate tasks across services. Hosting it yourself gives you full control and privacy. Just keep it secure and updated!

> 🧠 Ready to start your self-hosted setup?
>
> I personally use [this server provider](https://www.kqzyfj.com/click-101302612-15022370) to host my stack — fast, affordable, and reliable for self-hosting projects.
> 👉 If you’d like to support this blog, feel free to sign up through [this affiliate link](https://www.kqzyfj.com/click-101302612-15022370) — it helps me keep the lights on!