Systems I built at Wego and Ejada Systems. Internal projects, so no
source code is public, but each card explains the problem, the design
and how the system works.
Wego, 2026 | Agentic automation, n8n, BigQuery, Slack, email
Declined Refunds Automation Agent
The problem
Keeping track of declined refunds meant collecting the records
from the portals by hand, summarizing them for the team and writing
a status email to each customer.
What I built
An agentic system on n8n that owns the whole process. The agent has
a tool for every step, and the process is triggered by chatting
with it, so an operator can ask it to run the full flow or only
one part of it and the agent decides which tools to call.
How it works
- Pulls the declined-refund data from the portals.
-
Stores the records in BigQuery, where they are available for
reporting.
- Posts a summary of the data to Slack for the team.
- Emails each customer the current status of their refund.
Outcome
One chat message replaces a manual chain of copying, summarizing
and follow-up emails, and the data lands in BigQuery as part of the
same run, so reporting needs no extra work.
n8n
LLM agent
Tool calling
BigQuery
Slack
Email automation
Python
Wego, 2026 | Agentic automation, n8n, BambooHR API, Google
Sheets, email
HR Contract Renewal Agent
The problem
HR had to watch contract end dates, chase every manager for a
renewal decision and then fill each renewal contract by hand.
What I built
A chatbot-style agent that HR triggers on request. It has access
to the BambooHR API, email, the Google Sheets that hold the
managers' decisions and the employee data, and the contract
template.
How it works
-
Queries the BambooHR API for employees whose contracts end
within the next 60 days.
-
For each of them, emails the employee's manager a form to record
the decision: renew or not.
- Reads the managers' responses from a Google Sheet.
-
For every renewal, pulls the employee's data from a second Google
Sheet and fills the contract template with it, producing the
renewal contract.
Outcome
Handles about 30 contracts per quarter and saves HR roughly 10
hours a month.
n8n
LLM agent
BambooHR API
Google Sheets
Email automation
Document templating
Wego, 2026 | n8n workflows, GitHub, LLMs
GitHub Pull Request Review Pipeline
The problem
Every pull request needed a first pass before a human reviewer
could get to it: what changed, where the risks are and what to
comment on.
What I built
A set of n8n workflows that listen for pull request creation on
GitHub and run an LLM review automatically.
How it works
-
A workflow is triggered when a pull request is created and fetches
its diff.
-
The diff is passed to three LLMs that analyze it, summarize the
change, look for bugs and write review comments.
-
The outputs are consolidated and posted back on the pull request
in GitHub.
Outcome
Reviewers open a pull request that already carries a summary, a
list of suspected bugs and draft comments, and can spend their time
on judgment instead of reading every line first.
n8n
GitHub webhooks and API
LLMs
Code review automation
Wego, 2026 | Chatbot agent, GitHub, Confluence
Confluence Documentation Agent
The problem
Technical documentation in Confluence drifted out of date as soon
as the code changed.
What I built
A chatbot with access to GitHub that keeps the Confluence
documentation in sync with the repository. The setup assumes one
Confluence page per module in the repo.
How it works
-
When a pull request is created, the agent reads the change and
identifies the module it belongs to.
-
It updates the Confluence page related to that module so the
documentation reflects the new code.
-
Because it is a chatbot, the team can also talk to it directly to
ask for documentation updates.
LLM agent
GitHub
Confluence
Documentation automation
Ejada Systems, 2025 | Reinforcement learning, Python, R&D
Reinforcement Learning Planner for a Water Desalination Plant
The problem
In a water desalination plant, the times at which valves open and
close decide how much chemical treatment is consumed and what the
operation costs. The R&D question was: when exactly should the
valves open and close, and when should the chemical treatment
change, to minimize cost and chemical use while keeping the water
output high?
What I built
A reinforcement learning planning system that learns that
schedule. I implemented the approach recommended in a published
deep reinforcement learning study on this problem
(reference paper).
How it works
-
Plant operation is treated as a sequential decision problem: at
each step the agent decides which valves to open or close and
which chemical treatment to apply.
-
The reward favors water output and penalizes operating cost and
chemical consumption, so the learned policy trades the two off.
-
The agent learns by trial and error: it tries schedules, observes
the resulting cost, chemical use and output, and improves its
policy over time.
Reinforcement learning
Python
Process optimization
Industrial R&D
Ejada Systems, 2025 | RAG, LangChain, FAISS, code embeddings,
FastAPI, Docker
COBOL Code Understanding RAG System
The problem
A bank's core system was written in COBOL across multiple
applications. Software architects needed to understand that legacy
codebase, ask questions about it and find related scripts without
reading everything line by line.
What I built
A Retrieval-Augmented Generation system over the whole codebase
with two main applications: a chatbot that answers questions about
the code in natural language, and similarity search that finds the
scripts related to a given one. The project also produced
auto-generated system documentation and an MVP re-implementation in
Java and Python.
How it works
-
Context chunking: each function and code block
becomes its own chunk, and an LLM pass captures how every chunk
relates to the rest of the script, so a retrieved chunk carries
its context instead of being an isolated snippet.
-
Code embeddings: the chunks are embedded with a
code-specific embedding model rather than a general text
embedder, so retrieval follows code semantics.
-
Vector store: embeddings are indexed in FAISS,
Meta's vector search library, deployed on the company's own
server, with a graph database holding the relationships between
code units.
-
Applications: the chatbot retrieves the relevant
chunks and answers the architect's question, and the similarity
service compares scripts to surface related code.
RAG
LangChain
FAISS
Code embeddings
Context chunking
Graph database
FastAPI
Streamlit
Docker
Ejada Systems, 2025 | LLM pipeline, RAG, NER, test generation
AI Test Generation Framework (Closed-Box Testing)
The problem
Test cases are usually written after the code exists. The goal here
was to generate them before implementation, from the business
documents alone (SRS and BRD), which makes it closed-box testing.
What I built
A multi-stage pipeline that combines named entity recognition,
several RAG systems and LLM modules, each responsible for one step,
plus an evaluation stage that checks the result against the
documents.
How it works
-
Variable extraction: NER identifies the variables
mentioned in the SRS and BRD.
-
Constraint extraction: a RAG system reads the
explanations around each variable and derives its constraints,
such as the number of characters, allowed ranges and formats.
-
Test path generation: a second RAG system takes
the variables, constraints and documents and generates test
paths, each a graph of steps. Positive paths lead to a successful
outcome; negative paths violate a constraint and lead to a
failure.
-
Data generation: an LLM takes the variables and
their constraints and generates positive and negative data for
each path, turning paths into concrete test cases.
-
Coverage evaluation: a separate LLM-based
evaluator compares the generated test cases with the business
documents to make sure coverage reaches at least 95%.
-
After implementation: the framework also
generates unit test code for the system's modules.
LLM pipeline
RAG
Named entity recognition
Test generation
LLM evaluation
Python