Projects

2025

blaqat.net (this site)

Personal

Sep 2025 - Ongoing

My personal website, built with Astro and Svelte, showcasing my programming and music projects. It's designed to be feel somewhat playful while also being responsive.

The main challenges faced in making this site (other than learning astro & svelte) was in designing the music page to both be functional and visually appealing with the temporary limitation of using 'cards' as the main interactive element. So exploring different ways to show the state of the music player between single songs and collections was a fun challenge.

Astro icon AstroSvelte icon SvelteTailwind icon Tailwind +1

FiTR Skills Career Roadmaps

School

Mar 2025 - Aug 2025

This was my capstone project. Collaborated with 6 other SWEN seniors on the development of a web based job board platform modeled after dating apps, enabling recruiters and candidates to connect based on skills and location to streamline the job-search to first-interview process. Employed Agile (RAD) process methodology for project planning and iteration including documentation/User Stories, models and mockups, weekly design review/approval check ins, tri-weekly standups, solution development, and acceptance tests.

Next.js icon Next.jsSupabase icon SupabaseTailwind icon Tailwind +2

2024

Rust Are We Secure Yet?

Work

Aug 2024 - Dec 2024

Researched on code vulnerabilities and how much the Rust language mitigates them by default to aid the writing of a related white paper. Categorized and analyzed CWEs based on Rust’s built-in protections. Developed a set of Python scripts and a Zola based static site to calculate, output, update, and finally display vulnerability metrics efficiently.

Python icon PythonPostgreSQL icon PostgreSQL Zola +2

RIT Senior Project Portal

Work

Jun 2024 - Oct 2024

Planned, Designed, and Implemented a Peer Evaluation feature inside of a live Project Development Portal to simplify the processes taken by Admins, Coaches, and Students by making the feature in-house instead of relying on third party solutions. Acted as a facilitator and team planner as well as managing project actions via GitHub Projects.

React icon ReactSqlite3 icon Sqlite3 Semantic UI

Code Editor Theme Generator

Personal

Jun 2024 - Paused

A json and toml preprocessor tool that allows users to create a theme language that can be used to create and generate themes for multiple code editors and IDEs from a single source of truth. Currently supports Zed, VSCode, and Textmate. The tool has custom syntax support recursive variables, self referring variables, HSL HSV RGB and HEX modifiable colors e.g. $color::lightness+10. This tool was used to create many themes for zed found here: https://github.com/blaqat/zed-themes

Rust icon RustPython icon Python TOML +1

Bank Simulation

School

Mar 2024 - Apr 2024

Developed a FreeRTOS-based real-time simulation of a bank environment, leveraging a multifunction shield on a STM32 microcontroller for displaying and managing customer queues and teller operations on an LCD. Implemented a multithreaded system using FreeRTOS tasks, queues, and semaphore handlers for dynamic customer queuing and secure data handling.


Project Report

Analysis / Design

  • This project aims to use a multithreaded Real Time Operating System to simulate the workflow of a typical banking environment.
  • I used FreeRTOS and its Task, Queue, and Semaphore handler to run the project using multiple threads. A Queue provides a thread-safe system for customer generation, Tasks handle spawning new threads, and Semaphores create mutexes allowing for safe modification operations such as printing to USART or modifying the global statistics struct.
  • In each Task, when the Task completes its current operation, it yields to the OS, which allows the system to context switch to the next preempted Task.

Project Results

  • The system successfully runs the simulation in a multithreaded manner with the correct breaks and pauses for customer or teller downtime, and 0 idle hooks read.

Challenges and Learnings

  • Learning a new way to run the project:
    • Previously, I was using PlatformIO. After many struggles and hardships, I decided to drop that setup and try to figure out how to do it in a more STM32 idiomatic way. I now use STM32’s CLI products to run and build the project, with slight modifications to the generated Makefile MX creates to ensure everything is built correctly.
  • Learning how to do delays in Tasks correctly:
    • At first, my intuition was to just have an infinite loop that doesn’t run if a time condition hasn’t been met, but this was blocking and holding the Tasks.
    • Later, I learned that using Task delay methods like TaskDelay pauses the Task for the exact amount of time and does not hold the Task up. This lets the system switch to a different Task. This was a lot easier to implement and much more functional.
