Taher Ahmed

Full-Stack Developer

I like to build things in my free time

Currently building Docutize

Tech stack item
Tech stack item
Tech stack item
Tech stack item
Tech stack item
Tech stack item
Tech stack item
Tech stack item
main image

WeInstaReply - automatic AI responses to your Microsoft Teams messages

This project combines the GPT-4 LLM with the Graph API to automate replies to your Microsoft Teams messages.

The application is registered as multi-tenant, allowing any user to connect their Microsoft work or school account. It's restricted to these accounts, due to the permissions required by the Graph API when interacting with Teams. The Microsoft Identity Library is utilised for token acquisition and L2 distributed token caching is used to store access and refresh tokens in SQL Server cache. This way, these tokens are never exposed to the client as the Firebase access token is used to authenticate the client application and API.

The bulk of the functionality is handled by a scheduled job. It carries out a few steps:

  • Pulls messages from a queue for processing
  • Decrypts the resource data
  • Calls the LLM to determine if the message can be responded to
  • If applicable, the LLM generates a response using the data uploaded by the user
  • Calls the Graph API to send the response on Microsoft Teams
  • Real-time updates are sent to the client using SignalR

You can checkout the launch on Product Hunt

  • Next.js
  • .NET 6
  • SQL Server
  • EF Core
  • SignalR
  • Stripe
  • Firebase Auth
  • LLM
  • AI
  • Prettier
  • ESLint
  • GA
  • GSC

Muchtodo AI - an alternative to Todoist

This project aimed to create an app similar to Todoist, but with the added feature of speech-to-text for creating projects, tasks, and notes. The speech-to-text supports 57 different languages. (For the demo, I decided to spare everyone's ears from hearing me attempt another language).

At its core, it uses the GPT-4 LLM to convert the user's audio to text, which is then further processed by the LLM to determine the type of JSON object (project, task, or note) to return. Within the API, I have defined the properties each JSON object should include. For example, for a new task, the properties include title, description, due date, priority, and project. The LLM extracts the relevant information from the transcribed text to populate these properties. Feels obvious to state, but this entire process is handled aysnc of course. The JSON object is then returned to the client to enable users to make any adjustments, if needed.

As referenced in the demo, one of the methods to implement a task board that supports re-ordering, includes Jira's implementation of LexoRank. For this project, we utilised a Linked List to develop the boards because of its simplicity, the lack of need for rebalancing and no requirements to scale the project.

This application's hosting architecture mirrors WeInstaReply

You can checkout the launch on Product Hunt

At this moment, I have taken down the site due to limited time available to maintain it (customer requests, support, etc.).

  • Next.js
  • Redux
  • .NET 6
  • SQL Server
  • EF Core
  • Stripe
  • Firebase Auth
  • LLM
  • AI
  • Prettier
  • ESLint
  • GA
  • GSC

MailAmplify - a tool for email marketing

MailAmplify provides tools to capture subscribers by allowing users to create and embed customisable signup forms on their websites. It enables sending custom email marketing campaigns through an intuitive drag-and-drop email builder.

Newsletter: A tool to build and customise emails, which includes a drag-and-drop builder provided by Unlayer.

Modal Designer: Here users can customise their own sign up form to embed into their own website.

Subscribers: Maintains the list of subscribers who will receive an email.

This application's hosting architecture mirrors WeInstaReply

*At the time of recording, the Postmark subscription was cancelled, so a previous email was shown. *

At this moment, I have taken down the site due to limited time available to maintain it (customer requests, support, etc.).

  • Next.js
  • .NET 6
  • SQL Server
  • EF Core
  • Firebase Auth
  • Postmark
  • Stripe
  • Prettier
  • ESLint
  • GA
  • GSC

International Space Station tracker

A live tracker of the International Space Station that is powered by Where The ISS At. This live tracker uses the API to fetch the station's TLEs, which help interpolate its position and velocity. Therefore, I don't need to continuously poll the API to determine the current location. I mean how terrible would that be?

The 3D-rendering is handled by CesiumJS which is an open-source JavaScript library designed for creating 3D globes and 2D maps on the web.

The 'Go to current location' button renders a pin and moves the camera to the user's current location. This would be used to track where the ISS is in relation to your location.

  • React
  • CesiumJS

Sanity - Headless CMS

Within the MailAmplify site, I included a blog which is built using the Sanity CMS.
  • Next.js
  • Sanity

Umbraco CMS

A simple blog written using .NET and the Umbraco CMS.

  • .NET Framework
  • Umbraco

Game Of Life

An implementation of Conway's Game of Life. This is a cellular automaton devised by the British mathematician John Horton Conway in 1970. It is a zero-player game, meaning that its evolution is determined by its initial state, requiring no further input. One interacts with the Game of Life by creating an initial configuration and observing how it evolves.
  • C#
  • C# Winforms

Visualise Bubble Sort

A visualisation of how the Bubble Sort algorithm works. Bubble sort, is a simple sorting algorithm that repeatedly steps through the input list element by element, comparing the current element with the one after it, swapping their values if needed. These passes through the list are repeated until no swaps have to be performed during a pass, meaning that the list has become fully sorted.
  • C#
  • C# Winforms

Min Max Tic Tac Toe

Minimax is a decision rule used in artificial intelligence, decision theory, game theory, statistics, and philosophy for minimizing the possible loss for a worst case (maximum loss) scenario.

In the context of Tic Tac Toe, the Minimax algorithm evaluates all possible moves by simulating future game states using a Tree data structure. It alternates between maximizing the AI's advantage (Max) and minimizing the opponent's advantage (Min). Each game state is assigned a score: -1 for a loss, 0 for a draw, and 1 for a win. By generating all possible board states, the algorithm selects the optimal move for the AI. This ensures that the chosen move maximizes the AI's chances of winning or, at the very least, minimizes the potential loss if the opponent also plays perfectly.

When both players play optimally, the game will always end in a draw.

  • C#
  • C# Winforms