C icon C STM32 FreeRTOS

2023

Fishbowl AI Assistant

Work

Sep 2023 - Dec 2023

Engaged in customer discovery to identify market needs, testing the viability and user interaction level of AI and computer vision integrated solutions, enabling further research and potential development for the client. Used Azure and OpenAI services to build a MVP in React/Tailwind/TS, managed communications via a Flask server, and enhanced digital experiences with Unity through a websocket client and blender animations.

Python icon PythonFlask icon FlaskReact icon React +2

Sonata

Personal

Dec 2023 - Ongoing

a discord bot thats just like me :)

Developed a Discord bot with natural language processing for text and voice interactions, featuring a flexible AI manager that supports integration with multiple AI models (e.g., OpenAI, Perplexity, Claude), a custom generic function calling system for web searches and multimedia retrieval, and a modular plugin system for additional add-ons features.

A major plugin I created was a chat history and personalized memory management system with encrypted serialized files, allowing the bot to retain context, manage conversation threads, note feelings about users, and persist data across sessions and servers for seamless user experience.

Note: This project existed to test the early AI tooling (2023), a lot of the tools have evolved to have features I made for the bot directly built in (e.g function calling)

Python icon PythonDiscord.py icon Discord.py Cloudbased LLM Provider APIs

Forth Evaluator

Personal

Jun 2023 - Jun 2023

Using Rust, I created a program that can understand and run a part of the Forth programming language, which works with an interrior stack of data in memory. I also made a Lexer that turns input strings into tokens, which are easier to process and execute.

Project Summary

This project involves implementing a basic evaluator for a small subset of the stack-based programming language, Forth. The evaluator should support the following words:

  • +, -, *, / (integer arithmetic)
  • DUP, DROP, SWAP, OVER (stack manipulation)

It should also support defining new words using the customary syntax: : word-name definition ;.

Initial Attempt

The initial approach involved binding closures into HashMap, which led to complications with Rust. Additionally, there were unnecessary macros that, while aesthetically pleasing, did not contribute to the functionality of the code. Here's a snippet of the initial code:

type Operation = Rc<dyn Fn(&mut Forth, Option<&str>) -> Result>;
type Operations = HashMap<String, Operation>;
// - - - //
install!(new,
  "DROP" => |forth: &mut Forth, _| {
      let stack = &mut forth.eval_stack;
      match stack.pop() {
          Some(_) => Ok(()),
          None => Err(Error::StackUnderflow),
      }
  };

  "DUP" => |forth: &mut Forth, _| {
      let stack = &mut forth.eval_stack;
      match stack.last() {
          Some(last) => {stack.push(*last); Ok(())},
          None => Err(Error::StackUnderflow),
      }
  };

  "SWAP" => |forth: &mut Forth, _| {
      let stack = &mut forth.eval_stack;
      let a = stack.pop();
      let b = stack.pop();
      match (a, b) {
          (Some(first), Some(last)) => {stack.extend([last, first]); Ok(())},
          _ => Err(Error::StackUnderflow)
      }
  }
// . . .

The code above was intended to perform operations such as DROP, DUP, and SWAP. However, the implementation was not as efficient as expected.

Example

Here's an example of how the code was used:

let x = "4";
install!(n, "foo" => |forth: &mut Forth, _| {
    forth.call("_VAL", Some(x))
});
call!(n, "foo");

replace!(n, "foo" -> ("DUP", "")("_VAL", "1")("+", ""));
call!(n, "foo");

call!(n, "foo");

replace!(n, "foo" -> ("foo", "")("_VAL", "1")("+", ""));
call!(n, "foo");

dbg!(&n.eval_stack);

Output:

stack = [4, 5, 5, 6]


Revised Approach

The revised approach involved using a tokenizer instead of binding functions. This approach made the base functions just operations that the stack can perform on itself. Here's a snippet of the revised code:

type Tokens = Vec<TokenTypes>;
type Identifiers = HashMap<String, Tokens>;
// - - - //
impl StackOperations for Stack {
  fn _dupl(&mut self) -> Result {
      if let Some(&num) = self.iter().last() {
          self.push(num);
          Ok(())
      } else {
          Err(Error::StackUnderflow)
      }
  }

  fn _drop(&mut self) -> Result {
      self.pop().map_or(Err(Error::StackUnderflow), |_| Ok(()))
  }

  fn _swap(&mut self) -> Result {
      let stack_len = self.len();

      if stack_len < 2 {
          Err(Error::StackUnderflow)
      } else {
          self.swap(stack_len - 2, stack_len - 1);
          Ok(())
      }
  }

Example

The revised approach simplifies the process by reading a single string and converting it to tokens. When a function is called, it is flattened down, replacing all identifiers with either operations or values.

let x: 132 = 4;
let install_foo: String = format!("
: foo {x} ; 
foo
");
let replace_foo = "
: foo foo 1 + ;
foo foo foo foo
"
self.eval(&install_foo, replace_foo)?;

Output:

stack = [4, 5, 6, 7, 8]


Tokenizer Conversion

The tokenizer conversion was a significant part of the revised approach. Instead of binding functions, which led to complications, the revised approach involved binding a list of tokenized instructions. This made the base functions just operations that the stack could perform on itself.

The tokenizer reads a single string and converts it into tokens. For example, for the replace_foo function, the tokenizer reads it as follows:

&tokens = [
	OpenDef,
	Ident(
	"foo",
	),
	Ident(
	"foo",
	),
	Val(
	1,
	),
	Ident(
	"+",
	),
	CloseDef,
	Ident(
	"foo",
	),
	Ident(
	"foo",
	),
	Ident(
	"foo",
	),
	Ident(
	"foo",
	),
]

The tokenizer then replaces foo in the identifiers map:

&self.idents = {
    "*": [
        Op(
            "_mult",
        ),
    ],
    "foo": [
        Ident(
            "foo",
        ),
        Val(
            1,
        ),
        Ident(
            "+",
        ),
    ],
...

When foo is called again, the function is flattened down, replacing all identifiers with either operations or values:

"foo":[
    Val(
        4,
    ),
    Val(
        1,
    ),
    Op(
        "_add",
    )
]

The tokenizer conversion simplifies the process by breaking down the function into a series of tokens. This makes it easier to identify and perform operations, leading to a more efficient and less complicated solution.

Conclusion

The revised approach proved to be more efficient and less complicated than the initial approach. It simplified the process by using a tokenizer and made the base functions just operations that the stack can perform on itself. This project serves as a good example of how a change in approach can lead to a more efficient and less complicated solution.

Rust icon Rust

Microcontroller Midi Player

School

Feb 2023 - Apr 2023

A Midi Player in C lang, which can interpret midi files and play songs through an STM32 microcontroller using Digital to Analog Conversion. I have also incorporated key controls for the player, such as play, pause, stop, volume control, and sound wave changing. The player has a dual-mode functionality that allows it to receive inputs from both local and terminal sources. Through this project, I have enhanced my skills in microcontroller interfaces ( including UART, GPIO, Interrupts, and Systick) and bit operations

C icon C STM32 DAC

2021

Webcheckers

School

Sep 2021 - Dec 2021

Collaborated with 3 other students to develop a web app of Anglo-American checkers using Java, Javascript, Spark, and Freemarker for the code base and web server connections Utilizing Agile (OpenUp) framework to plan the entire development process of the web app. Writing documentation and User Stories, coding solutions for solution tasks, and performing acceptance tests.

Java icon JavaJavaScript icon JavaScript Spark +1

Beepbox Bot

Personal

Aug 2020 - Apr 2021

I had been working on a project that involves creating a Discord bot using node.js. The bot can take a song link from https://www.beepbox.co/ or a shortened link that redirects to it, and convert it into a ReadableStream that can be played in Discord voice chats. The bot also has a queue system that shows the songs that are currently playing or waiting to be played. Another feature of the bot is that it can search for songs from Google Sheets that contain song submissions from users.

The bot uses the Google Sheets API to parse through the sheets and find the links by Title, Artist Name, or other criteria. The bot then displays the results in a vertical list format for the user to choose from. Some of the challenges I faced while developing this project were reverse engineering existing code, parsing user input commands, and pulling data from websites with HTTP requests. I learned a lot from this project and I am proud of the outcome.

Node.js icon Node.jsDiscord.js icon Discord.jsGoogle Sheets API icon Google Sheets API +1